From: Brad Fitzpatrick Date: Wed, 2 Jan 2013 22:40:27 +0000 (-0800) Subject: net/http: make NewRequest pick a ContentLength from a *bytes.Reader too X-Git-Tag: go1.1rc2~1494 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5e8ca201d10f7cc5bd555a49aa5202cfc670b4a4;p=gostls13.git net/http: make NewRequest pick a ContentLength from a *bytes.Reader too It already did so for its sibling, *strings.Reader, as well as *bytes.Buffer. R=edsrzf, dave, adg, kevlar, remyoudompheng, adg, rsc CC=golang-dev https://golang.org/cl/7031045 --- diff --git a/src/pkg/net/http/request.go b/src/pkg/net/http/request.go index f50e254fb2..3b799108ac 100644 --- a/src/pkg/net/http/request.go +++ b/src/pkg/net/http/request.go @@ -433,10 +433,12 @@ func NewRequest(method, urlStr string, body io.Reader) (*Request, error) { } if body != nil { switch v := body.(type) { - case *strings.Reader: - req.ContentLength = int64(v.Len()) case *bytes.Buffer: req.ContentLength = int64(v.Len()) + case *bytes.Reader: + req.ContentLength = int64(v.Len()) + case *strings.Reader: + req.ContentLength = int64(v.Len()) } } diff --git a/src/pkg/net/http/request_test.go b/src/pkg/net/http/request_test.go index 2f34d12412..fc485fcdf8 100644 --- a/src/pkg/net/http/request_test.go +++ b/src/pkg/net/http/request_test.go @@ -238,6 +238,35 @@ func TestNewRequestHost(t *testing.T) { } } +func TestNewRequestContentLength(t *testing.T) { + readByte := func(r io.Reader) io.Reader { + var b [1]byte + r.Read(b[:]) + return r + } + tests := []struct { + r io.Reader + want int64 + }{ + {bytes.NewReader([]byte("123")), 3}, + {bytes.NewBuffer([]byte("1234")), 4}, + {strings.NewReader("12345"), 5}, + // Not detected: + {struct{ io.Reader }{strings.NewReader("xyz")}, 0}, + {io.NewSectionReader(strings.NewReader("x"), 0, 6), 0}, + {readByte(io.NewSectionReader(strings.NewReader("xy"), 0, 6)), 0}, + } + for _, tt := range tests { + req, err := NewRequest("POST", "http://localhost/", tt.r) + if err != nil { + t.Fatal(err) + } + if req.ContentLength != tt.want { + t.Errorf("ContentLength(%#T) = %d; want %d", tt.r, req.ContentLength, tt.want) + } + } +} + func testMissingFile(t *testing.T, req *Request) { f, fh, err := req.FormFile("missing") if f != nil {