From 758fbbf21ee0f76ec414730b41247002b82f1903 Mon Sep 17 00:00:00 2001 From: Ilia Cimpoes Date: Mon, 29 Oct 2018 16:38:02 +0200 Subject: [PATCH 1/3] Do not reset response body on EOF --- responder.go | 6 +----- responder_test.go | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/responder.go b/responder.go index f3d5da1..e161835 100644 --- a/responder.go +++ b/responder.go @@ -92,11 +92,7 @@ type dummyReadCloser struct { // Read implements the required method by io.ReadClose interface. func (d *dummyReadCloser) Read(p []byte) (n int, err error) { - n, err = d.body.Read(p) - if err == io.EOF { - d.body.Seek(0, 0) - } - return n, err + return d.body.Read(p) } // Close implements a no-op required method by io.ReadClose interface. diff --git a/responder_test.go b/responder_test.go index 9100758..c51bbbc 100644 --- a/responder_test.go +++ b/responder_test.go @@ -23,6 +23,24 @@ func TestResponder(t *testing.T) { st.Expect(t, string(body), "foo") } +func TestResponder_ReadTwice(t *testing.T) { + defer after() + mres := New("http://foo.com").Reply(200).BodyString("foo") + req := &http.Request{} + + res, err := Responder(req, mres, nil) + st.Expect(t, err, nil) + st.Expect(t, res.Status, "200 OK") + st.Expect(t, res.StatusCode, 200) + + body, _ := ioutil.ReadAll(res.Body) + st.Expect(t, string(body), "foo") + + body, err = ioutil.ReadAll(res.Body) + st.Expect(t, err, nil) + st.Expect(t, body,[]byte{}) +} + func TestResponderSupportsMultipleHeadersWithSameKey(t *testing.T) { defer after() mres := New("http://foo"). From 555f3c7657417b10581f46c7b38932b784c36499 Mon Sep 17 00:00:00 2001 From: Ilia Cimpoes Date: Mon, 29 Oct 2018 16:52:53 +0200 Subject: [PATCH 2/3] Use NopCloser --- responder.go | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/responder.go b/responder.go index e161835..35eb871 100644 --- a/responder.go +++ b/responder.go @@ -3,6 +3,7 @@ package gock import ( "bytes" "io" + "io/ioutil" "net/http" "strconv" "time" @@ -82,20 +83,5 @@ func mergeHeaders(res *http.Response, mres *Response) http.Header { // createReadCloser creates an io.ReadCloser from a byte slice that is suitable for use as an // http response body. func createReadCloser(body []byte) io.ReadCloser { - return &dummyReadCloser{body: bytes.NewReader(body)} -} - -// dummyReadCloser is used internally as io.ReadCloser capable interface for bodies. -type dummyReadCloser struct { - body io.ReadSeeker -} - -// Read implements the required method by io.ReadClose interface. -func (d *dummyReadCloser) Read(p []byte) (n int, err error) { - return d.body.Read(p) -} - -// Close implements a no-op required method by io.ReadClose interface. -func (d *dummyReadCloser) Close() error { - return nil + return ioutil.NopCloser(bytes.NewReader(body)) } From 2a80d20f8861a9fb3de2da88fb6dc4dffb29d835 Mon Sep 17 00:00:00 2001 From: Ilia Cimpoes Date: Mon, 29 Oct 2018 16:58:20 +0200 Subject: [PATCH 3/3] Fix gofmt issue --- responder_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/responder_test.go b/responder_test.go index c51bbbc..766fa61 100644 --- a/responder_test.go +++ b/responder_test.go @@ -38,7 +38,7 @@ func TestResponder_ReadTwice(t *testing.T) { body, err = ioutil.ReadAll(res.Body) st.Expect(t, err, nil) - st.Expect(t, body,[]byte{}) + st.Expect(t, body, []byte{}) } func TestResponderSupportsMultipleHeadersWithSameKey(t *testing.T) {