From 81bb7bdddffe5d0e3b5966df9661766736295bfa Mon Sep 17 00:00:00 2001 From: Felix Abecassis Date: Fri, 26 May 2017 18:02:31 -0700 Subject: [PATCH] Do not reuse a http.Request after a failure in callWithRetry Closes: #33412 Signed-off-by: Felix Abecassis Upstream-commit: 62871ef2fa52b0a2e426c30f36d35a9ba1e92fac Component: engine --- components/engine/pkg/plugins/client.go | 10 +++++----- components/engine/pkg/plugins/client_test.go | 21 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/components/engine/pkg/plugins/client.go b/components/engine/pkg/plugins/client.go index e8e730eb58..84103c7ae7 100644 --- a/components/engine/pkg/plugins/client.go +++ b/components/engine/pkg/plugins/client.go @@ -129,15 +129,15 @@ func (c *Client) SendFile(serviceMethod string, data io.Reader, ret interface{}) } func (c *Client) callWithRetry(serviceMethod string, data io.Reader, retry bool) (io.ReadCloser, error) { - req, err := c.requestFactory.NewRequest(serviceMethod, data) - if err != nil { - return nil, err - } - var retries int start := time.Now() for { + req, err := c.requestFactory.NewRequest(serviceMethod, data) + if err != nil { + return nil, err + } + resp, err := c.http.Do(req) if err != nil { if !retry { diff --git a/components/engine/pkg/plugins/client_test.go b/components/engine/pkg/plugins/client_test.go index 9faad86a15..fc583fe0c2 100644 --- a/components/engine/pkg/plugins/client_test.go +++ b/components/engine/pkg/plugins/client_test.go @@ -6,6 +6,7 @@ import ( "net/http/httptest" "net/url" "reflect" + "strings" "testing" "time" @@ -38,6 +39,26 @@ func TestFailedConnection(t *testing.T) { } } +func TestFailOnce(t *testing.T) { + addr := setupRemotePluginServer() + defer teardownRemotePluginServer() + + failed := false + mux.HandleFunc("/Test.FailOnce", func(w http.ResponseWriter, r *http.Request) { + if !failed { + failed = true + panic("Plugin not ready") + } + }) + + c, _ := NewClient(addr, &tlsconfig.Options{InsecureSkipVerify: true}) + b := strings.NewReader("body") + _, err := c.callWithRetry("Test.FailOnce", b, true) + if err != nil { + t.Fatal(err) + } +} + func TestEchoInputOutput(t *testing.T) { addr := setupRemotePluginServer() defer teardownRemotePluginServer()