aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/httputil/dump.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/http/httputil/dump.go')
-rw-r--r--src/net/http/httputil/dump.go13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/net/http/httputil/dump.go b/src/net/http/httputil/dump.go
index 1511681632..7104c37454 100644
--- a/src/net/http/httputil/dump.go
+++ b/src/net/http/httputil/dump.go
@@ -18,11 +18,16 @@ import (
"time"
)
-// One of the copies, say from b to r2, could be avoided by using a more
-// elaborate trick where the other copy is made during Request/Response.Write.
-// This would complicate things too much, given that these functions are for
-// debugging only.
+// drainBody reads all of b to memory and then returns two equivalent
+// ReadClosers yielding the same bytes.
+//
+// It returns an error if the initial slurp of all bytes fails. It does not attempt
+// to make the returned ReadClosers have identical error-matching behavior.
func drainBody(b io.ReadCloser) (r1, r2 io.ReadCloser, err error) {
+ if b == http.NoBody {
+ // No copying needed. Preserve the magic sentinel meaning of NoBody.
+ return http.NoBody, http.NoBody, nil
+ }
var buf bytes.Buffer
if _, err = buf.ReadFrom(b); err != nil {
return nil, b, err