diff options
Diffstat (limited to 'core/dnsserver/https.go')
-rw-r--r-- | core/dnsserver/https.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/core/dnsserver/https.go b/core/dnsserver/https.go new file mode 100644 index 000000000..028b74709 --- /dev/null +++ b/core/dnsserver/https.go @@ -0,0 +1,56 @@ +package dnsserver + +import ( + "encoding/base64" + "fmt" + "io/ioutil" + "net/http" + + "github.com/miekg/dns" +) + +// mimeTypeDOH is the DoH mimetype that should be used. +const mimeTypeDOH = "application/dns-message" + +// pathDOH is the URL path that should be used. +const pathDOH = "/dns-query" + +// postRequestToMsg extracts the dns message from the request body. +func postRequestToMsg(req *http.Request) (*dns.Msg, error) { + defer req.Body.Close() + + buf, err := ioutil.ReadAll(req.Body) + if err != nil { + return nil, err + } + m := new(dns.Msg) + err = m.Unpack(buf) + return m, err +} + +// getRequestToMsg extract the dns message from the GET request. +func getRequestToMsg(req *http.Request) (*dns.Msg, error) { + values := req.URL.Query() + b64, ok := values["dns"] + if !ok { + return nil, fmt.Errorf("no 'dns' query parameter found") + } + if len(b64) != 1 { + return nil, fmt.Errorf("multiple 'dns' query values found") + } + return base64ToMsg(b64[0]) +} + +func base64ToMsg(b64 string) (*dns.Msg, error) { + buf, err := b64Enc.DecodeString(b64) + if err != nil { + return nil, err + } + + m := new(dns.Msg) + err = m.Unpack(buf) + + return m, err +} + +var b64Enc = base64.RawURLEncoding |