]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: pass through server side Transfer-Encoding headers
authorAndrew Gerrand <adg@golang.org>
Wed, 15 Jun 2016 00:52:42 +0000 (10:52 +1000)
committerAndrew Gerrand <adg@golang.org>
Wed, 15 Jun 2016 03:10:47 +0000 (03:10 +0000)
Fixes #16063

Change-Id: I2e8695beb657b0aef067e83f086828d8857787ed
Reviewed-on: https://go-review.googlesource.com/24130
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/http/serve_test.go
src/net/http/server.go

index 8e4bbdc0c4b69a858924bf46816b8851c21ac751..ca30e644c34bf13c97c81eb31811a9c827465d6a 100644 (file)
@@ -9,6 +9,7 @@ package http_test
 import (
        "bufio"
        "bytes"
+       "compress/gzip"
        "context"
        "crypto/tls"
        "encoding/json"
@@ -4200,6 +4201,24 @@ func TestHandlerSetTransferEncodingChunked(t *testing.T) {
        }
 }
 
+// https://golang.org/issue/16063
+func TestHandlerSetTransferEncodingGzip(t *testing.T) {
+       defer afterTest(t)
+       ht := newHandlerTest(HandlerFunc(func(w ResponseWriter, r *Request) {
+               w.Header().Set("Transfer-Encoding", "gzip")
+               gz := gzip.NewWriter(w)
+               gz.Write([]byte("hello"))
+               gz.Close()
+       }))
+       resp := ht.rawResponse("GET / HTTP/1.1\nHost: foo")
+       for _, v := range []string{"gzip", "chunked"} {
+               hdr := "Transfer-Encoding: " + v
+               if n := strings.Count(resp, hdr); n != 1 {
+                       t.Errorf("want 1 occurrence of %q in response, got %v\nresponse: %v", hdr, n, resp)
+               }
+       }
+}
+
 func BenchmarkClientServer(b *testing.B) {
        b.ReportAllocs()
        b.StopTimer()
index 8ecced85db091e5345c278890c448f60f17abb4c..42b6304d4f784c6db0965501adbee4454a4c0da9 100644 (file)
@@ -1147,7 +1147,10 @@ func (cw *chunkWriter) writeHeader(p []byte) {
                        // to avoid closing the connection at EOF.
                        cw.chunking = true
                        setHeader.transferEncoding = "chunked"
-                       delHeader("Transfer-Encoding")
+                       if hasTE && te == "chunked" {
+                               // We will send the chunked Transfer-Encoding header later.
+                               delHeader("Transfer-Encoding")
+                       }
                }
        } else {
                // HTTP version < 1.1: cannot do chunked transfer