]> Cypherpunks repositories - gostls13.git/commitdiff
net/url: fix parsing of URLs ending in question mark
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 2 Mar 2016 00:46:36 +0000 (00:46 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 2 Mar 2016 03:05:18 +0000 (03:05 +0000)
Fixes parsing regression from https://golang.org/cl/19931 which
added the URL.ForceQuery field.

Fixes #14573

Change-Id: I89575cab3f778b1bf78b2389623c866450b26943
Reviewed-on: https://go-review.googlesource.com/20116
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Andrew Gerrand <adg@golang.org>
src/net/url/url.go
src/net/url/url_test.go

index d2ec3333107edc83e9641653442eff6ddcab2446..d9c8c49e94a48393047f3dfa94070b65ebc66f2a 100644 (file)
@@ -461,7 +461,7 @@ func parse(rawurl string, viaRequest bool) (url *URL, err error) {
        }
        url.Scheme = strings.ToLower(url.Scheme)
 
-       if strings.HasSuffix(rest, "?") {
+       if strings.HasSuffix(rest, "?") && strings.Count(rest, "?") == 1 {
                url.ForceQuery = true
                rest = rest[:len(rest)-1]
        } else {
index a3088ec0a3867d9b48eaba46b3bda98d915bbd9d..896a5da341b35676a3e4ace55f499b53fa228e2f 100644 (file)
@@ -83,6 +83,17 @@ var urltests = []URLTest{
                },
                "",
        },
+       // query ending in question mark (Issue 14573)
+       {
+               "http://www.google.com/?foo=bar?",
+               &URL{
+                       Scheme:   "http",
+                       Host:     "www.google.com",
+                       Path:     "/",
+                       RawQuery: "foo=bar?",
+               },
+               "",
+       },
        // query
        {
                "http://www.google.com/?q=go+language",
@@ -564,8 +575,8 @@ func ufmt(u *URL) string {
                        pass = p
                }
        }
-       return fmt.Sprintf("opaque=%q, scheme=%q, user=%#v, pass=%#v, host=%q, path=%q, rawpath=%q, rawq=%q, frag=%q",
-               u.Opaque, u.Scheme, user, pass, u.Host, u.Path, u.RawPath, u.RawQuery, u.Fragment)
+       return fmt.Sprintf("opaque=%q, scheme=%q, user=%#v, pass=%#v, host=%q, path=%q, rawpath=%q, rawq=%q, frag=%q, forcequery=%v",
+               u.Opaque, u.Scheme, user, pass, u.Host, u.Path, u.RawPath, u.RawQuery, u.Fragment, u.ForceQuery)
 }
 
 func DoTest(t *testing.T, parse func(string) (*URL, error), name string, tests []URLTest) {