aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-06-03 16:09:37 -0700
committerRuss Cox <rsc@golang.org>2010-06-03 16:09:37 -0700
commit24baca49362dd842de299901ca3c4b685f6f9a89 (patch)
tree754f5a6904501a971d566e0d24d4652986ade097
parent962e8b8736fa202ac1cd5770f8fb2b3a67eb03d7 (diff)
downloadgo-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.go11
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,