Commit 1e85f41f authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

http: fix sniffing bug causing short writes

R=rsc
CC=golang-dev
https://golang.org/cl/5442045
parent 7606079d
...@@ -467,7 +467,7 @@ func (w *response) Write(data []byte) (n int, err error) { ...@@ -467,7 +467,7 @@ func (w *response) Write(data []byte) (n int, err error) {
// determine the content type. Accumulate the // determine the content type. Accumulate the
// initial writes in w.conn.body. // initial writes in w.conn.body.
// Cap m so that append won't allocate. // 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) { if m > len(data) {
m = len(data) m = len(data)
} }
......
...@@ -6,12 +6,14 @@ package http_test ...@@ -6,12 +6,14 @@ package http_test
import ( import (
"bytes" "bytes"
"fmt"
"io" "io"
"io/ioutil" "io/ioutil"
"log" "log"
. "net/http" . "net/http"
"net/http/httptest" "net/http/httptest"
"strconv" "strconv"
"strings"
"testing" "testing"
) )
...@@ -112,3 +114,24 @@ func TestContentTypeWithCopy(t *testing.T) { ...@@ -112,3 +114,24 @@ func TestContentTypeWithCopy(t *testing.T) {
} }
resp.Body.Close() 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)
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment