I have the following golang code which when invoked inside of it's own webserver, appears to not close the socket. This leads to a "too many open files" message. I have read all about the Body.Close() stuff and as you can see it's in there, yet it still acts poorly.
What else am I missing about connection handling?
func sendRequest(ctx context.Context, endpoint, uri string, data []byte) (int, []byte) {
reqID := requestIDFromContext(ctx)
// The servers have internally signed certs which are technically "not trusted"
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
insecureclient := &http.Client{Transport: tr}
// Build the correct URL
url := endpoint + uri
requestbody := bytes.NewBuffer(data)
// Send our request and check for errors.
fmt.Println(reqID, "Forwarding request to URL:", url)
resp, err := insecureclient.Post(url, "application/json", requestbody)
if err != nil {
// This is where things happen when the connect goes bad
fmt.Println(reqID, err)
return 500, []byte("{}")
//return handleConnectionError(ctx, data, uri)
}
defer resp.Body.Close()
// Read response
responsebody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(reqID, err)
responsebody = []byte("{}")
}
return resp.StatusCode, responsebody
}
FWIW, altering the code to use a 'http.NewRequest' and then an 'insecureclient.Do' along with a 'Request.Close = true' seems to fix the problem.