]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: fix EOF handling on response body
authorGustavo Niemeyer <gustavo@niemeyer.net>
Wed, 16 Nov 2011 19:35:47 +0000 (17:35 -0200)
committerGustavo Niemeyer <gustavo@niemeyer.net>
Wed, 16 Nov 2011 19:35:47 +0000 (17:35 -0200)
http.Response is currently returning 0, nil on EOF.

R=golang-dev, bradfitz, bradfitz
CC=golang-dev
https://golang.org/cl/5394047

src/pkg/net/http/client_test.go
src/pkg/net/http/transfer.go

index d224380298c86663060c0c27f5b735e4707b471c..57a9dd9574d1a6c201ed635a22c26a460196d038 100644 (file)
@@ -26,6 +26,31 @@ var robotsTxtHandler = HandlerFunc(func(w ResponseWriter, r *Request) {
        fmt.Fprintf(w, "User-agent: go\nDisallow: /something/")
 })
 
+// pedanticReadAll works like ioutil.ReadAll but additionally
+// verifies that r obeys the documented io.Reader contract.
+func pedanticReadAll(r io.Reader) (b []byte, err error) {
+       var bufa [64]byte
+       buf := bufa[:]
+       for {
+               n, err := r.Read(buf)
+               if n == 0 && err == nil {
+                       return nil, fmt.Errorf("Read: n=0 with err=nil")
+               }
+               b = append(b, buf[:n]...)
+               if err == io.EOF {
+                       n, err := r.Read(buf)
+                       if n != 0 || err != io.EOF {
+                               return nil, fmt.Errorf("Read: n=%d err=%#v after EOF", n, err)
+                       }
+                       return b, nil
+               }
+               if err != nil {
+                       return b, err
+               }
+       }
+       panic("unreachable")
+}
+
 func TestClient(t *testing.T) {
        ts := httptest.NewServer(robotsTxtHandler)
        defer ts.Close()
@@ -33,7 +58,7 @@ func TestClient(t *testing.T) {
        r, err := Get(ts.URL)
        var b []byte
        if err == nil {
-               b, err = ioutil.ReadAll(r.Body)
+               b, err = pedanticReadAll(r.Body)
                r.Body.Close()
        }
        if err != nil {
index 2670d77ef00ad864ccec45efe8e66f2f22e7bb22..d25c8fcde42b25c8b781e3f352bd1f35f89c4118 100644 (file)
@@ -537,7 +537,9 @@ func (b *body) Read(p []byte) (n int, err error) {
 
        // Read the final trailer once we hit EOF.
        if err == io.EOF && b.hdr != nil {
-               err = b.readTrailer()
+               if e := b.readTrailer(); e != nil {
+                       err = e
+               }
                b.hdr = nil
        }
        return n, err