]> Cypherpunks repositories - gostls13.git/commitdiff
net/url: better parsing of urls with @ symbol in authority
authorAlexey Borzenkov <snaury@gmail.com>
Tue, 22 May 2012 16:44:24 +0000 (12:44 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 22 May 2012 16:44:24 +0000 (12:44 -0400)
Fixes #3439

R=r, rsc, dsymonds, n13m3y3r
CC=golang-dev
https://golang.org/cl/6206090

src/pkg/net/url/url.go
src/pkg/net/url/url_test.go

index b6e79adc29af421e8e20b71ca1405e559570af4f..17bf0d3a342f394b3db0b9921251829aa9c1423c 100644 (file)
@@ -401,11 +401,12 @@ Error:
 }
 
 func parseAuthority(authority string) (user *Userinfo, host string, err error) {
-       if strings.Index(authority, "@") < 0 {
+       i := strings.LastIndex(authority, "@")
+       if i < 0 {
                host = authority
                return
        }
-       userinfo, host := split(authority, '@', true)
+       userinfo, host := authority[:i], authority[i+1:]
        if strings.Index(userinfo, ":") < 0 {
                if userinfo, err = unescape(userinfo, encodeUserPassword); err != nil {
                        return
index d8b253142f0c6df1a4199d1ca93244e5321ba6a8..75e8abe4eb3ff74a099d77f960e1a9b2b6a32fc8 100644 (file)
@@ -188,6 +188,37 @@ var urltests = []URLTest{
                },
                "http://user:password@google.com",
        },
+       // unescaped @ in username should not confuse host
+       {
+               "http://j@ne:password@google.com",
+               &URL{
+                       Scheme: "http",
+                       User:   UserPassword("j@ne", "password"),
+                       Host:   "google.com",
+               },
+               "http://j%40ne:password@google.com",
+       },
+       // unescaped @ in password should not confuse host
+       {
+               "http://jane:p@ssword@google.com",
+               &URL{
+                       Scheme: "http",
+                       User:   UserPassword("jane", "p@ssword"),
+                       Host:   "google.com",
+               },
+               "http://jane:p%40ssword@google.com",
+       },
+       {
+               "http://j@ne:password@google.com/p@th?q=@go",
+               &URL{
+                       Scheme:   "http",
+                       User:     UserPassword("j@ne", "password"),
+                       Host:     "google.com",
+                       Path:     "/p@th",
+                       RawQuery: "q=@go",
+               },
+               "http://j%40ne:password@google.com/p@th?q=@go",
+       },
        {
                "http://www.google.com/?q=go+language#foo",
                &URL{