From 8dc23ce8f584e6c50e2c6442b206ed44731aec0c Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Sat, 24 Apr 2021 18:06:25 +0200 Subject: [PATCH] DoH: fallback to GET if a 405 HTTP status code is returned Some servers block POST queries. Retry with GET if we receive a 405 HTTP status code. --- pkg/resolvers/doh.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkg/resolvers/doh.go b/pkg/resolvers/doh.go index 3b81b44..c5a0016 100644 --- a/pkg/resolvers/doh.go +++ b/pkg/resolvers/doh.go @@ -2,6 +2,7 @@ package resolvers import ( "bytes" + "encoding/base64" "fmt" "io/ioutil" "net/http" @@ -64,6 +65,17 @@ func (r *DOHResolver) Lookup(question dns.Question) (Response, error) { if err != nil { return rsp, err } + if resp.StatusCode == http.StatusMethodNotAllowed { + url, err := url.Parse(r.server) + if err != nil { + return rsp, err + } + url.RawQuery = fmt.Sprintf("dns=%v", base64.RawURLEncoding.EncodeToString(b)) + resp, err = r.client.Get(url.String()) + if err != nil { + return rsp, err + } + } if resp.StatusCode != http.StatusOK { return rsp, fmt.Errorf("error from nameserver %s", resp.Status) }