From ddb11d00eceb33bd8794c5ba7b4bb473669b21b6 Mon Sep 17 00:00:00 2001 From: Anders Pitman Date: Tue, 22 Dec 2020 14:47:03 -0700 Subject: [PATCH] Switch to streaming requests Previously we were reading the entire downstream request into memory before making the new request to the upstream. Now we're just passing it through. Might be some dragons here (already ran into issues with Content-Length) but seems to be working so far. --- http_proxy.go | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/http_proxy.go b/http_proxy.go index 65d68bd..41511cd 100644 --- a/http_proxy.go +++ b/http_proxy.go @@ -1,10 +1,8 @@ package boringproxy import ( - "bytes" "fmt" "io" - "io/ioutil" "net/http" "time" ) @@ -35,7 +33,7 @@ func proxyRequest(w http.ResponseWriter, r *http.Request, tunnel Tunnel, httpCli upstreamAddr := fmt.Sprintf("localhost:%d", port) upstreamUrl := fmt.Sprintf("http://%s%s", upstreamAddr, r.URL.RequestURI()) - body, err := ioutil.ReadAll(r.Body) + upstreamReq, err := http.NewRequest(r.Method, upstreamUrl, r.Body) if err != nil { errMessage := fmt.Sprintf("%s", err) w.WriteHeader(500) @@ -43,13 +41,10 @@ func proxyRequest(w http.ResponseWriter, r *http.Request, tunnel Tunnel, httpCli return } - upstreamReq, err := http.NewRequest(r.Method, upstreamUrl, bytes.NewReader(body)) - if err != nil { - errMessage := fmt.Sprintf("%s", err) - w.WriteHeader(500) - io.WriteString(w, errMessage) - return - } + // ContentLength needs to be set manually because otherwise it is + // stripped by golang. See: + // https://golang.org/pkg/net/http/#Request.Write + upstreamReq.ContentLength = r.ContentLength upstreamReq.Header = downstreamReqHeaders