]> Cypherpunks repositories - gostls13.git/commitdiff
http: handle HEAD requests correctly
authorRuss Cox <rsc@golang.org>
Thu, 13 Jan 2011 19:34:31 +0000 (14:34 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 13 Jan 2011 19:34:31 +0000 (14:34 -0500)
R=r, r2
CC=golang-dev
https://golang.org/cl/3939042

src/pkg/http/fs.go
src/pkg/http/server.go

index 143a839a801014e8fa8f9ae1f256a9b794269448..b3cae19a50d2999be4b6137792b657ad0ecd7ac6 100644 (file)
@@ -174,7 +174,9 @@ func serveFile(w ResponseWriter, r *Request, name string, redirect bool) {
 
        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.
index b8783da283164519152bf9de7a2dd2fb2a4603da..2ecdd5ee258b05046a5f3b5c11a49263b311218f 100644 (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("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
                // to avoid closing the connection at EOF.
                w.chunking = true
@@ -268,7 +270,7 @@ func (w *response) Write(data []byte) (n int, err os.Error) {
                return 0, nil
        }
 
-       if w.status == StatusNotModified {
+       if w.status == StatusNotModified || w.req.Method == "HEAD" {
                // Must not have body.
                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
        // response because older user agents may not understand 301/307.
-       note := "<a href=\"" + htmlEscape(url) + "\">" + statusText[code] + "</a>.\n"
-       if r.Method == "POST" {
-               note = ""
+       // Shouldn't send the response for POST or HEAD; that leaves GET.
+       if r.Method == "GET" {
+               note := "<a href=\"" + htmlEscape(url) + "\">" + statusText[code] + "</a>.\n"
+               fmt.Fprintln(w, note)
        }
-       fmt.Fprintln(w, note)
 }
 
 func htmlEscape(s string) string {