From: Russ Cox Date: Sun, 24 Jan 2016 04:31:23 +0000 (-0500) Subject: net/url: allow spaces in IPv6 zone identifier for Windows X-Git-Tag: go1.6rc1~39 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=038b8139433054c70f17494f4cd96dd4f3ddd696;p=gostls13.git net/url: allow spaces in IPv6 zone identifier for Windows Windows: putting spaces where they don't belong since Windows NT 3.1. Fixes #14002. Change-Id: I48ba8a7bfe3f27f83c8aa8355a8d355933d6c5df Reviewed-on: https://go-review.googlesource.com/18855 Reviewed-by: Brad Fitzpatrick --- diff --git a/src/net/url/url.go b/src/net/url/url.go index 3ea75637ac..1a93e3496e 100644 --- a/src/net/url/url.go +++ b/src/net/url/url.go @@ -193,8 +193,9 @@ func unescape(s string, mode encoding) (string, error) { // that are valid host name bytes in their unescaped form. // That is, you can use escaping in the zone identifier but not // to introduce bytes you couldn't just write directly. + // But Windows puts spaces here! Yay. v := unhex(s[i+1])<<4 | unhex(s[i+2]) - if s[i:i+3] != "%25" && shouldEscape(v, encodeHost) { + if s[i:i+3] != "%25" && v != ' ' && shouldEscape(v, encodeHost) { return "", EscapeError(s[i : i+3]) } } diff --git a/src/net/url/url_test.go b/src/net/url/url_test.go index c31b18980e..d3f8487bd7 100644 --- a/src/net/url/url_test.go +++ b/src/net/url/url_test.go @@ -531,6 +531,17 @@ var urltests = []URLTest{ }, "", }, + // spaces in hosts are disallowed but escaped spaces in IPv6 scope IDs are grudgingly OK. + // This happens on Windows. + // golang.org/issue/14002 + { + "tcp://[2020::2020:20:2020:2020%25Windows%20Loves%20Spaces]:2020", + &URL{ + Scheme: "tcp", + Host: "[2020::2020:20:2020:2020%Windows Loves Spaces]:2020", + }, + "", + }, } // more useful string for debugging than fmt's struct printer