code: func (client *Client) UploadDroplet(appGUID string, droplet io.Reader, dropletLength int64) (Job, Warnings, error) {
  	contentLength, err := client.calculateDropletRequestSize(dropletLength)
  	if err != nil {
  		return Job{}, nil, err
  	}
  
  	contentType, body, writeErrors := client.createMultipartBodyAndHeaderForDroplet(droplet)
  
  	request, err := client.newHTTPRequest(requestOptions{
  		RequestName: internal.PutDropletRequest,
  		URIParams:   Params{"app_guid": appGUID},
  		Body:        body,
  	})
  	if err != nil {
  		return Job{}, nil, err
  	}
  
  	request.Header.Set("Content-Type", contentType)
  	request.ContentLength = contentLength
  
  	return client.uploadAsynchronously(request, writeErrors)
  }
docs: // UploadDroplet defines and uploads a previously staged droplet that an
  // application will run, using a multipart PUT request. The uploaded file
  // should be a gzipped tar file.