Commit 61ffec4b authored by Quentin Renard's avatar Quentin Renard Committed by Brad Fitzpatrick

net/http: returned typed error on Transport proxy dial

Fixes #16997

Change-Id: I9ca27d8cff1905584862997d0e8a11ce3c4c21cb
Reviewed-on: https://go-review.googlesource.com/30750Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 92568bcb
...@@ -991,7 +991,8 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (*persistCon ...@@ -991,7 +991,8 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (*persistCon
conn, err := t.dial(ctx, "tcp", cm.addr()) conn, err := t.dial(ctx, "tcp", cm.addr())
if err != nil { if err != nil {
if cm.proxyURL != nil { if cm.proxyURL != nil {
err = fmt.Errorf("http: error connecting to proxy %s: %v", cm.proxyURL, err) // Return a typed error, per Issue 16997:
err = &net.OpError{Op: "proxyconnect", Net: "tcp", Err: err}
} }
return nil, err return nil, err
} }
......
...@@ -963,6 +963,48 @@ func TestTransportProxy(t *testing.T) { ...@@ -963,6 +963,48 @@ func TestTransportProxy(t *testing.T) {
} }
} }
// Issue 16997: test transport dial preserves typed errors
func TestTransportDialPreservesNetOpProxyError(t *testing.T) {
defer afterTest(t)
var errDial = errors.New("some dial error")
tr := &Transport{
Proxy: func(*Request) (*url.URL, error) {
return url.Parse("http://proxy.fake.tld/")
},
Dial: func(string, string) (net.Conn, error) {
return nil, errDial
},
}
defer tr.CloseIdleConnections()
c := &Client{Transport: tr}
req, _ := NewRequest("GET", "http://fake.tld", nil)
res, err := c.Do(req)
if err == nil {
res.Body.Close()
t.Fatal("wanted a non-nil error")
}
uerr, ok := err.(*url.Error)
if !ok {
t.Fatalf("got %T, want *url.Error", err)
}
oe, ok := uerr.Err.(*net.OpError)
if !ok {
t.Fatalf("url.Error.Err = %T; want *net.OpError", uerr.Err)
}
want := &net.OpError{
Op: "proxyconnect",
Net: "tcp",
Err: errDial, // original error, unwrapped.
}
if !reflect.DeepEqual(oe, want) {
t.Errorf("Got error %#v; want %#v", oe, want)
}
}
// TestTransportGzipRecursive sends a gzip quine and checks that the // TestTransportGzipRecursive sends a gzip quine and checks that the
// client gets the same value back. This is more cute than anything, // client gets the same value back. This is more cute than anything,
// but checks that we don't recurse forever, and checks that // but checks that we don't recurse forever, and checks that
......
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