11package main
22
33import (
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