Skip to content

Commit c10e6e0

Browse files
committed
Local DoH: add support for request using the GET method
Fixes #2012
1 parent e608944 commit c10e6e0

1 file changed

Lines changed: 24 additions & 7 deletions

File tree

dnscrypt-proxy/local-doh.go

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

33
import (
4+
"encoding/base64"
5+
"fmt"
46
"io"
57
"io/ioutil"
68
"net"
@@ -29,7 +31,27 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
2931
writer.WriteHeader(404)
3032
return
3133
}
32-
if request.Header.Get("Content-Type") != dataType {
34+
packet := []byte{}
35+
var err error
36+
start := time.Now()
37+
if request.Method == "POST" &&
38+
request.Header.Get("Content-Type") == dataType {
39+
packet, err = ioutil.ReadAll(io.LimitReader(request.Body, int64(MaxDNSPacketSize)))
40+
if err != nil {
41+
dlog.Warnf("No body in a local DoH query")
42+
return
43+
}
44+
} else if request.Method == "GET" && request.Header.Get("Accept") == dataType {
45+
encodedPacket := request.URL.Query().Get("dns")
46+
if len(encodedPacket) >= MinDNSPacketSize*4/3 && len(encodedPacket) <= MaxDNSPacketSize*4/3 {
47+
packet, err = base64.RawURLEncoding.DecodeString(encodedPacket)
48+
if err != nil {
49+
dlog.Warnf("Invalid base64 in a local DoH query")
50+
return
51+
}
52+
}
53+
}
54+
if len(packet) < MinDNSPacketSize {
3355
writer.Header().Set("Content-Type", "text/plain")
3456
writer.WriteHeader(400)
3557
writer.Write([]byte("dnscrypt-proxy local DoH server\n"))
@@ -41,12 +63,6 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
4163
return
4264
}
4365
xClientAddr := net.Addr(clientAddr)
44-
start := time.Now()
45-
packet, err := ioutil.ReadAll(io.LimitReader(request.Body, MaxHTTPBodyLength))
46-
if err != nil {
47-
dlog.Warnf("No body in a local DoH query")
48-
return
49-
}
5066
hasEDNS0Padding, err := hasEDNS0Padding(packet)
5167
if err != nil {
5268
writer.WriteHeader(400)
@@ -76,6 +92,7 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
7692
writer.Header().Set("X-Pad", pad)
7793
}
7894
writer.Header().Set("Content-Type", dataType)
95+
writer.Header().Set("Content-Length", fmt.Sprint(len(response)))
7996
writer.WriteHeader(200)
8097
writer.Write(response)
8198
}

0 commit comments

Comments
 (0)