Commit 24baca49 authored by Russ Cox's avatar Russ Cox

http: handle status 304 correctly

  - cannot send body
  - should not send body-related headers

R=r
CC=golang-dev
https://golang.org/cl/1499041
parent 962e8b87
...@@ -26,6 +26,7 @@ import ( ...@@ -26,6 +26,7 @@ import (
// Errors introduced by the HTTP server. // Errors introduced by the HTTP server.
var ( var (
ErrWriteAfterFlush = os.NewError("Conn.Write called after Flush") 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") ErrHijacked = os.NewError("Conn has been hijacked")
) )
...@@ -138,6 +139,11 @@ func (c *Conn) WriteHeader(code int) { ...@@ -138,6 +139,11 @@ func (c *Conn) WriteHeader(code int) {
} }
c.wroteHeader = true c.wroteHeader = true
c.status = code c.status = code
if code == StatusNotModified {
// Must not have body.
c.header["Content-Type"] = "", false
c.header["Transfer-Encoding"] = "", false
}
c.written = 0 c.written = 0
if !c.Req.ProtoAtLeast(1, 0) { if !c.Req.ProtoAtLeast(1, 0) {
return return
...@@ -173,6 +179,11 @@ func (c *Conn) Write(data []byte) (n int, err os.Error) { ...@@ -173,6 +179,11 @@ func (c *Conn) Write(data []byte) (n int, err os.Error) {
return 0, nil return 0, nil
} }
if c.status == StatusNotModified {
// Must not have body.
return 0, ErrBodyNotAllowed
}
c.written += int64(len(data)) // ignoring errors, for errorKludge c.written += int64(len(data)) // ignoring errors, for errorKludge
// TODO(rsc): if chunking happened after the buffering, // TODO(rsc): if chunking happened after the buffering,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment