dnscrypt-proxy/dnscrypt-proxy/local-doh.go

68 lines
1.8 KiB
Go
Raw Normal View History

package main
import (
2019-11-28 23:08:23 +01:00
"crypto/tls"
2019-11-28 23:32:56 +01:00
"io"
2019-11-26 01:36:35 +01:00
"io/ioutil"
"net"
"net/http"
2019-11-26 01:36:35 +01:00
"time"
"github.com/jedisct1/dlog"
)
type localDoHHandler struct {
2019-11-26 01:36:35 +01:00
proxy *Proxy
}
func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
2019-11-28 23:49:28 +01:00
proxy := handler.proxy
dataType := "application/dns-message"
2019-11-28 16:46:25 +01:00
writer.Header().Set("Server", "dnscrypt-proxy")
2019-11-28 23:49:28 +01:00
if request.URL.Path != proxy.localDoHPath {
writer.WriteHeader(404)
return
}
if request.Header.Get("Content-Type") != dataType {
writer.Header().Set("Content-Type", "text/plain")
writer.WriteHeader(400)
writer.Write([]byte("dnscrypt-proxy local DoH server\n"))
return
}
2019-11-26 01:36:35 +01:00
start := time.Now()
clientAddr, err := net.ResolveTCPAddr("tcp", request.RemoteAddr)
if err != nil {
dlog.Errorf("Unable to get the client address: [%v]", err)
return
}
xClientAddr := net.Addr(clientAddr)
2019-11-28 23:32:56 +01:00
packet, err := ioutil.ReadAll(io.LimitReader(request.Body, MaxHTTPBodyLength))
2019-11-26 01:36:35 +01:00
if err != nil {
dlog.Warnf("No body in a local DoH query")
return
}
2019-11-28 17:11:14 +01:00
response := proxy.processIncomingQuery(proxy.serversInfo.getOne(), "local_doh", proxy.mainProto, packet, &xClientAddr, nil, start)
2019-11-26 01:36:35 +01:00
if len(response) == 0 {
writer.WriteHeader(500)
return
}
2019-11-28 23:33:34 +01:00
writer.Header().Set("Content-Type", dataType)
writer.WriteHeader(200)
2019-11-26 01:36:35 +01:00
writer.Write(response)
}
func (proxy *Proxy) localDoHListener(acceptPc *net.TCPListener) {
defer acceptPc.Close()
2019-11-28 23:08:23 +01:00
noh2 := make(map[string]func(*http.Server, *tls.Conn, http.Handler))
2019-11-26 01:36:35 +01:00
httpServer := &http.Server{
ReadTimeout: proxy.timeout,
WriteTimeout: proxy.timeout,
2019-11-28 23:08:23 +01:00
TLSNextProto: noh2,
2019-11-26 01:36:35 +01:00
Handler: localDoHHandler{proxy: proxy},
}
2019-11-28 23:08:23 +01:00
httpServer.SetKeepAlivesEnabled(true)
2019-11-28 16:46:25 +01:00
if err := httpServer.ServeTLS(acceptPc, proxy.localDoHCertFile, proxy.localDoHCertKeyFile); err != nil {
dlog.Fatal(err)
}
}