From d0af424963124b557bbf4a07997d2a639b9a5434 Mon Sep 17 00:00:00 2001 From: Star Brilliant Date: Sat, 2 Dec 2017 15:17:22 +0800 Subject: [PATCH] Close idle HTTP connections in case of an HTTP error --- doh-client/client.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/doh-client/client.go b/doh-client/client.go index 41d4e9d..192d1da 100644 --- a/doh-client/client.go +++ b/doh-client/client.go @@ -46,6 +46,7 @@ type Client struct { bootstrap []string udpServer *dns.Server tcpServer *dns.Server + httpTransport *http.Transport httpClient *http.Client } @@ -86,19 +87,20 @@ func NewClient(conf *config) (c *Client, err error) { }, } } - httpTransport := *http.DefaultTransport.(*http.Transport) - httpTransport.DialContext = (&net.Dialer { + c.httpTransport = new(http.Transport) + *c.httpTransport = *http.DefaultTransport.(*http.Transport) + c.httpTransport.DialContext = (&net.Dialer { Timeout: time.Duration(conf.Timeout) * time.Second, KeepAlive: 30 * time.Second, DualStack: true, Resolver: bootResolver, }).DialContext - httpTransport.ResponseHeaderTimeout = time.Duration(conf.Timeout) * time.Second + c.httpTransport.ResponseHeaderTimeout = time.Duration(conf.Timeout) * time.Second // Most CDNs require Cookie support to prevent DDoS attack cookieJar, err := cookiejar.New(nil) if err != nil { return nil, err } c.httpClient = &http.Client { - Transport: &httpTransport, + Transport: c.httpTransport, Jar: cookieJar, } return c, nil @@ -186,6 +188,7 @@ func (c *Client) handlerFunc(w dns.ResponseWriter, r *dns.Msg, isTCP bool) { log.Println(err) reply.Rcode = dns.RcodeServerFailure w.WriteMsg(reply) + c.httpTransport.CloseIdleConnections() return } if resp.StatusCode != 200 {