]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.r57] http: new error for reading a body after it's been closed
authorRuss Cox <rsc@golang.org>
Tue, 3 May 2011 05:15:41 +0000 (01:15 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 3 May 2011 05:15:41 +0000 (01:15 -0400)
««« CL 4433094 / e30213b07276
http: new error for reading a body after it's been closed

R=adg
CC=golang-dev
https://golang.org/cl/4433094
»»»

R=adg
CC=golang-dev
https://golang.org/cl/4433098

src/pkg/http/transfer.go

index 98c32bab64c1653d8682af0d6efe97072de3800f..5d32aabbfaad23811dd95e4e2db4f654570a3f36 100644 (file)
@@ -439,9 +439,29 @@ type body struct {
        hdr     interface{}   // non-nil (Response or Request) value means read trailer
        r       *bufio.Reader // underlying wire-format reader for the trailer
        closing bool          // is the connection to be closed after reading body?
+       closed  bool
+}
+
+// ErrBodyReadAferClose is returned when reading a Request Body after
+// the body has been closed. This typically happens when the body is
+// read after an HTTP Handler calls WriteHeader or Write on its
+// ResponseWriter.
+var ErrBodyReadAferClose = os.NewError("http: invalid Read on closed request Body")
+
+func (b *body) Read(p []byte) (n int, err os.Error) {
+       if b.closed {
+               return 0, ErrBodyReadAferClose
+       }
+       return b.Reader.Read(p)
 }
 
 func (b *body) Close() os.Error {
+       if b.closed {
+               return nil
+       }
+       defer func() {
+               b.closed = true
+       }()
        if b.hdr == nil && b.closing {
                // no trailer and closing the connection next.
                // no point in reading to EOF.