mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #2902 from BlueDragonX/bug-proxyreq-closed
Reuse a bytes buffer as proxy request body.
This commit is contained in:
commit
a8af787971
@ -15,8 +15,10 @@
|
|||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -55,6 +57,21 @@ func (p *reverseProxy) ServeHTTP(rw http.ResponseWriter, clientreq *http.Request
|
|||||||
proxyreq := new(http.Request)
|
proxyreq := new(http.Request)
|
||||||
*proxyreq = *clientreq
|
*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
|
// deep-copy the headers, as these will be modified below
|
||||||
proxyreq.Header = make(http.Header)
|
proxyreq.Header = make(http.Header)
|
||||||
copyHeader(proxyreq.Header, clientreq.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 res *http.Response
|
||||||
var err error
|
|
||||||
|
|
||||||
for _, ep := range endpoints {
|
for _, ep := range endpoints {
|
||||||
|
if proxybody != nil {
|
||||||
|
proxyreq.Body = ioutil.NopCloser(bytes.NewBuffer(proxybody))
|
||||||
|
}
|
||||||
redirectRequest(proxyreq, ep.URL)
|
redirectRequest(proxyreq, ep.URL)
|
||||||
|
|
||||||
res, err = p.transport.RoundTrip(proxyreq)
|
res, err = p.transport.RoundTrip(proxyreq)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user