From fe2b5f630d969bac5eda7b72e28f740e65778469 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Johnny=20Bergstr=C3=B6m?= <github@joonix.se>
Date: Wed, 17 Feb 2021 20:45:04 +0100
Subject: [PATCH] doh: set http request in writer (#4445)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Makes it possible to read the current http request while serving DNS

Signed-off-by: Johnny Bergström <johnny@klaudify.se>
---
 core/dnsserver/https.go        | 7 +++++++
 core/dnsserver/server_https.go | 6 +++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/core/dnsserver/https.go b/core/dnsserver/https.go
index 532124575..382e06efe 100644
--- a/core/dnsserver/https.go
+++ b/core/dnsserver/https.go
@@ -2,6 +2,7 @@ package dnsserver
 
 import (
 	"net"
+	"net/http"
 
 	"github.com/coredns/coredns/plugin/pkg/nonwriter"
 )
@@ -14,6 +15,9 @@ type DoHWriter struct {
 	raddr net.Addr
 	// laddr is our address. This can be optionally set.
 	laddr net.Addr
+
+	// request is the HTTP request we're currently handling.
+	request *http.Request
 }
 
 // RemoteAddr returns the remote address.
@@ -21,3 +25,6 @@ func (d *DoHWriter) RemoteAddr() net.Addr { return d.raddr }
 
 // LocalAddr returns the local address.
 func (d *DoHWriter) LocalAddr() net.Addr { return d.laddr }
+
+// Request returns the HTTP request
+func (d *DoHWriter) Request() *http.Request { return d.request }
diff --git a/core/dnsserver/server_https.go b/core/dnsserver/server_https.go
index 7292311e8..5962a5f09 100644
--- a/core/dnsserver/server_https.go
+++ b/core/dnsserver/server_https.go
@@ -140,7 +140,11 @@ func (s *ServerHTTPS) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	// Create a DoHWriter with the correct addresses in it.
 	h, p, _ := net.SplitHostPort(r.RemoteAddr)
 	port, _ := strconv.Atoi(p)
-	dw := &DoHWriter{laddr: s.listenAddr, raddr: &net.TCPAddr{IP: net.ParseIP(h), Port: port}}
+	dw := &DoHWriter{
+		laddr:   s.listenAddr,
+		raddr:   &net.TCPAddr{IP: net.ParseIP(h), Port: port},
+		request: r,
+	}
 
 	// We just call the normal chain handler - all error handling is done there.
 	// We should expect a packet to be returned that we can send to the client.