Closed
Description
go version go1.10.1 darwin/amd64
darwin, amd64
package main
import (
"fmt"
"net/http"
"net/url"
"io/ioutil"
"os"
"crypto/tls"
)
func main() {
for {
test_func()
}
}
func test_func() {
u, _ := url.ParseRequestURI("https://golang.org")
urlStr := fmt.Sprintf("%v", u)
req, _ := http.NewRequest("GET", urlStr, nil)
tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
cli := &http.Client{Transport: tr}
response, err := cli.Do(req)
if err != nil {
fmt.Printf("%s", err)
os.Exit(1)
}
defer response.Body.Close()
_, err = ioutil.ReadAll(response.Body)
if err != nil {
fmt.Printf("%s", err)
os.Exit(1)
}
}
Above program results in a large number (observed by checking lsof -p <process_id>
) of
TCP connections in established state, eventually running out of file descriptors.
I see this issue only when I use TLS and do a ioutil.ReadAll.
Skipping either one of them results in a single established TCP connection.
The issue also goes away If I do req.Close = true
after req, _ := http.NewRequest("GET", urlStr, nil)