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_test.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_test.go')
-rw-r--r-- | src/net/http/httputil/reverseproxy_test.go | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/net/http/httputil/reverseproxy_test.go b/src/net/http/httputil/reverseproxy_test.go index 8b5bd797a7..b3270a1a63 100644 --- a/src/net/http/httputil/reverseproxy_test.go +++ b/src/net/http/httputil/reverseproxy_test.go @@ -10,6 +10,7 @@ import ( "bufio" "bytes" "errors" + "fmt" "io" "io/ioutil" "log" @@ -581,3 +582,44 @@ func TestReverseProxy_NilBody(t *testing.T) { t.Errorf("status code = %v; want 502 (Gateway Error)", res.Status) } } + +// Issue 16659: log errors from short read +func TestReverseProxy_CopyBuffer(t *testing.T) { + backendServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + out := "this call was relayed by the reverse proxy" + // Coerce a wrong content length to induce io.UnexpectedEOF + w.Header().Set("Content-Length", fmt.Sprintf("%d", len(out)*2)) + fmt.Fprintln(w, out) + })) + defer backendServer.Close() + + rpURL, err := url.Parse(backendServer.URL) + if err != nil { + t.Fatal(err) + } + + var proxyLog bytes.Buffer + rproxy := NewSingleHostReverseProxy(rpURL) + rproxy.ErrorLog = log.New(&proxyLog, "", log.Lshortfile) + frontendProxy := httptest.NewServer(rproxy) + defer frontendProxy.Close() + + resp, err := http.Get(frontendProxy.URL) + if err != nil { + t.Fatalf("failed to reach proxy: %v", err) + } + defer resp.Body.Close() + + if _, err := ioutil.ReadAll(resp.Body); err == nil { + t.Fatalf("want non-nil error") + } + expected := []string{ + "EOF", + "read", + } + for _, phrase := range expected { + if !bytes.Contains(proxyLog.Bytes(), []byte(phrase)) { + t.Errorf("expected log to contain phrase %q", phrase) + } + } +} |