]> Cypherpunks repositories - gostls13.git/commitdiff
net/url: fix missing handling for opaque value in ResolveReference method
authorFábio Mata <fabio.mata@tecnico.ulisboa.pt>
Tue, 19 Mar 2024 22:58:26 +0000 (22:58 +0000)
committerDamien Neil <dneil@google.com>
Wed, 22 May 2024 22:52:38 +0000 (22:52 +0000)
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: cb96626988f4bd4546ee840ba50e2b4efa1e23f1
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>
src/net/url/url.go
src/net/url/url_test.go

index 7cd6913ad7e3f794cff301ae1ca709c335023add..6c74f3fbf98a424a940656d69da20d08ad14db07 100644 (file)
@@ -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
index 4aa20bb95feb0bdf2cb5cba2f3e7330e55588e89..68219c3df1081d6aa792cbb86ef5999a21e8edc8 100644 (file)
@@ -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) {