diff options
author | Russ Cox <rsc@golang.org> | 2010-06-03 16:09:37 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-06-03 16:09:37 -0700 |
commit | 24baca49362dd842de299901ca3c4b685f6f9a89 (patch) | |
tree | 754f5a6904501a971d566e0d24d4652986ade097 | |
parent | 962e8b8736fa202ac1cd5770f8fb2b3a67eb03d7 (diff) | |
download | go-24baca49362dd842de299901ca3c4b685f6f9a89.tar.gz go-24baca49362dd842de299901ca3c4b685f6f9a89.zip |
http: handle status 304 correctly
- cannot send body
- should not send body-related headers
R=r
CC=golang-dev
https://golang.org/cl/1499041
-rw-r--r-- | src/pkg/http/server.go | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/pkg/http/server.go b/src/pkg/http/server.go index a28eb25ee4..9f0bc66087 100644 --- a/src/pkg/http/server.go +++ b/src/pkg/http/server.go @@ -26,6 +26,7 @@ import ( // Errors introduced by the HTTP server. var ( ErrWriteAfterFlush = os.NewError("Conn.Write called after Flush") + ErrBodyNotAllowed = os.NewError("http: response status code does not allow body") ErrHijacked = os.NewError("Conn has been hijacked") ) @@ -138,6 +139,11 @@ func (c *Conn) WriteHeader(code int) { } c.wroteHeader = true c.status = code + if code == StatusNotModified { + // Must not have body. + c.header["Content-Type"] = "", false + c.header["Transfer-Encoding"] = "", false + } c.written = 0 if !c.Req.ProtoAtLeast(1, 0) { return @@ -173,6 +179,11 @@ func (c *Conn) Write(data []byte) (n int, err os.Error) { return 0, nil } + if c.status == StatusNotModified { + // Must not have body. + return 0, ErrBodyNotAllowed + } + c.written += int64(len(data)) // ignoring errors, for errorKludge // TODO(rsc): if chunking happened after the buffering, |