From 518be1cb070551e5cd8e69f9cea33f7abd5cfdca Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Thu, 18 Jul 2019 10:52:59 -0700 Subject: [PATCH] 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 --- remotes/docker/pusher.go | 9 ++++++++- remotes/docker/resolver.go | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/remotes/docker/pusher.go b/remotes/docker/pusher.go index f7787a019..3e65832b8 100644 --- a/remotes/docker/pusher.go +++ b/remotes/docker/pusher.go @@ -230,9 +230,16 @@ func (p dockerPusher) Push(ctx context.Context, desc ocispec.Descriptor) (conten pr, pw := io.Pipe() respC := make(chan *http.Response, 1) + body := ioutil.NopCloser(pr) 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 diff --git a/remotes/docker/resolver.go b/remotes/docker/resolver.go index d7b8627ce..7eacd08af 100644 --- a/remotes/docker/resolver.go +++ b/remotes/docker/resolver.go @@ -495,6 +495,11 @@ func (r *request) do(ctx context.Context) (*http.Response, error) { } req.Header = r.header if r.body != nil { + body, err := r.body() + if err != nil { + return nil, err + } + req.Body = body req.GetBody = r.body if r.size > 0 { req.ContentLength = r.size