From: OneOfOne Date: Sat, 8 Jul 2017 18:19:25 +0000 (+0200) Subject: net/url: allow *User functions to work on a nil receiver. X-Git-Tag: go1.10beta1~276 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=466e299d6b6f98e86a5284afab1e6068867de66b;p=gostls13.git net/url: allow *User functions to work on a nil receiver. Fixes #20924 Change-Id: If89f31da63cbea38d7e615a428b7b07629770a45 Reviewed-on: https://go-review.googlesource.com/47851 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Tim Cooper Reviewed-by: Brad Fitzpatrick --- diff --git a/src/net/url/url.go b/src/net/url/url.go index 92c9c27d70..bb44be3117 100644 --- a/src/net/url/url.go +++ b/src/net/url/url.go @@ -372,17 +372,26 @@ type Userinfo struct { // Username returns the username. func (u *Userinfo) Username() string { + if u == nil { + return "" + } return u.username } // Password returns the password in case it is set, and whether it is set. func (u *Userinfo) Password() (string, bool) { + if u == nil { + return "", false + } return u.password, u.passwordSet } // String returns the encoded userinfo information in the standard form // of "username[:password]". func (u *Userinfo) String() string { + if u == nil { + return "" + } s := escape(u.username, encodeUserPassword) if u.passwordSet { s += ":" + escape(u.password, encodeUserPassword) diff --git a/src/net/url/url_test.go b/src/net/url/url_test.go index 604b323601..d6aed3acaf 100644 --- a/src/net/url/url_test.go +++ b/src/net/url/url_test.go @@ -1709,3 +1709,29 @@ func TestGob(t *testing.T) { t.Errorf("json decoded to: %s\nwant: %s\n", u1, u) } } + +func TestNilUser(t *testing.T) { + defer func() { + if v := recover(); v != nil { + t.Fatalf("unexpected panic: %v", v) + } + }() + + u, err := Parse("http://foo.com/") + + if err != nil { + t.Fatalf("parse err: %v", err) + } + + if v := u.User.Username(); v != "" { + t.Fatalf("expected empty username, got %s", v) + } + + if v, ok := u.User.Password(); v != "" || ok { + t.Fatalf("expected empty password, got %s (%v)", v, ok) + } + + if v := u.User.String(); v != "" { + t.Fatalf("expected empty string, got %s", v) + } +}