From eeb04e6826db551386c8424160560a3e4447461c Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Sat, 14 May 2016 14:06:57 -0400 Subject: [PATCH] Reset input buffer on retry Retries were previously sending empty bodies to the server. --- pkg/client/restclient/request.go | 15 ++++++++++++--- pkg/client/restclient/request_test.go | 7 +++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/pkg/client/restclient/request.go b/pkg/client/restclient/request.go index a063f0898d8..9fd3f0ddb09 100644 --- a/pkg/client/restclient/request.go +++ b/pkg/client/restclient/request.go @@ -539,10 +539,10 @@ func (r *Request) Body(obj interface{}) *Request { return r } glog.V(8).Infof("Request Body: %s", string(data)) - r.body = bytes.NewBuffer(data) + r.body = bytes.NewReader(data) case []byte: glog.V(8).Infof("Request Body: %s", string(t)) - r.body = bytes.NewBuffer(t) + r.body = bytes.NewReader(t) case io.Reader: r.body = t case runtime.Object: @@ -556,7 +556,7 @@ func (r *Request) Body(obj interface{}) *Request { return r } glog.V(8).Infof("Request Body: %s", string(data)) - r.body = bytes.NewBuffer(data) + r.body = bytes.NewReader(data) r.SetHeader("Content-Type", r.content.ContentType) default: r.err = fmt.Errorf("unknown type used for body: %+v", obj) @@ -823,6 +823,15 @@ func (r *Request) request(fn func(*http.Request, *http.Response)) error { retries++ if seconds, wait := checkWait(resp); wait && retries < maxRetries { + if seeker, ok := r.body.(io.Seeker); ok && r.body != nil { + _, err := seeker.Seek(0, 0) + if err != nil { + glog.V(4).Infof("Could not retry request, can't Seek() back to beginning of body for %T", r.body) + fn(req, resp) + return true + } + } + glog.V(4).Infof("Got a Retry-After %s response for attempt %d to %v", seconds, retries, url) r.backoffMgr.Sleep(time.Duration(seconds) * time.Second) return false diff --git a/pkg/client/restclient/request_test.go b/pkg/client/restclient/request_test.go index 236d9eef8ba..e770a1ca083 100644 --- a/pkg/client/restclient/request_test.go +++ b/pkg/client/restclient/request_test.go @@ -874,6 +874,13 @@ func TestCheckRetryHandles429And5xx(t *testing.T) { count := 0 ch := make(chan struct{}) testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + data, err := ioutil.ReadAll(req.Body) + if err != nil { + t.Fatalf("unable to read request body: %v", err) + } + if !bytes.Equal(data, []byte(strings.Repeat("abcd", 1000))) { + t.Fatalf("retry did not send a complete body: %s", data) + } t.Logf("attempt %d", count) if count >= 4 { w.WriteHeader(http.StatusOK)