From e2b3c083aa465cb538d7123bb5de2d850677780a Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 21 Jan 2020 02:46:58 -0800 Subject: [PATCH] fix: close and drain the response body always (#8847) --- cmd/config/identity/openid/jwt.go | 1 + cmd/gateway-common.go | 5 ++++- cmd/logger/target/http/http.go | 1 + cmd/prepare-storage.go | 1 + cmd/rest/client.go | 1 + cmd/web-handlers.go | 1 + pkg/event/target/webhook.go | 5 ++--- pkg/madmin/api.go | 3 +++ pkg/net/url.go | 3 +++ 9 files changed, 17 insertions(+), 4 deletions(-) diff --git a/cmd/config/identity/openid/jwt.go b/cmd/config/identity/openid/jwt.go index de2ec4603..6d822501b 100644 --- a/cmd/config/identity/openid/jwt.go +++ b/cmd/config/identity/openid/jwt.go @@ -251,6 +251,7 @@ func parseDiscoveryDoc(u *xnet.URL, transport *http.Transport, closeRespFn func( } resp, err := clnt.Do(req) if err != nil { + clnt.CloseIdleConnections() return d, err } defer closeRespFn(resp.Body) diff --git a/cmd/gateway-common.go b/cmd/gateway-common.go index af91941ca..378bee23d 100644 --- a/cmd/gateway-common.go +++ b/cmd/gateway-common.go @@ -304,9 +304,12 @@ func IsBackendOnline(ctx context.Context, clnt *http.Client, urlStr string) bool if err != nil { return false } - if _, err = clnt.Do(req); err != nil { + resp, err := clnt.Do(req) + if err != nil { + clnt.CloseIdleConnections() return !xnet.IsNetworkOrHostDown(err) } + xhttp.DrainBody(resp.Body) return true } diff --git a/cmd/logger/target/http/http.go b/cmd/logger/target/http/http.go index e931054cb..787461a42 100644 --- a/cmd/logger/target/http/http.go +++ b/cmd/logger/target/http/http.go @@ -66,6 +66,7 @@ func (h *Target) startHTTPLogger() { resp, err := h.client.Do(req) if err != nil { + h.client.CloseIdleConnections() continue } diff --git a/cmd/prepare-storage.go b/cmd/prepare-storage.go index 7aac82e13..a1f65a60e 100644 --- a/cmd/prepare-storage.go +++ b/cmd/prepare-storage.go @@ -207,6 +207,7 @@ func IsServerResolvable(endpoint Endpoint) error { resp, err := httpClient.Do(req) if err != nil { + httpClient.CloseIdleConnections() return err } defer xhttp.DrainBody(resp.Body) diff --git a/cmd/rest/client.go b/cmd/rest/client.go index 70d4ca89f..9a0fd51d9 100644 --- a/cmd/rest/client.go +++ b/cmd/rest/client.go @@ -69,6 +69,7 @@ func (c *Client) CallWithContext(ctx context.Context, method string, values url. } resp, err := c.httpClient.Do(req) if err != nil { + c.httpClient.CloseIdleConnections() return nil, &NetworkError{err} } diff --git a/cmd/web-handlers.go b/cmd/web-handlers.go index 2858a0a2f..506ac0df0 100644 --- a/cmd/web-handlers.go +++ b/cmd/web-handlers.go @@ -2029,6 +2029,7 @@ func (web *webAPIHandlers) LoginSTS(r *http.Request, args *LoginSTSArgs, reply * resp, err := clnt.Do(req) if err != nil { + clnt.CloseIdleConnections() return toJSONError(ctx, err) } defer xhttp.DrainBody(resp.Body) diff --git a/pkg/event/target/webhook.go b/pkg/event/target/webhook.go index 02dbc2e84..5a6479b84 100644 --- a/pkg/event/target/webhook.go +++ b/pkg/event/target/webhook.go @@ -142,15 +142,14 @@ func (target *WebhookTarget) send(eventData event.Event) error { resp, err := target.httpClient.Do(req) if err != nil { + target.Close() return err } - defer resp.Body.Close() io.Copy(ioutil.Discard, resp.Body) if resp.StatusCode < 200 || resp.StatusCode > 299 { - // close any idle connections upon any error. - target.httpClient.CloseIdleConnections() + target.Close() return fmt.Errorf("sending event failed with %v", resp.Status) } diff --git a/pkg/madmin/api.go b/pkg/madmin/api.go index 358144d2b..49922de48 100644 --- a/pkg/madmin/api.go +++ b/pkg/madmin/api.go @@ -270,6 +270,9 @@ func (adm AdminClient) do(req *http.Request) (*http.Response, error) { for { resp, err = adm.httpClient.Do(req) if err != nil { + // Close idle connections upon error. + adm.httpClient.CloseIdleConnections() + // Handle this specifically for now until future Golang // versions fix this issue properly. urlErr, ok := err.(*url.Error) diff --git a/pkg/net/url.go b/pkg/net/url.go index d781fd0dc..bd2e25343 100644 --- a/pkg/net/url.go +++ b/pkg/net/url.go @@ -20,6 +20,8 @@ import ( "encoding/json" "errors" "fmt" + "io" + "io/ioutil" "net" "net/http" "net/url" @@ -100,6 +102,7 @@ func (u URL) DialHTTP() error { if err != nil { return err } + io.Copy(ioutil.Discard, resp.Body) resp.Body.Close() return nil }