diff options
author | Michael Fraenkel <michael.fraenkel@gmail.com> | 2016-10-08 06:57:49 -0400 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2016-10-24 20:25:09 +0000 |
commit | a7cad4110ac229ecf5b0fcf0a035c5a03c699415 (patch) | |
tree | 7044035c019e840e419b7ff6906bdf2ce157f5c8 /src/net/http/httputil/reverseproxy.go | |
parent | 95f3e47456e42899b64d3740eab1dd7ee1db5bf9 (diff) | |
download | go-a7cad4110ac229ecf5b0fcf0a035c5a03c699415.tar.gz go-a7cad4110ac229ecf5b0fcf0a035c5a03c699415.zip |
net/http/httputil: log err encountered during reverseproxy body copying
Fixes #16659
Change-Id: I13dd797e93e0b572eaf8726f1be594870d40183b
Reviewed-on: https://go-review.googlesource.com/30692
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/net/http/httputil/reverseproxy.go')
-rw-r--r-- | src/net/http/httputil/reverseproxy.go | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/net/http/httputil/reverseproxy.go b/src/net/http/httputil/reverseproxy.go index 76f23bcf9a..f18dd886cc 100644 --- a/src/net/http/httputil/reverseproxy.go +++ b/src/net/http/httputil/reverseproxy.go @@ -260,12 +260,40 @@ func (p *ReverseProxy) copyResponse(dst io.Writer, src io.Reader) { if p.BufferPool != nil { buf = p.BufferPool.Get() } - io.CopyBuffer(dst, src, buf) + p.copyBuffer(dst, src, buf) if p.BufferPool != nil { p.BufferPool.Put(buf) } } +func (p *ReverseProxy) copyBuffer(dst io.Writer, src io.Reader, buf []byte) (int64, error) { + if len(buf) == 0 { + buf = make([]byte, 32*1024) + } + var written int64 + for { + nr, rerr := src.Read(buf) + if rerr != nil && rerr != io.EOF { + p.logf("httputil: ReverseProxy read error during body copy: %v", rerr) + } + if nr > 0 { + nw, werr := dst.Write(buf[:nr]) + if nw > 0 { + written += int64(nw) + } + if werr != nil { + return written, werr + } + if nr != nw { + return written, io.ErrShortWrite + } + } + if rerr != nil { + return written, rerr + } + } +} + func (p *ReverseProxy) logf(format string, args ...interface{}) { if p.ErrorLog != nil { p.ErrorLog.Printf(format, args...) |