From 2d9c9eba502376fc283eb96a789ecc71d77b1cf0 Mon Sep 17 00:00:00 2001 From: Star Brilliant Date: Wed, 7 Nov 2018 19:41:55 +0800 Subject: [PATCH] Detect context.DeadlineExceeded --- doh-client/google.go | 7 +++++++ doh-client/ietf.go | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/doh-client/google.go b/doh-client/google.go index b02feb0..506f519 100644 --- a/doh-client/google.go +++ b/doh-client/google.go @@ -92,6 +92,13 @@ func (c *Client) generateRequestGoogle(ctx context.Context, w dns.ResponseWriter c.httpClientMux.RLock() resp, err := c.httpClient.Do(req) c.httpClientMux.RUnlock() + if err == context.DeadlineExceeded { + // Do not respond, silently fail to prevent caching of SERVFAIL + log.Println(err) + return &DNSRequest{ + err: err, + } + } if err != nil { log.Println(err) reply := jsonDNS.PrepareReply(r) diff --git a/doh-client/ietf.go b/doh-client/ietf.go index b8e2816..85a9a34 100644 --- a/doh-client/ietf.go +++ b/doh-client/ietf.go @@ -108,8 +108,10 @@ func (c *Client) generateRequestIETF(ctx context.Context, w dns.ResponseWriter, if len(requestURL) < 2048 { req, err = http.NewRequest("GET", requestURL, nil) if err != nil { - // Do not respond, silently fail to prevent caching of SERVFAIL log.Println(err) + reply := jsonDNS.PrepareReply(r) + reply.Rcode = dns.RcodeServerFailure + w.WriteMsg(reply) return &DNSRequest{ err: err, } @@ -117,8 +119,10 @@ func (c *Client) generateRequestIETF(ctx context.Context, w dns.ResponseWriter, } else { req, err = http.NewRequest("POST", upstream, bytes.NewReader(requestBinary)) if err != nil { - // Do not respond, silently fail to prevent caching of SERVFAIL log.Println(err) + reply := jsonDNS.PrepareReply(r) + reply.Rcode = dns.RcodeServerFailure + w.WriteMsg(reply) return &DNSRequest{ err: err, } @@ -131,6 +135,13 @@ func (c *Client) generateRequestIETF(ctx context.Context, w dns.ResponseWriter, c.httpClientMux.RLock() resp, err := c.httpClient.Do(req) c.httpClientMux.RUnlock() + if err == context.DeadlineExceeded { + // Do not respond, silently fail to prevent caching of SERVFAIL + log.Println(err) + return &DNSRequest{ + err: err, + } + } if err != nil { log.Println(err) reply := jsonDNS.PrepareReply(r)