diff options
| author | David Symonds <dsymonds@golang.org> | 2011-07-22 13:52:21 +1000 |
|---|---|---|
| committer | David Symonds <dsymonds@golang.org> | 2011-07-22 13:52:21 +1000 |
| commit | 99e5d48e59022f83a027e137421faaaf043b6309 (patch) | |
| tree | 6c95b2966cc8e028f1ad5d4b3aa24981163abe58 /src/pkg/http | |
| parent | 3e79c958c4586d2bd70b0e5fd752c74565db6b30 (diff) | |
| download | go-99e5d48e59022f83a027e137421faaaf043b6309.tar.xz | |
http: clarify use of w.conn.body in Write when sniffing.
R=gri, r, r, rsc
CC=golang-dev
https://golang.org/cl/4794047
Diffstat (limited to 'src/pkg/http')
| -rw-r--r-- | src/pkg/http/server.go | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/pkg/http/server.go b/src/pkg/http/server.go index f14ef8c04b..96547c4eff 100644 --- a/src/pkg/http/server.go +++ b/src/pkg/http/server.go @@ -359,8 +359,7 @@ func (w *response) sniff() { w.needSniff = false data := w.conn.body - fmt.Fprintf(w.conn.buf, "Content-Type: %s\r\n", DetectContentType(data)) - io.WriteString(w.conn.buf, "\r\n") + fmt.Fprintf(w.conn.buf, "Content-Type: %s\r\n\r\n", DetectContentType(data)) if len(data) == 0 { return @@ -408,10 +407,14 @@ func (w *response) Write(data []byte) (n int, err os.Error) { // We need to sniff the beginning of the output to // determine the content type. Accumulate the // initial writes in w.conn.body. - body := w.conn.body - m = copy(body[len(body):cap(body)], data) - w.conn.body = body[:len(body)+m] - if m == len(data) { + // Cap m so that append won't allocate. + m := cap(w.conn.body) - len(w.conn.body) + if m > len(data) { + m = len(data) + } + w.conn.body = append(w.conn.body, data[:m]...) + data = data[m:] + if len(data) == 0 { // Copied everything into the buffer. // Wait for next write. return m, nil @@ -423,7 +426,6 @@ func (w *response) Write(data []byte) (n int, err os.Error) { // of the data as a normal Write. // Calling sniff clears needSniff. w.sniff() - data = data[m:] } // TODO(rsc): if chunking happened after the buffering, |
