aboutsummaryrefslogtreecommitdiff
path: root/core/dnsserver/https.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/dnsserver/https.go')
-rw-r--r--core/dnsserver/https.go56
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