1
0
mirror of https://github.com/golang/go synced 2024-11-22 03:34:40 -07:00

http: handle HEAD requests correctly

R=r, r2
CC=golang-dev
https://golang.org/cl/3939042
This commit is contained in:
Russ Cox 2011-01-13 14:34:31 -05:00
parent 97025ebfef
commit cdb0bbf4d5
2 changed files with 11 additions and 7 deletions

View File

@ -174,7 +174,9 @@ func serveFile(w ResponseWriter, r *Request, name string, redirect bool) {
w.WriteHeader(code) w.WriteHeader(code)
io.Copyn(w, f, size) if r.Method != "HEAD" {
io.Copyn(w, f, size)
}
} }
// ServeFile replies to the request with the contents of the named file or directory. // ServeFile replies to the request with the contents of the named file or directory.

View File

@ -181,7 +181,9 @@ func (c *conn) readRequest() (w *response, err os.Error) {
w.SetHeader("Content-Type", "text/html; charset=utf-8") w.SetHeader("Content-Type", "text/html; charset=utf-8")
w.SetHeader("Date", time.UTC().Format(TimeFormat)) w.SetHeader("Date", time.UTC().Format(TimeFormat))
if req.ProtoAtLeast(1, 1) { if req.Method == "HEAD" {
// do nothing
} else if req.ProtoAtLeast(1, 1) {
// HTTP/1.1 or greater: use chunked transfer encoding // HTTP/1.1 or greater: use chunked transfer encoding
// to avoid closing the connection at EOF. // to avoid closing the connection at EOF.
w.chunking = true w.chunking = true
@ -268,7 +270,7 @@ func (w *response) Write(data []byte) (n int, err os.Error) {
return 0, nil return 0, nil
} }
if w.status == StatusNotModified { if w.status == StatusNotModified || w.req.Method == "HEAD" {
// Must not have body. // Must not have body.
return 0, ErrBodyNotAllowed return 0, ErrBodyNotAllowed
} }
@ -495,11 +497,11 @@ func Redirect(w ResponseWriter, r *Request, url string, code int) {
// RFC2616 recommends that a short note "SHOULD" be included in the // RFC2616 recommends that a short note "SHOULD" be included in the
// response because older user agents may not understand 301/307. // response because older user agents may not understand 301/307.
note := "<a href=\"" + htmlEscape(url) + "\">" + statusText[code] + "</a>.\n" // Shouldn't send the response for POST or HEAD; that leaves GET.
if r.Method == "POST" { if r.Method == "GET" {
note = "" note := "<a href=\"" + htmlEscape(url) + "\">" + statusText[code] + "</a>.\n"
fmt.Fprintln(w, note)
} }
fmt.Fprintln(w, note)
} }
func htmlEscape(s string) string { func htmlEscape(s string) string {