What version of Go are you using (go version
)?
$ go version go version go1.11.1 darwin/amd64
Does this issue reproduce with the latest release?
Yes, see playground.
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go env GOARCH="amd64" GOBIN="" GOCACHE="/Users/neilalexander/Library/Caches/go-build" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/neilalexander/go" GOPROXY="" GORACE="" GOROOT="/usr/local/go" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" GCCGO="gccgo" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/cv/wv7k9w2s4qdfjfd60nd7_5t40000gn/T/go-build007721452=/tmp/go-build -gno-record-gcc-switches -fno-common"
What did you do?
if _, err := url.Parse("http://[fe80::1%en0]:12345"); err != nil {
panic(err)
}
What did you expect to see?
IPv6 link-local literals should be accepted and fe80::1%en0
should be returned within the Host
.
What did you see instead?
Parsing error due to invalid URL escape with the percent sign - in above example produces:
panic: parse http://[fe80::1%en0]:12345: invalid URL escape "%en"
Comment From: mikioh
See https://tools.ietf.org/html/rfc6874, the delimiter is "%25". Also, #20669 might describe the limitation of IPv6 LLA /w zone in URI.
Comment From: neilalexander
Thanks for the fast response. If not an issue with Go per-se then I consider this an issue with documentation, as the godoc for url.Parse
does not state compliance to RFC 6874, nor does it suggest that there are particular escape codes that may cover situations like this.
Comment From: mikioh
Then, please re-title this issue.
Comment From: ldb
Would adding "IPv6 addresses must be encoded according to RFC 3986 and 6874." to the documentation of Parse
and ParseRequestURI
adequately explain the rules? If yes, I would like to make a CL. However I see that compliance is already documented in line 625, so I am not sure if it is really needed.
Comment From: bcmills
@neilalexander, would @cosmonawt's proposed change address your issue?
(@rsc and @bradfitz are listed as the owners of this package, so I'll leave it to them to decide whether such a change would be a net improvement from a maintainer's perspective.)
Comment From: neilalexander
I think it would help, but it would be better if it makes an explicit mention of the fact that it affects link-local addresses containing the interface specifier as it will save people time in the future.
Comment From: gopherbot
Change https://go.dev/cl/660077 mentions this issue: net/url: document referenced RFCs