diff options
author | James Hartig <fastest963@gmail.com> | 2018-02-02 13:45:19 -0500 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2018-04-04 17:47:41 +0000 |
commit | 8f38f28222abccc505b9a1992deecfe3e2cb85de (patch) | |
tree | 997451920e419569790625976a1b368825cb0c5e /src/net/http/httputil/reverseproxy.go | |
parent | 08304e886790cbf0ef4bca8158dcb7d99f3a67e7 (diff) | |
download | go-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.go | 23 |
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 } } |