]> Cypherpunks repositories - gostls13.git/commitdiff
net/url: allow *User functions to work on a nil receiver.
authorOneOfOne <oneofone@gmail.com>
Sat, 8 Jul 2017 18:19:25 +0000 (20:19 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 15 Nov 2017 02:55:06 +0000 (02:55 +0000)
Fixes #20924

Change-Id: If89f31da63cbea38d7e615a428b7b07629770a45
Reviewed-on: https://go-review.googlesource.com/47851
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Tim Cooper <tim.cooper@layeh.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/net/url/url.go
src/net/url/url_test.go

index 92c9c27d705b9aec05661454d06ddbb3b72fe6c3..bb44be31171483d90c20905cb2d6517f3d57630c 100644 (file)
@@ -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)
index 604b323601faec7b307b8d1d0ebf61261b2480b3..d6aed3acafab977dc690832e52b6a3c8cd608d82 100644 (file)
@@ -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)
+       }
+}