]> Cypherpunks repositories - gostls13.git/commitdiff
net/http/httptest: allow multiple fields be present in one Trailer field
authorMaxime Soulé <zeptomax@gmail.com>
Thu, 17 Mar 2022 16:01:24 +0000 (17:01 +0100)
committerDamien Neil <dneil@google.com>
Mon, 11 Apr 2022 23:17:38 +0000 (23:17 +0000)
Fixes #51761

Change-Id: Ibaa17076ba51b666e25333e78180b8c7c4c940ec
Reviewed-on: https://go-review.googlesource.com/c/go/+/393616
Reviewed-by: Damien Neil <dneil@google.com>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
src/net/http/httptest/recorder.go
src/net/http/httptest/recorder_test.go

index 1b712ef2b0a8e8a471ca69f3af76b8d56b18fe5a..1c1d8801558ed73989bdda7ecc4e15533a08529b 100644 (file)
@@ -207,18 +207,20 @@ func (rw *ResponseRecorder) Result() *http.Response {
        if trailers, ok := rw.snapHeader["Trailer"]; ok {
                res.Trailer = make(http.Header, len(trailers))
                for _, k := range trailers {
-                       k = http.CanonicalHeaderKey(k)
-                       if !httpguts.ValidTrailerHeader(k) {
-                               // Ignore since forbidden by RFC 7230, section 4.1.2.
-                               continue
+                       for _, k := range strings.Split(k, ",") {
+                               k = http.CanonicalHeaderKey(textproto.TrimString(k))
+                               if !httpguts.ValidTrailerHeader(k) {
+                                       // Ignore since forbidden by RFC 7230, section 4.1.2.
+                                       continue
+                               }
+                               vv, ok := rw.HeaderMap[k]
+                               if !ok {
+                                       continue
+                               }
+                               vv2 := make([]string, len(vv))
+                               copy(vv2, vv)
+                               res.Trailer[k] = vv2
                        }
-                       vv, ok := rw.HeaderMap[k]
-                       if !ok {
-                               continue
-                       }
-                       vv2 := make([]string, len(vv))
-                       copy(vv2, vv)
-                       res.Trailer[k] = vv2
                }
        }
        for k, vv := range rw.HeaderMap {
index 8cb32dd7403683375f292ab9285d8bb1d7f33696..4782eced43e6ce61c2dcab57b827048224be7f93 100644 (file)
@@ -220,8 +220,7 @@ func TestRecorder(t *testing.T) {
                        "Trailer headers are correctly recorded",
                        func(w http.ResponseWriter, r *http.Request) {
                                w.Header().Set("Non-Trailer", "correct")
-                               w.Header().Set("Trailer", "Trailer-A")
-                               w.Header().Add("Trailer", "Trailer-B")
+                               w.Header().Set("Trailer", "Trailer-A, Trailer-B")
                                w.Header().Add("Trailer", "Trailer-C")
                                io.WriteString(w, "<html>")
                                w.Header().Set("Non-Trailer", "incorrect")