Fix bug in setting request body

Go documentation says
`Use of GetBody still requires setting Body`.
This change ensures the body is always set in
addition to GetBody. This fixes a bug where
sometimes the body is nil.

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
Derek McGowan 2019-07-18 10:52:59 -07:00
parent c90a3d4932
commit 518be1cb07
No known key found for this signature in database
GPG Key ID: F58C5D0A4405ACDB
2 changed files with 13 additions and 1 deletions

View File

@ -230,9 +230,16 @@ func (p dockerPusher) Push(ctx context.Context, desc ocispec.Descriptor) (conten
pr, pw := io.Pipe() pr, pw := io.Pipe()
respC := make(chan *http.Response, 1) respC := make(chan *http.Response, 1)
body := ioutil.NopCloser(pr)
req.body = func() (io.ReadCloser, error) { req.body = func() (io.ReadCloser, error) {
return ioutil.NopCloser(pr), nil if body == nil {
return nil, errors.New("cannot reuse body, request must be retried")
}
// Only use the body once since pipe cannot be seeked
ob := body
body = nil
return ob, nil
} }
req.size = desc.Size req.size = desc.Size

View File

@ -495,6 +495,11 @@ func (r *request) do(ctx context.Context) (*http.Response, error) {
} }
req.Header = r.header req.Header = r.header
if r.body != nil { if r.body != nil {
body, err := r.body()
if err != nil {
return nil, err
}
req.Body = body
req.GetBody = r.body req.GetBody = r.body
if r.size > 0 { if r.size > 0 {
req.ContentLength = r.size req.ContentLength = r.size