aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/httptest
diff options
context:
space:
mode:
authorJack <jackxbritton@gmail.com>2018-07-19 12:24:44 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2018-07-20 19:04:25 +0000
commit59699aa166b724cb9b7d3a2d3ba21c87bc7c376a (patch)
treec56442e824a459517446366fd53e686a8188465d /src/net/http/httptest
parentf4c787b6cf3a90c32ecf9f885d8c32c6a675050b (diff)
downloadgo-59699aa166b724cb9b7d3a2d3ba21c87bc7c376a.tar.xz
net/http/httptest: guarantee ResponseRecorder.Result returns a non-nil body
The doc for ResponseRecorder.Result guarantees that the body of the returned http.Response will be non-nil, but this only holds true if the caller's body is non-nil. With this change, if the caller's body is nil then the returned response's body will be an empty io.ReadCloser. Fixes #26442 Change-Id: I3b2fe4a2541caf9997dbb8978bbaf1f58cd1f471 GitHub-Last-Rev: d802967d89e89c50077fb2d0d455163dcea0eb43 GitHub-Pull-Request: golang/go#26453 Reviewed-on: https://go-review.googlesource.com/124875 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/net/http/httptest')
-rw-r--r--src/net/http/httptest/recorder.go2
-rw-r--r--src/net/http/httptest/recorder_test.go23
2 files changed, 25 insertions, 0 deletions
diff --git a/src/net/http/httptest/recorder.go b/src/net/http/httptest/recorder.go
index 1d0310625b..67f90b8376 100644
--- a/src/net/http/httptest/recorder.go
+++ b/src/net/http/httptest/recorder.go
@@ -184,6 +184,8 @@ func (rw *ResponseRecorder) Result() *http.Response {
res.Status = fmt.Sprintf("%03d %s", res.StatusCode, http.StatusText(res.StatusCode))
if rw.Body != nil {
res.Body = ioutil.NopCloser(bytes.NewReader(rw.Body.Bytes()))
+ } else {
+ res.Body = http.NoBody
}
res.ContentLength = parseContentLength(res.Header.Get("Content-Length"))
diff --git a/src/net/http/httptest/recorder_test.go b/src/net/http/httptest/recorder_test.go
index b5f82d23e6..0986554aa8 100644
--- a/src/net/http/httptest/recorder_test.go
+++ b/src/net/http/httptest/recorder_test.go
@@ -7,6 +7,7 @@ package httptest
import (
"fmt"
"io"
+ "io/ioutil"
"net/http"
"testing"
)
@@ -39,6 +40,19 @@ func TestRecorder(t *testing.T) {
return nil
}
}
+ hasResultContents := func(want string) checkFunc {
+ return func(rec *ResponseRecorder) error {
+ contentBytes, err := ioutil.ReadAll(rec.Result().Body)
+ if err != nil {
+ return err
+ }
+ contents := string(contentBytes)
+ if contents != want {
+ return fmt.Errorf("Result().Body = %s; want %s", contents, want)
+ }
+ return nil
+ }
+ }
hasContents := func(want string) checkFunc {
return func(rec *ResponseRecorder) error {
if rec.Body.String() != want {
@@ -273,6 +287,15 @@ func TestRecorder(t *testing.T) {
},
check(hasStatus(200), hasContents("Some body"), hasContentLength(9)),
},
+ {
+ "nil ResponseRecorder.Body", // Issue 26642
+ func(w http.ResponseWriter, r *http.Request) {
+ w.(*ResponseRecorder).Body = nil
+ io.WriteString(w, "hi")
+ },
+ check(hasResultContents("")), // check we don't crash reading the body
+
+ },
} {
t.Run(tt.name, func(t *testing.T) {
r, _ := http.NewRequest("GET", "http://foo.com/", nil)