aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/http/server.go
diff options
context:
space:
mode:
authorDavid Symonds <dsymonds@golang.org>2011-07-22 13:52:21 +1000
committerDavid Symonds <dsymonds@golang.org>2011-07-22 13:52:21 +1000
commit99e5d48e59022f83a027e137421faaaf043b6309 (patch)
tree6c95b2966cc8e028f1ad5d4b3aa24981163abe58 /src/pkg/http/server.go
parent3e79c958c4586d2bd70b0e5fd752c74565db6b30 (diff)
downloadgo-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/server.go')
-rw-r--r--src/pkg/http/server.go16
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,