THRIFT-3277 THttpClient leaks connections if it's used for multiple requests
Client: Go
Patch: Prashant Varanasi <prashant@uber.com>
This closes #571
diff --git a/lib/go/thrift/http_client.go b/lib/go/thrift/http_client.go
index 0f6e704..bf0ed62 100644
--- a/lib/go/thrift/http_client.go
+++ b/lib/go/thrift/http_client.go
@@ -129,17 +129,22 @@
return p.response != nil || p.requestBuffer != nil
}
-func (p *THttpClient) Close() error {
+func (p *THttpClient) closeResponse() error {
+ var err error
if p.response != nil && p.response.Body != nil {
- err := p.response.Body.Close()
- p.response = nil
- return err
+ err = p.response.Body.Close()
}
+
+ p.response = nil
+ return err
+}
+
+func (p *THttpClient) Close() error {
if p.requestBuffer != nil {
p.requestBuffer.Reset()
p.requestBuffer = nil
}
- return nil
+ return p.closeResponse()
}
func (p *THttpClient) Read(buf []byte) (int, error) {
@@ -171,6 +176,9 @@
}
func (p *THttpClient) Flush() error {
+ // Close any previous response body to avoid leaking connections.
+ p.closeResponse()
+
client := &http.Client{}
req, err := http.NewRequest("POST", p.url.String(), p.requestBuffer)
if err != nil {