]> Cypherpunks repositories - gostls13.git/commitdiff
net/http/httputil: allow MIME parameters when detecting SSE in ReverseProxy
authorJames Harris <mailjamesharris@gmail.com>
Fri, 17 Sep 2021 02:29:00 +0000 (02:29 +0000)
committerDamien Neil <dneil@google.com>
Wed, 13 Oct 2021 17:16:12 +0000 (17:16 +0000)
This change allows httputil.ReverseProxy to detect SSE (server-sent events)
content when the response's Content-Type header includes MIME parameters,
such as "text/event-stream;charset=utf-8".

Prior to this change the value of the Content-Type header was compared
directly to the literal "text/event-stream". This caused a false-negative
which failed to set the FlushInterval correctly when MIME parameters were
present.

Change-Id: If8bb43efb78787b6519d7fe7599ca018a0da0023
GitHub-Last-Rev: 224518c5eb9686ee050c79f5f853ebacfdf6fc42
GitHub-Pull-Request: golang/go#48427
Reviewed-on: https://go-review.googlesource.com/c/go/+/350509
Trust: Alexander Rakoczy <alex@golang.org>
Trust: Damien Neil <dneil@google.com>
Run-TryBot: Alexander Rakoczy <alex@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
src/net/http/httputil/reverseproxy.go
src/net/http/httputil/reverseproxy_test.go

index 8b63368386f43ba81a574e571ada7bcfffd195e0..71849bb8f72f5202c4757bb19d873f48e61af330 100644 (file)
@@ -11,6 +11,7 @@ import (
        "fmt"
        "io"
        "log"
+       "mime"
        "net"
        "net/http"
        "net/http/internal/ascii"
@@ -412,7 +413,7 @@ func (p *ReverseProxy) flushInterval(res *http.Response) time.Duration {
 
        // For Server-Sent Events responses, flush immediately.
        // The MIME type is defined in https://www.w3.org/TR/eventsource/#text-event-stream
-       if resCT == "text/event-stream" {
+       if baseCT, _, _ := mime.ParseMediaType(resCT); baseCT == "text/event-stream" {
                return -1 // negative means immediately
        }
 
index 4b6ad77a29466fe0fbb9f1e79fa1bd804b2264ea..90e8903e9cfd5bfa3086422cb9f442a0861bd250 100644 (file)
@@ -1194,6 +1194,26 @@ func TestSelectFlushInterval(t *testing.T) {
                        p:    &ReverseProxy{FlushInterval: 0},
                        want: -1,
                },
+               {
+                       name: "server-sent events with media-type parameters overrides non-zero",
+                       res: &http.Response{
+                               Header: http.Header{
+                                       "Content-Type": {"text/event-stream;charset=utf-8"},
+                               },
+                       },
+                       p:    &ReverseProxy{FlushInterval: 123},
+                       want: -1,
+               },
+               {
+                       name: "server-sent events with media-type parameters overrides zero",
+                       res: &http.Response{
+                               Header: http.Header{
+                                       "Content-Type": {"text/event-stream;charset=utf-8"},
+                               },
+                       },
+                       p:    &ReverseProxy{FlushInterval: 0},
+                       want: -1,
+               },
                {
                        name: "Content-Length: -1, overrides non-zero",
                        res: &http.Response{