Commit 1b1039a1 authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

net/http/httputil: fix DumpRequestOut on https URLs

Don't try to do an SSL negotiation with a *bytes.Buffer.

Fixes #3135

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/5709050
parent e266d606
...@@ -59,6 +59,15 @@ func DumpRequestOut(req *http.Request, body bool) ([]byte, error) { ...@@ -59,6 +59,15 @@ func DumpRequestOut(req *http.Request, body bool) ([]byte, error) {
} }
} }
// Since we're using the actual Transport code to write the request,
// switch to http so the Transport doesn't try to do an SSL
// negotiation with our dumpConn and its bytes.Buffer & pipe.
// The wire format for https and http are the same, anyway.
if req.URL.Scheme == "https" {
defer func() { req.URL.Scheme = "https" }()
req.URL.Scheme = "http"
}
// Use the actual Transport code to record what we would send // Use the actual Transport code to record what we would send
// on the wire, but not using TCP. Use a Transport with a // on the wire, but not using TCP. Use a Transport with a
// customer dialer that returns a fake net.Conn that waits // customer dialer that returns a fake net.Conn that waits
......
...@@ -71,6 +71,18 @@ var dumpTests = []dumpTest{ ...@@ -71,6 +71,18 @@ var dumpTests = []dumpTest{
"User-Agent: Go http package\r\n" + "User-Agent: Go http package\r\n" +
"Accept-Encoding: gzip\r\n\r\n", "Accept-Encoding: gzip\r\n\r\n",
}, },
// Test that an https URL doesn't try to do an SSL negotiation
// with a bytes.Buffer and hang with all goroutines not
// runnable.
{
Req: *mustNewRequest("GET", "https://example.com/foo", nil),
WantDumpOut: "GET /foo HTTP/1.1\r\n" +
"Host: example.com\r\n" +
"User-Agent: Go http package\r\n" +
"Accept-Encoding: gzip\r\n\r\n",
},
} }
func TestDumpRequest(t *testing.T) { func TestDumpRequest(t *testing.T) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment