From: Brad Fitzpatrick Date: Wed, 26 Sep 2018 17:54:47 +0000 (+0000) Subject: Revert "net/url: escape URL.RawQuery on Parse if it contains invalid characters" X-Git-Tag: go1.12beta1~1002 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b50210f5719c15cd512857e2e29e1de152155b35;p=gostls13.git Revert "net/url: escape URL.RawQuery on Parse if it contains invalid characters" This reverts commit CL 99135 (git rev 1040626c0ce4a1bc2b312aa0866ffeb2ff53c1ab). Reason for revert: breaks valid code; see #27302 Fixes #27302 Updates #22907 Change-Id: I82bb0c28ae1683140c71e7a2224c4ded3f4acea1 Reviewed-on: https://go-review.googlesource.com/137716 Reviewed-by: Ian Lance Taylor --- diff --git a/src/net/url/url.go b/src/net/url/url.go index b678b82352..702f9124bf 100644 --- a/src/net/url/url.go +++ b/src/net/url/url.go @@ -534,13 +534,7 @@ func parse(rawurl string, viaRequest bool) (*URL, error) { url.ForceQuery = true rest = rest[:len(rest)-1] } else { - var q string - rest, q = split(rest, "?", true) - if validQuery(q) { - url.RawQuery = q - } else { - url.RawQuery = QueryEscape(q) - } + rest, url.RawQuery = split(rest, "?", true) } if !strings.HasPrefix(rest, "/") { @@ -1139,46 +1133,3 @@ func validUserinfo(s string) bool { } return true } - -// validQuery reports whether s is a valid query string per RFC 3986 -// Section 3.4: -// query = *( pchar / "/" / "?" ) -// pchar = unreserved / pct-encoded / sub-delims / ":" / "@" -// unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" -// sub-delims = "!" / "$" / "&" / "'" / "(" / ")" -// / "*" / "+" / "," / ";" / "=" -func validQuery(s string) bool { - pctEnc := 0 - - for _, r := range s { - if pctEnc > 0 { - if uint32(r) > 255 || !ishex(byte(r)) { - return false - } - pctEnc-- - continue - } else if r == '%' { - pctEnc = 2 - continue - } - - if 'A' <= r && r <= 'Z' { - continue - } - if 'a' <= r && r <= 'z' { - continue - } - if '0' <= r && r <= '9' { - continue - } - switch r { - case '-', '.', '_', '~', '!', '$', '&', '\'', '(', ')', - '*', '+', ',', ';', '=', ':', '@', '/', '?': - continue - default: - return false - } - } - - return true -} diff --git a/src/net/url/url_test.go b/src/net/url/url_test.go index 231340a9eb..5d3f91248f 100644 --- a/src/net/url/url_test.go +++ b/src/net/url/url_test.go @@ -590,16 +590,6 @@ var urltests = []URLTest{ }, "mailto:?subject=hi", }, - { - "https://example.com/search?q=Фотки собак&source=lnms", - &URL{ - Scheme: "https", - Host: "example.com", - Path: "/search", - RawQuery: "q%3D%D0%A4%D0%BE%D1%82%D0%BA%D0%B8+%D1%81%D0%BE%D0%B1%D0%B0%D0%BA%26source%3Dlnms", - }, - "https://example.com/search?q%3D%D0%A4%D0%BE%D1%82%D0%BA%D0%B8+%D1%81%D0%BE%D0%B1%D0%B0%D0%BA%26source%3Dlnms", - }, } // more useful string for debugging than fmt's struct printer @@ -1449,7 +1439,6 @@ func TestParseErrors(t *testing.T) { {"cache_object:foo", true}, {"cache_object:foo/bar", true}, {"cache_object/:foo/bar", false}, - {"https://example.com/search?q=Фотки собак&source=lnms", false}, } for _, tt := range tests { u, err := Parse(tt.in)