diff --git a/src/net/url/url.go b/src/net/url/url.go index 7cd6913ad7..6c74f3fbf9 100644 --- a/src/net/url/url.go +++ b/src/net/url/url.go @@ -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 diff --git a/src/net/url/url_test.go b/src/net/url/url_test.go index 4aa20bb95f..68219c3df1 100644 --- a/src/net/url/url_test.go +++ b/src/net/url/url_test.go @@ -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) {