commit - 0a3ca79c8e36dc108fecf910524518063dadd56c
commit + b1bd5dc331f07d95b1cfcb9b3671fa1162fdd3c0
blob - b7b3e164f414dddf774a423714f1288467140fd9
blob + cdcde6176c7fc304a0075e0c2f26dbdcaa6355ad
--- cmd/dohproxy/dohproxy.go
+++ cmd/dohproxy/dohproxy.go
import (
"net"
"io"
- "fmt"
"net/http"
"log"
"git.sr.ht/~otl/dns"
-// "golang.org/x/net/dns/dnsmessage"
+ "golang.org/x/crypto/acme/autocert"
+ "golang.org/x/net/dns/dnsmessage"
)
// https://quad9.net
const quad9 string = "9.9.9.9:domain"
const cloudflare string = "1.1.1.1:domain"
-func forward(msg []byte) ([]byte, error) {
- fmt.Println("starting to resolve")
+func forward(msg dnsmessage.Message) (dnsmessage.Message, error) {
+ packed, err := msg.Pack()
+ if err != nil {
+ return dnsmessage.Message{}, err
+ }
+
conn, err := net.Dial("udp", quad9)
if err != nil {
- return nil, err
+ return dnsmessage.Message{}, err
}
defer conn.Close()
- fmt.Println("dialled upstream ok")
- if _, err := conn.Write(msg); err != nil {
- return nil, err
+ if _, err := conn.Write(packed); err != nil {
+ return dnsmessage.Message{}, err
}
- fmt.Println("wrote request to upstream ok")
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
- return nil, err
+ return dnsmessage.Message{}, err
}
- return buf[:n], nil
+
+ var rmsg dnsmessage.Message
+ if err := rmsg.Unpack(buf[:n]); err != nil {
+ return dnsmessage.Message{}, err
+ }
+ return rmsg, nil
}
func dnsHandler(w http.ResponseWriter, req *http.Request) {
buf := make([]byte, 512)
switch req.Method {
case http.MethodPost:
- fmt.Println("got a POST request")
_, err := req.Body.Read(buf)
if err != nil && err != io.EOF {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
- fmt.Println("read request body into buffer")
req.Body.Close()
case http.MethodGet:
log.Println("got a GET request but that's not implemented")
return
}
- resolved, err := forward(buf)
+ var msg dnsmessage.Message
+ if err := msg.Unpack(buf); err != nil {
+ log.Println("unpack query:", err)
+ http.Error(w, "unpack query: "+err.Error(), http.StatusInternalServerError)
+ }
+
+ resolved, err := forward(msg)
if err != nil {
- fmt.Println(err.Error())
+ log.Println(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
+ packed, err := resolved.Pack()
+ if err != nil {
+ log.Println("pack resolved query:", err.Error)
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ }
w.Header().Add("Content-Type", dns.MediaType)
- if _, err := w.Write(resolved); err != nil {
+ if _, err := w.Write(packed); err != nil {
log.Fatalln(err)
}
}
func main() {
http.HandleFunc("/dns-query", dnsHandler)
- log.Fatalln(http.ListenAndServeTLS("127.0.0.1:8080", "otl.crt", "otl.key", nil))
+ log.Fatalln(http.Serve(autocert.NewListener("syd.olowe.co"), nil))
}
blob - 537ad850f1450847cc55b1be86e424d631cd4241
blob + da468ca44cc7be238bbfdf9b228b4be2b8db9e3b
--- go.mod
+++ go.mod
module git.sr.ht/~otl/dns
go 1.17
+
+require (
+ golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa // indirect
+ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect
+ golang.org/x/text v0.3.3 // indirect
+)
blob - e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
blob + 64a51352e01b4bfa8f3b38c539eeac8143307c91
--- go.sum
+++ go.sum
+golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa h1:idItI2DDfCokpg0N51B2VtiLdJ4vAuXC9fnCb2gACo4=
+golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=