Source File
media.go
Belonging Package
google.golang.org/api/internal/gensupport
package gensupport
import (
)
const sniffBuffSize = 512
func ( io.Reader) *contentSniffer {
return &contentSniffer{r: }
}
.start, .err = ioutil.ReadAll(io.LimitReader(.r, sniffBuffSize))
if != "" {
return ,
}
if , := .(googleapi.ContentTyper); {
return , .ContentType()
}
:= newContentSniffer()
if , := .ContentType(); {
return ,
return , ""
}
type typeReader struct {
io.Reader
typ string
}
func ( []typeReader, string) *multipartReader {
:= &multipartReader{pipeOpen: true}
var *io.PipeWriter
.pr, = io.Pipe()
:= multipart.NewWriter()
if != "" {
.SetBoundary()
}
.ctype = "multipart/related; boundary=" + .Boundary()
go func() {
for , := range {
, := .CreatePart(typeHeader(.typ))
if != nil {
.Close()
.CloseWithError(fmt.Errorf("googleapi: CreatePart failed: %v", ))
return
}
_, = io.Copy(, .Reader)
if != nil {
.Close()
.CloseWithError(fmt.Errorf("googleapi: Copy failed: %v", ))
return
}
}
.Close()
.Close()
}()
return
}
func ( *multipartReader) ( []byte) ( int, error) {
return .pr.Read()
}
func ( *multipartReader) () error {
.mu.Lock()
if !.pipeOpen {
.mu.Unlock()
return nil
}
.pipeOpen = false
.mu.Unlock()
return .pr.Close()
}
func ( io.Reader, string, io.Reader, string) (io.ReadCloser, string) {
return combineBodyMedia(, , , , "")
}
func ( io.Reader, string, io.Reader, , string) (io.ReadCloser, string) {
:= newMultipartReader([]typeReader{
{, },
{, },
}, )
return , .ctype
}
func ( string) textproto.MIMEHeader {
:= make(textproto.MIMEHeader)
if != "" {
.Set("Content-Type", )
}
return
}
func ( io.Reader, int) ( io.Reader, *MediaBuffer, bool) {
if == 0 { // do not chunk
return , nil, true
}
= NewMediaBuffer(, )
media io.Reader
buffer *MediaBuffer
singleChunk bool
mType string
size int64 // mediaSize, if known. Used only for calls to progressUpdater_.
progressUpdater googleapi.ProgressUpdater
}
func ( io.Reader, []googleapi.MediaOption) *MediaInfo {
:= &MediaInfo{}
:= googleapi.ProcessMediaOptions()
if !.ForceEmptyContentType {
, .mType = DetermineContentType(, .ContentType)
}
.media, .buffer, .singleChunk = PrepareUpload(, .ChunkSize)
return
}
func ( io.ReaderAt, int64, string) *MediaInfo {
:= ReaderAtToReader(, )
, := DetermineContentType(, )
return &MediaInfo{
size: ,
mType: ,
buffer: NewMediaBuffer(, googleapi.DefaultUploadChunkSize),
media: nil,
singleChunk: false,
}
}
func ( *MediaInfo) ( googleapi.ProgressUpdater) {
if != nil {
.progressUpdater =
}
}
func ( *MediaInfo) () string {
if .singleChunk {
return "multipart"
}
return "resumable"
}
= .media
, _, _, _ = .buffer.Chunk()
}
if != nil {
:= readerFunc()
:= readerFunc()
, := CombineBodyMedia(, "application/json", , .mType)
:= []io.Closer{
,
}
if != nil && != nil {
= func() (io.ReadCloser, error) {
:= ioutil.NopCloser(())
:= ioutil.NopCloser(())
var string
if , , := mime.ParseMediaType(); == nil {
= ["boundary"]
}
, := combineBodyMedia(, "application/json", , .mType, )
= append(, )
return , nil
}
}
= func() {
for , := range {
_ = .Close()
}
}
.Set("Content-Type", )
=
}
if .buffer != nil && .mType != "" && !.singleChunk {
.Set("X-Upload-Content-Type", .mType)
}
return , ,
}
func ( io.Reader) func() io.Reader {
switch r := .(type) {
case *bytes.Buffer:
:= .Bytes()
return func() io.Reader { return bytes.NewReader() }
case *bytes.Reader:
:= *
return func() io.Reader { := ; return & }
case *strings.Reader:
:= *
return func() io.Reader { := ; return & }
default:
return nil
}
}
func ( *MediaInfo) ( string) *ResumableUpload {
if == nil || .singleChunk {
return nil
}
return &ResumableUpload{
URI: ,
Media: .buffer,
MediaType: .mType,
Callback: func( int64) {
if .progressUpdater != nil {
.progressUpdater(, .size)
}
},
}
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |