]> Cypherpunks repositories - gostls13.git/commitdiff
net/http/httputil: make DumpRequest use Request.RequestURI when available
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 20 Oct 2015 22:52:11 +0000 (22:52 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 15 Dec 2015 04:48:33 +0000 (04:48 +0000)
Fixes #10912

Change-Id: If04e3205d5cc43ebfd6864bc59340c8697cbc0af
Reviewed-on: https://go-review.googlesource.com/17592
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/net/http/httputil/dump.go
src/net/http/httputil/dump_test.go

index 0a7003d3eb1ea9c64eaffa849df1e22406cb29b8..6fe8fea110b7cafadf4b92776ee7e5f7d59609ea 100644 (file)
@@ -197,15 +197,29 @@ func DumpRequest(req *http.Request, body bool) (dump []byte, err error) {
 
        var b bytes.Buffer
 
+       // By default, print out the unmodified req.RequestURI, which
+       // is always set for incoming server requests. But because we
+       // previously used req.URL.RequestURI and the docs weren't
+       // always so clear about when to use DumpRequest vs
+       // DumpRequestOut, fall back to the old way if the caller
+       // provides a non-server Request.
+       reqURI := req.RequestURI
+       if reqURI == "" {
+               reqURI = req.URL.RequestURI()
+       }
+
        fmt.Fprintf(&b, "%s %s HTTP/%d.%d\r\n", valueOrDefault(req.Method, "GET"),
-               req.URL.RequestURI(), req.ProtoMajor, req.ProtoMinor)
+               reqURI, req.ProtoMajor, req.ProtoMinor)
 
-       host := req.Host
-       if host == "" && req.URL != nil {
-               host = req.URL.Host
-       }
-       if host != "" {
-               fmt.Fprintf(&b, "Host: %s\r\n", host)
+       absRequestURI := strings.HasPrefix(req.RequestURI, "http://") || strings.HasPrefix(req.RequestURI, "https://")
+       if !absRequestURI {
+               host := req.Host
+               if host == "" && req.URL != nil {
+                       host = req.URL.Host
+               }
+               if host != "" {
+                       fmt.Fprintf(&b, "Host: %s\r\n", host)
+               }
        }
 
        chunked := len(req.TransferEncoding) > 0 && req.TransferEncoding[0] == "chunked"
index ae67e983ae9db6423e56eaa28d7f6700c6c21ca6..46bf521723afbfc88098c17a913edc8426819057 100644 (file)
@@ -5,6 +5,7 @@
 package httputil
 
 import (
+       "bufio"
        "bytes"
        "fmt"
        "io"
@@ -135,6 +136,14 @@ var dumpTests = []dumpTest{
                        "Accept-Encoding: gzip\r\n\r\n" +
                        strings.Repeat("a", 8193),
        },
+
+       {
+               Req: *mustReadRequest("GET http://foo.com/ HTTP/1.1\r\n" +
+                       "User-Agent: blah\r\n\r\n"),
+               NoBody: true,
+               WantDump: "GET http://foo.com/ HTTP/1.1\r\n" +
+                       "User-Agent: blah\r\n\r\n",
+       },
 }
 
 func TestDumpRequest(t *testing.T) {
@@ -211,6 +220,14 @@ func mustNewRequest(method, url string, body io.Reader) *http.Request {
        return req
 }
 
+func mustReadRequest(s string) *http.Request {
+       req, err := http.ReadRequest(bufio.NewReader(strings.NewReader(s)))
+       if err != nil {
+               panic(err)
+       }
+       return req
+}
+
 var dumpResTests = []struct {
        res  *http.Response
        body bool