From f8b40c4bfc703bcaf793e81868fa2c68e77445df Mon Sep 17 00:00:00 2001 From: Star Brilliant Date: Wed, 7 Nov 2018 18:47:01 +0800 Subject: [PATCH] Try to use context.WithTimeout to detect HTTP timeout. Hopefully it might work. --- doh-client/client.go | 1 - doh-client/google.go | 9 +++++---- doh-client/ietf.go | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doh-client/client.go b/doh-client/client.go index 53c1fee..5a80455 100644 --- a/doh-client/client.go +++ b/doh-client/client.go @@ -172,7 +172,6 @@ func (c *Client) newHTTPClient() error { MaxIdleConns: 100, MaxIdleConnsPerHost: 10, Proxy: http.ProxyFromEnvironment, - ResponseHeaderTimeout: time.Duration(c.conf.Timeout) * time.Second, TLSHandshakeTimeout: time.Duration(c.conf.Timeout) * time.Second, } if c.conf.NoIPv6 { diff --git a/doh-client/google.go b/doh-client/google.go index f2bb3ad..a82a3e2 100644 --- a/doh-client/google.go +++ b/doh-client/google.go @@ -24,6 +24,7 @@ package main import ( + "context" "encoding/json" "fmt" "io/ioutil" @@ -33,6 +34,7 @@ import ( "net/url" "strconv" "strings" + "time" "github.com/m13253/dns-over-https/json-dns" "github.com/miekg/dns" @@ -87,6 +89,9 @@ func (c *Client) generateRequestGoogle(w dns.ResponseWriter, r *dns.Msg, isTCP b } req.Header.Set("Accept", "application/json, application/dns-message, application/dns-udpwireformat") req.Header.Set("User-Agent", USER_AGENT) + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(c.conf.Timeout)*time.Second) + defer cancel() + req = req.WithContext(ctx) c.httpClientMux.RLock() resp, err := c.httpClient.Do(req) c.httpClientMux.RUnlock() @@ -95,10 +100,6 @@ func (c *Client) generateRequestGoogle(w dns.ResponseWriter, r *dns.Msg, isTCP b reply := jsonDNS.PrepareReply(r) reply.Rcode = dns.RcodeServerFailure w.WriteMsg(reply) - err1 := c.newHTTPClient() - if err1 != nil { - log.Fatalln(err1) - } return &DNSRequest{ err: err, } diff --git a/doh-client/ietf.go b/doh-client/ietf.go index e993b33..e789210 100644 --- a/doh-client/ietf.go +++ b/doh-client/ietf.go @@ -25,6 +25,7 @@ package main import ( "bytes" + "context" "encoding/base64" "fmt" "io/ioutil" @@ -126,6 +127,9 @@ func (c *Client) generateRequestIETF(w dns.ResponseWriter, r *dns.Msg, isTCP boo } req.Header.Set("Accept", "application/dns-message, application/dns-udpwireformat, application/json") req.Header.Set("User-Agent", USER_AGENT) + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(c.conf.Timeout)*time.Second) + defer cancel() + req = req.WithContext(ctx) c.httpClientMux.RLock() resp, err := c.httpClient.Do(req) c.httpClientMux.RUnlock() @@ -134,10 +138,6 @@ func (c *Client) generateRequestIETF(w dns.ResponseWriter, r *dns.Msg, isTCP boo reply := jsonDNS.PrepareReply(r) reply.Rcode = dns.RcodeServerFailure w.WriteMsg(reply) - err1 := c.newHTTPClient() - if err1 != nil { - log.Fatalln(err1) - } return &DNSRequest{ err: err, }