11package main
22
33import (
4+ "io/ioutil"
45 "net"
56 "net/http"
7+ "time"
68
79 "github.com/jedisct1/dlog"
810)
911
1012type localDoHHandler struct {
13+ proxy * Proxy
1114}
1215
1316func (handler localDoHHandler ) ServeHTTP (writer http.ResponseWriter , request * http.Request ) {
@@ -16,15 +19,37 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
1619 writer .WriteHeader (400 )
1720 return
1821 }
22+ proxy := handler .proxy
23+ start := time .Now ()
24+ clientAddr , err := net .ResolveTCPAddr ("tcp" , request .RemoteAddr )
25+ if err != nil {
26+ dlog .Errorf ("Unable to get the client address: [%v]" , err )
27+ return
28+ }
29+ xClientAddr := net .Addr (clientAddr )
30+ packet , err := ioutil .ReadAll (request .Body )
31+ if err != nil {
32+ dlog .Warnf ("No body in a local DoH query" )
33+ return
34+ }
35+ response := proxy .processIncomingQuery (proxy .serversInfo .getOne (), "tcp" , "tcp" , packet , & xClientAddr , nil , start )
36+ if len (response ) == 0 {
37+ writer .WriteHeader (500 )
38+ return
39+ }
1940 writer .WriteHeader (200 )
2041 writer .Header ().Add ("Server" , "dnscrypt-proxy" )
2142 writer .Header ().Add ("Content-Type" , "application/dns-message" )
22- writer .Write ([] byte ( "OK \n " ) )
43+ writer .Write (response )
2344}
2445
2546func (proxy * Proxy ) localDoHListener (acceptPc * net.TCPListener ) {
2647 defer acceptPc .Close ()
27- httpServer := & http.Server {ReadTimeout : proxy .timeout , WriteTimeout : proxy .timeout , Handler : localDoHHandler {}}
48+ httpServer := & http.Server {
49+ ReadTimeout : proxy .timeout ,
50+ WriteTimeout : proxy .timeout ,
51+ Handler : localDoHHandler {proxy : proxy },
52+ }
2853 if err := httpServer .Serve (acceptPc ); err != nil {
2954 dlog .Fatal (err )
3055 }
0 commit comments