]> Cypherpunks repositories - gostls13.git/commitdiff
http: fix sniffing bug causing short writes
authorBrad Fitzpatrick <bradfitz@golang.org>
Mon, 28 Nov 2011 16:51:34 +0000 (11:51 -0500)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 28 Nov 2011 16:51:34 +0000 (11:51 -0500)
R=rsc
CC=golang-dev
https://golang.org/cl/5442045

src/pkg/net/http/server.go
src/pkg/net/http/sniff_test.go

index 27040c7be55210cd02d1dfe78e148d37b065e408..0e8580a6ff6875a029b81d7d36110a9043421c93 100644 (file)
@@ -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)
                }
index 86744eeb56b762f22e517e6ece559ff023baf704..6efa8ce1ca228de6cd938eb76dafa44ed11a3472 100644 (file)
@@ -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)
+               }
+       }
+}