diff --git a/proxy/reverse.go b/proxy/reverse.go index ee0b9cbcd..0db5bd111 100644 --- a/proxy/reverse.go +++ b/proxy/reverse.go @@ -15,8 +15,10 @@ package proxy import ( + "bytes" "fmt" "io" + "io/ioutil" "log" "net" "net/http" @@ -55,6 +57,21 @@ func (p *reverseProxy) ServeHTTP(rw http.ResponseWriter, clientreq *http.Request proxyreq := new(http.Request) *proxyreq = *clientreq + var ( + proxybody []byte + err error + ) + + if clientreq.Body != nil { + proxybody, err = ioutil.ReadAll(clientreq.Body) + if err != nil { + msg := fmt.Sprintf("proxy: failed to read request body: %v", err) + e := httptypes.NewHTTPError(http.StatusInternalServerError, msg) + e.WriteTo(rw) + return + } + } + // deep-copy the headers, as these will be modified below proxyreq.Header = make(http.Header) copyHeader(proxyreq.Header, clientreq.Header) @@ -93,9 +110,11 @@ func (p *reverseProxy) ServeHTTP(rw http.ResponseWriter, clientreq *http.Request } var res *http.Response - var err error for _, ep := range endpoints { + if proxybody != nil { + proxyreq.Body = ioutil.NopCloser(bytes.NewBuffer(proxybody)) + } redirectRequest(proxyreq, ep.URL) res, err = p.transport.RoundTrip(proxyreq)