]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: don't MIME sniff if handler set an empty string Content-Type
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 1 Aug 2013 06:38:32 +0000 (23:38 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 1 Aug 2013 06:38:32 +0000 (23:38 -0700)
Fixes #5953

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/12117043

src/pkg/net/http/server.go
src/pkg/net/http/sniff_test.go

index e0f629347e0aa47cf8e4911f56aa47abab044887..5332239edeebff41e55e69d2a91fd566ac327ce7 100644 (file)
@@ -792,7 +792,8 @@ func (cw *chunkWriter) writeHeader(p []byte) {
                }
        } else {
                // If no content type, apply sniffing algorithm to body.
-               if header.get("Content-Type") == "" && w.req.Method != "HEAD" {
+               _, haveType := header["Content-Type"]
+               if !haveType && w.req.Method != "HEAD" {
                        setHeader.contentType = DetectContentType(p)
                }
        }
index 106d94ec1cbe857249714427b42c1e5bf0d14431..24ca27afc16745c82362cfa7ea6a46e84ea5a72a 100644 (file)
@@ -12,6 +12,7 @@ import (
        "log"
        . "net/http"
        "net/http/httptest"
+       "reflect"
        "strconv"
        "strings"
        "testing"
@@ -84,6 +85,29 @@ func TestServerContentType(t *testing.T) {
        }
 }
 
+// Issue 5953: shouldn't sniff if the handler set a Content-Type header,
+// even if it's the empty string.
+func TestServerIssue5953(t *testing.T) {
+       defer afterTest(t)
+       ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
+               w.Header()["Content-Type"] = []string{""}
+               fmt.Fprintf(w, "<html><head></head><body>hi</body></html>")
+       }))
+       defer ts.Close()
+
+       resp, err := Get(ts.URL)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       got := resp.Header["Content-Type"]
+       want := []string{""}
+       if !reflect.DeepEqual(got, want) {
+               t.Errorf("Content-Type = %q; want %q", got, want)
+       }
+       resp.Body.Close()
+}
+
 func TestContentTypeWithCopy(t *testing.T) {
        defer afterTest(t)