github.com/jenspinney/cli@v6.42.1-0.20190207184520-7450c600020e+incompatible/api/cloudcontroller/buildpacks/upload.go (about) 1 package buildpacks 2 3 import ( 4 "bytes" 5 "code.cloudfoundry.org/cli/api/cloudcontroller" 6 "io" 7 "mime/multipart" 8 "path/filepath" 9 ) 10 11 func CalculateRequestSize(buildpackSize int64, bpPath string, fieldName string) (int64, error) { 12 body := &bytes.Buffer{} 13 form := multipart.NewWriter(body) 14 15 bpFileName := filepath.Base(bpPath) 16 17 _, err := form.CreateFormFile(fieldName, bpFileName) 18 if err != nil { 19 return 0, err 20 } 21 22 err = form.Close() 23 if err != nil { 24 return 0, err 25 } 26 27 return int64(body.Len()) + buildpackSize, nil 28 } 29 30 func CreateMultipartBodyAndHeader(buildpack io.Reader, bpPath string, fieldName string) (string, io.ReadSeeker, <-chan error) { 31 writerOutput, writerInput := cloudcontroller.NewPipeBomb() 32 33 form := multipart.NewWriter(writerInput) 34 35 writeErrors := make(chan error) 36 37 go func() { 38 defer close(writeErrors) 39 defer writerInput.Close() 40 41 bpFileName := filepath.Base(bpPath) 42 writer, err := form.CreateFormFile(fieldName, bpFileName) 43 if err != nil { 44 writeErrors <- err 45 return 46 } 47 48 _, err = io.Copy(writer, buildpack) 49 if err != nil { 50 writeErrors <- err 51 return 52 } 53 54 err = form.Close() 55 if err != nil { 56 writeErrors <- err 57 } 58 }() 59 60 return form.FormDataContentType(), writerOutput, writeErrors 61 }