mirror of
https://github.com/golang/go
synced 2024-11-15 00:50:32 -07:00
net/url: fix missing handling for opaque value in ResolveReference method
The current implementation doesn't resolve as per spec RFC 3986 the case
where the base URL has an opaque value, and the reference doesn't have
either a scheme, authority or path. Currently, this specific case falls
back to the "abs_path" or "rel_path" cases, where the final path results
of the base_path being resolved relatively to the reference's, but since
the opaque value is stored independently, it needs a case of its own.
The algorith for resolving references is defined in RFC 3986 section 5.2.2:
https://www.rfc-editor.org/rfc/rfc3986.html#section-5.2.2
Fixes #66084
Change-Id: I82813e2333d8f2c4433c742f10e8c941888b55ac
GitHub-Last-Rev: cb96626988
GitHub-Pull-Request: golang/go#66415
Reviewed-on: https://go-review.googlesource.com/c/go/+/572915
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
This commit is contained in:
parent
a8eaf56fe1
commit
cf06b1f1db
@ -1124,6 +1124,13 @@ func (u *URL) ResolveReference(ref *URL) *URL {
|
||||
url.RawFragment = u.RawFragment
|
||||
}
|
||||
}
|
||||
if ref.Path == "" && u.Opaque != "" {
|
||||
url.Opaque = u.Opaque
|
||||
url.User = nil
|
||||
url.Host = ""
|
||||
url.Path = ""
|
||||
return &url
|
||||
}
|
||||
// The "abs_path" or "rel_path" cases.
|
||||
url.Host = u.Host
|
||||
url.User = u.User
|
||||
|
@ -1248,6 +1248,14 @@ var resolveReferenceTests = []struct {
|
||||
|
||||
// Empty path and query but with ForceQuery (issue 46033).
|
||||
{"https://a/b/c/d;p?q#s", "?", "https://a/b/c/d;p?"},
|
||||
|
||||
// Opaque URLs (issue 66084).
|
||||
{"https://foo.com/bar?a=b", "http:opaque", "http:opaque"},
|
||||
{"http:opaque?x=y#zzz", "https:/foo?a=b#frag", "https:/foo?a=b#frag"},
|
||||
{"http:opaque?x=y#zzz", "https:foo:bar", "https:foo:bar"},
|
||||
{"http:opaque?x=y#zzz", "https:bar/baz?a=b#frag", "https:bar/baz?a=b#frag"},
|
||||
{"http:opaque?x=y#zzz", "https://user@host:1234?a=b#frag", "https://user@host:1234?a=b#frag"},
|
||||
{"http:opaque?x=y#zzz", "?a=b#frag", "http:opaque?a=b#frag"},
|
||||
}
|
||||
|
||||
func TestResolveReference(t *testing.T) {
|
||||
|
Loading…
Reference in New Issue
Block a user