mirror of
https://github.com/boringproxy/boringproxy.git
synced 2025-02-25 18:55:29 -06:00
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.
This commit is contained in:
parent
aea6c6d2f0
commit
ddb11d00ec
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user