* WIP: make CoreDNS DoH Server * It works * Fix tests * Review from Tom - on diff. PR * correct mime type * Cleanups and use the pkg/nonwriter * rename and updates * implement get * implement GET * Code review comments * correct context * tweaks * code review
56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
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
|