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  }