Skip to content
This repository has been archived by the owner on Feb 15, 2019. It is now read-only.

Commit

Permalink
Parse the MIME media type from the Content-Type header
Browse files Browse the repository at this point in the history
* Rather than just checking the raw header value
* Don't parse the header if we're streaming everything anyway
  • Loading branch information
JayH5 committed Jul 20, 2016
1 parent a23b69f commit 3a329f9
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 1 deletion.
8 changes: 7 additions & 1 deletion forward/fwd.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,13 @@ func (f *httpForwarder) serveHTTP(w http.ResponseWriter, req *http.Request, ctx
utils.RemoveHeaders(w.Header(), HopHeaders...)
w.WriteHeader(response.StatusCode)

stream := "text/event-stream" == response.Header.Get(ContentType) || f.streamResponse
stream := f.streamResponse
if ! stream {
contentType, err := utils.GetHeaderMediaType(response.Header, ContentType)
if err == nil {
stream = contentType == "text/event-stream"
}
}
written, err := io.Copy(newResponseFlusher(w, stream), response.Body)

if req.TLS != nil {
Expand Down
7 changes: 7 additions & 0 deletions utils/netutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package utils
import (
"bufio"
"io"
"mime"
"net"
"net/http"
"net/url"
Expand Down Expand Up @@ -129,3 +130,9 @@ func RemoveHeaders(headers http.Header, names ...string) {
headers.Del(h)
}
}

// Parse the MIME media type value of a header.
func GetHeaderMediaType(headers http.Header, name string) (string, error) {
mediatype, _, err := mime.ParseMediaType(headers.Get(name))
return mediatype, err
}
27 changes: 27 additions & 0 deletions utils/netutils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,30 @@ func (s *NetUtilsSuite) TestRemoveHeaders(c *C) {
c.Assert(source.Get("a"), Equals, "")
c.Assert(source.Get("c"), Equals, "d")
}

func (s *NetUtilsSuite) TestGetHeaderMediaType(c *C) {
source := make(http.Header)
source.Add("Content-Type", "text/event-stream")

mediatype, err := GetHeaderMediaType(source, "Content-Type")
c.Assert(err, IsNil)
c.Assert(mediatype, Equals, "text/event-stream")
}

func (s *NetUtilsSuite) TestGetHeaderMediaTypeCharSet(c *C) {
source := make(http.Header)
source.Add("Content-Type", "text/event-stream; charset=utf-8")

mediatype, err := GetHeaderMediaType(source, "Content-Type")
c.Assert(err, IsNil)
c.Assert(mediatype, Equals, "text/event-stream")
}

func (s *NetUtilsSuite) TestGetHeaderMediaTypeMixedCase(c *C) {
source := make(http.Header)
source.Add("Content-Type", "text/Event-Stream")

mediatype, err := GetHeaderMediaType(source, "Content-Type")
c.Assert(err, IsNil)
c.Assert(mediatype, Equals, "text/event-stream")
}

0 comments on commit 3a329f9

Please sign in to comment.