1
0
mirror of https://github.com/golang/go synced 2024-11-18 18:04:46 -07:00

net/url: normalize scheme to lower case (http not HTTP)

Also document %2f vs / ambiguity in URL.Path.

Fixes #3913.
Fixes #3659.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/7225076
This commit is contained in:
Russ Cox 2013-01-31 13:45:43 -08:00
parent d314e3a68e
commit 4085426f7d
2 changed files with 16 additions and 0 deletions

View File

@ -220,6 +220,12 @@ func escape(s string, mode encoding) string {
//
// scheme:opaque[?query][#fragment]
//
// Note that the Path field is stored in decoded form: /%47%6f%2f becomes /Go/.
// A consequence is that it is impossible to tell which slashes in the Path were
// slashes in the raw URL and which were %2f. This distinction is rarely important,
// but when it is a client must use other routines to parse the raw URL or construct
// the parsed URL. For example, an HTTP server can consult req.RequestURI, and
// an HTTP client can use URL{Opaque: "/Go%2f"} instead of URL{Path: "/Go/"}.
type URL struct {
Scheme string
Opaque string // encoded opaque data
@ -371,6 +377,7 @@ func parse(rawurl string, viaRequest bool) (url *URL, err error) {
if url.Scheme, rest, err = getscheme(rawurl); err != nil {
goto Error
}
url.Scheme = strings.ToLower(url.Scheme)
rest, url.RawQuery = split(rest, '?', true)

View File

@ -251,6 +251,15 @@ var urltests = []URLTest{
},
"file:///home/adg/rabbits",
},
// case-insensitive scheme
{
"MaIlTo:webmaster@golang.org",
&URL{
Scheme: "mailto",
Opaque: "webmaster@golang.org",
},
"mailto:webmaster@golang.org",
},
}
// more useful string for debugging than fmt's struct printer