diff options
author | Brad Fitzpatrick <bradfitz@golang.org> | 2011-11-28 11:51:34 -0500 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2011-11-28 11:51:34 -0500 |
commit | 368125ad16c01c35ec59ddcfb2dd2a623fae4622 (patch) | |
tree | 4832040c04dc4ff9934f9ea22ea9e1751e5824b5 | |
parent | 08621a743069b921be6415a5937c40732e1afa5d (diff) | |
download | go-368125ad16c01c35ec59ddcfb2dd2a623fae4622.tar.gz |
http: fix sniffing bug causing short writes
R=rsc
CC=golang-dev
http://codereview.appspot.com/5442045
-rw-r--r-- | src/pkg/net/http/server.go | 2 | ||||
-rw-r--r-- | src/pkg/net/http/sniff_test.go | 23 |
2 files changed, 24 insertions, 1 deletions
diff --git a/src/pkg/net/http/server.go b/src/pkg/net/http/server.go index 27040c7be..0e8580a6f 100644 --- a/src/pkg/net/http/server.go +++ b/src/pkg/net/http/server.go @@ -467,7 +467,7 @@ func (w *response) Write(data []byte) (n int, err error) { // determine the content type. Accumulate the // initial writes in w.conn.body. // Cap m so that append won't allocate. - m := cap(w.conn.body) - len(w.conn.body) + m = cap(w.conn.body) - len(w.conn.body) if m > len(data) { m = len(data) } diff --git a/src/pkg/net/http/sniff_test.go b/src/pkg/net/http/sniff_test.go index 86744eeb5..6efa8ce1c 100644 --- a/src/pkg/net/http/sniff_test.go +++ b/src/pkg/net/http/sniff_test.go @@ -6,12 +6,14 @@ package http_test import ( "bytes" + "fmt" "io" "io/ioutil" "log" . "net/http" "net/http/httptest" "strconv" + "strings" "testing" ) @@ -112,3 +114,24 @@ func TestContentTypeWithCopy(t *testing.T) { } resp.Body.Close() } + +func TestSniffWriteSize(t *testing.T) { + ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) { + size, _ := strconv.Atoi(r.FormValue("size")) + written, err := io.WriteString(w, strings.Repeat("a", size)) + if err != nil { + t.Errorf("write of %d bytes: %v", size, err) + return + } + if written != size { + t.Errorf("write of %d bytes wrote %d bytes", size, written) + } + })) + defer ts.Close() + for _, size := range []int{0, 1, 200, 600, 999, 1000, 1023, 1024, 512 << 10, 1 << 20} { + _, err := Get(fmt.Sprintf("%s/?size=%d", ts.URL, size)) + if err != nil { + t.Fatalf("size %d: %v", size, err) + } + } +} |