From abdd033310dcf687eb1c7a824182a99aba7c9d0e Mon Sep 17 00:00:00 2001 From: Star Brilliant Date: Tue, 12 Jun 2018 11:12:13 +0800 Subject: [PATCH] Print upstream information if error happens --- doh-client/client.go | 1 + doh-client/google.go | 3 ++- doh-client/ietf.go | 3 ++- doh-client/version.go | 2 +- doh-server/server.go | 29 +++++++++++++++-------------- doh-server/version.go | 2 +- 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/doh-client/client.go b/doh-client/client.go index 5de26e2..b4d31f2 100644 --- a/doh-client/client.go +++ b/doh-client/client.go @@ -58,6 +58,7 @@ type DNSRequest struct { udpSize uint16 ednsClientAddress net.IP ednsClientNetmask uint8 + currentUpstream string err error } diff --git a/doh-client/google.go b/doh-client/google.go index adeaeb2..a6cb5c5 100644 --- a/doh-client/google.go +++ b/doh-client/google.go @@ -115,12 +115,13 @@ func (c *Client) generateRequestGoogle(w dns.ResponseWriter, r *dns.Msg, isTCP b udpSize: udpSize, ednsClientAddress: ednsClientAddress, ednsClientNetmask: ednsClientNetmask, + currentUpstream: upstream, } } func (c *Client) parseResponseGoogle(w dns.ResponseWriter, r *dns.Msg, isTCP bool, req *DNSRequest) { if req.response.StatusCode != 200 { - log.Printf("HTTP error: %s\n", req.response.Status) + log.Printf("HTTP error from upstream %s: %s\n", req.currentUpstream, req.response.Status) req.reply.Rcode = dns.RcodeServerFailure contentType := req.response.Header.Get("Content-Type") if contentType != "application/json" && !strings.HasPrefix(contentType, "application/json;") { diff --git a/doh-client/ietf.go b/doh-client/ietf.go index 5615737..6aae281 100644 --- a/doh-client/ietf.go +++ b/doh-client/ietf.go @@ -175,12 +175,13 @@ func (c *Client) generateRequestIETF(w dns.ResponseWriter, r *dns.Msg, isTCP boo udpSize: udpSize, ednsClientAddress: ednsClientAddress, ednsClientNetmask: ednsClientNetmask, + currentUpstream: upstream, } } func (c *Client) parseResponseIETF(w dns.ResponseWriter, r *dns.Msg, isTCP bool, req *DNSRequest) { if req.response.StatusCode != 200 { - log.Printf("HTTP error: %s\n", req.response.Status) + log.Printf("HTTP error from upstream %s: %s\n", req.currentUpstream, req.response.Status) req.reply.Rcode = dns.RcodeServerFailure contentType := req.response.Header.Get("Content-Type") if contentType != "application/dns-message" && !strings.HasPrefix(contentType, "application/dns-message;") { diff --git a/doh-client/version.go b/doh-client/version.go index ac25430..4e89ef5 100644 --- a/doh-client/version.go +++ b/doh-client/version.go @@ -24,6 +24,6 @@ package main const ( - VERSION = "1.3.6" + VERSION = "1.3.7" USER_AGENT = "DNS-over-HTTPS/" + VERSION + " (+https://github.com/m13253/dns-over-https)" ) diff --git a/doh-server/server.go b/doh-server/server.go index 6197352..557e75b 100644 --- a/doh-server/server.go +++ b/doh-server/server.go @@ -46,11 +46,12 @@ type Server struct { } type DNSRequest struct { - request *dns.Msg - response *dns.Msg - isTailored bool - errcode int - errtext string + request *dns.Msg + response *dns.Msg + currentUpstream string + isTailored bool + errcode int + errtext string } func NewServer(conf *config) (s *Server) { @@ -164,7 +165,7 @@ func (s *Server) handlerFunc(w http.ResponseWriter, r *http.Request) { } var err error - req.response, err = s.doDNSQuery(req.request) + req, err = s.doDNSQuery(req) if err != nil { jsonDNS.FormatError(w, fmt.Sprintf("DNS query failure (%s)", err.Error()), 503) return @@ -208,23 +209,23 @@ func (s *Server) findClientIP(r *http.Request) net.IP { return nil } -func (s *Server) doDNSQuery(msg *dns.Msg) (resp *dns.Msg, err error) { +func (s *Server) doDNSQuery(req *DNSRequest) (resp *DNSRequest, err error) { numServers := len(s.conf.Upstream) for i := uint(0); i < s.conf.Tries; i++ { - server := s.conf.Upstream[rand.Intn(numServers)] + req.currentUpstream = s.conf.Upstream[rand.Intn(numServers)] if !s.conf.TCPOnly { - resp, _, err = s.udpClient.Exchange(msg, server) + req.response, _, err = s.udpClient.Exchange(req.request, req.currentUpstream) if err == dns.ErrTruncated { log.Println(err) - resp, _, err = s.tcpClient.Exchange(msg, server) + req.response, _, err = s.tcpClient.Exchange(req.request, req.currentUpstream) } } else { - resp, _, err = s.tcpClient.Exchange(msg, server) + req.response, _, err = s.tcpClient.Exchange(req.request, req.currentUpstream) } if err == nil { - return + return req, nil } - log.Println(err) + log.Printf("DNS error from upstream %s: %s\n", req.currentUpstream, err.Error()) } - return + return req, err } diff --git a/doh-server/version.go b/doh-server/version.go index ac25430..4e89ef5 100644 --- a/doh-server/version.go +++ b/doh-server/version.go @@ -24,6 +24,6 @@ package main const ( - VERSION = "1.3.6" + VERSION = "1.3.7" USER_AGENT = "DNS-over-HTTPS/" + VERSION + " (+https://github.com/m13253/dns-over-https)" )