Commit 84e91e1d authored by Mark Theunissen's avatar Mark Theunissen Committed by Russ Cox

net/url: preserve leading slashes when resolving path

When doing resolvePath, if there are multiple leading slashes in the
target, preserve them. This prevents an issue where the Go http.Client
cleans up multiple leading slashes in the Location header in a
redirect, resulting in a redirection to the incorrect target.

Fixes #21158.

Change-Id: I6a21ea61ca3bc7033f3c8a6ccc21ecaa3e996fa8
Reviewed-on: https://go-review.googlesource.com/51050Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
parent b4c3fe7b
...@@ -911,7 +911,7 @@ func resolvePath(base, ref string) string { ...@@ -911,7 +911,7 @@ func resolvePath(base, ref string) string {
// Add final slash to the joined path. // Add final slash to the joined path.
dst = append(dst, "") dst = append(dst, "")
} }
return "/" + strings.TrimLeft(strings.Join(dst, "/"), "/") return "/" + strings.TrimPrefix(strings.Join(dst, "/"), "/")
} }
// IsAbs reports whether the URL is absolute. // IsAbs reports whether the URL is absolute.
......
...@@ -1032,6 +1032,10 @@ var resolveReferenceTests = []struct { ...@@ -1032,6 +1032,10 @@ var resolveReferenceTests = []struct {
{"http://foo.com/bar?a=b", "/baz?", "http://foo.com/baz?"}, {"http://foo.com/bar?a=b", "/baz?", "http://foo.com/baz?"},
{"http://foo.com/bar?a=b", "/baz?c=d", "http://foo.com/baz?c=d"}, {"http://foo.com/bar?a=b", "/baz?c=d", "http://foo.com/baz?c=d"},
// Multiple slashes
{"http://foo.com/bar", "http://foo.com//baz", "http://foo.com//baz"},
{"http://foo.com/bar", "http://foo.com///baz/quux", "http://foo.com///baz/quux"},
// Scheme-relative // Scheme-relative
{"https://foo.com/bar?a=b", "//bar.com/quux", "https://bar.com/quux"}, {"https://foo.com/bar?a=b", "//bar.com/quux", "https://bar.com/quux"},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment