aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/httputil/reverseproxy.go
diff options
context:
space:
mode:
authorJames Hartig <fastest963@gmail.com>2018-02-02 13:45:19 -0500
committerBrad Fitzpatrick <bradfitz@golang.org>2018-04-04 17:47:41 +0000
commit8f38f28222abccc505b9a1992deecfe3e2cb85de (patch)
tree997451920e419569790625976a1b368825cb0c5e /src/net/http/httputil/reverseproxy.go
parent08304e886790cbf0ef4bca8158dcb7d99f3a67e7 (diff)
downloadgo-8f38f28222abccc505b9a1992deecfe3e2cb85de.tar.gz
go-8f38f28222abccc505b9a1992deecfe3e2cb85de.zip
net/http/httputil: make ReverseProxy panic on error while copying body
Fixes #23643. Change-Id: I4f8195a36be817d79b9e7c61a5301f153b681493 Reviewed-on: https://go-review.googlesource.com/91675 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/net/http/httputil/reverseproxy.go')
-rw-r--r--src/net/http/httputil/reverseproxy.go23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/net/http/httputil/reverseproxy.go b/src/net/http/httputil/reverseproxy.go
index 8704ab7a90..80ee22895a 100644
--- a/src/net/http/httputil/reverseproxy.go
+++ b/src/net/http/httputil/reverseproxy.go
@@ -237,7 +237,14 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
fl.Flush()
}
}
- p.copyResponse(rw, res.Body)
+ err = p.copyResponse(rw, res.Body)
+ if err != nil {
+ defer res.Body.Close()
+ // Since we're streaming the response, if we run into an error all we can do
+ // is abort the request. Issue 23643: ReverseProxy should use ErrAbortHandler
+ // on read error while copying body
+ panic(http.ErrAbortHandler)
+ }
res.Body.Close() // close now, instead of defer, to populate res.Trailer
if len(res.Trailer) == announcedTrailers {
@@ -265,7 +272,7 @@ func removeConnectionHeaders(h http.Header) {
}
}
-func (p *ReverseProxy) copyResponse(dst io.Writer, src io.Reader) {
+func (p *ReverseProxy) copyResponse(dst io.Writer, src io.Reader) error {
if p.FlushInterval != 0 {
if wf, ok := dst.(writeFlusher); ok {
mlw := &maxLatencyWriter{
@@ -282,13 +289,14 @@ func (p *ReverseProxy) copyResponse(dst io.Writer, src io.Reader) {
var buf []byte
if p.BufferPool != nil {
buf = p.BufferPool.Get()
+ defer p.BufferPool.Put(buf)
}
- p.copyBuffer(dst, src, buf)
- if p.BufferPool != nil {
- p.BufferPool.Put(buf)
- }
+ _, err := p.copyBuffer(dst, src, buf)
+ return err
}
+// copyBuffer returns any write errors or non-EOF read errors, and the amount
+// of bytes written.
func (p *ReverseProxy) copyBuffer(dst io.Writer, src io.Reader, buf []byte) (int64, error) {
if len(buf) == 0 {
buf = make([]byte, 32*1024)
@@ -312,6 +320,9 @@ func (p *ReverseProxy) copyBuffer(dst io.Writer, src io.Reader, buf []byte) (int
}
}
if rerr != nil {
+ if rerr == io.EOF {
+ rerr = nil
+ }
return written, rerr
}
}