Skip to content

Commit

Permalink
net/url: preserve a trailing slash in JoinPath
Browse files Browse the repository at this point in the history
Fixes #52074

Change-Id: I30897f32e70a6ca0c4e11aaf07088c27336efaba
Reviewed-on: https://go-review.googlesource.com/c/go/+/397256
Trust: Ian Lance Taylor <[email protected]>
Run-TryBot: Ian Lance Taylor <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
Reviewed-by: Matt Layher <[email protected]>
Trust: Matt Layher <[email protected]>
  • Loading branch information
ianlancetaylor committed Apr 5, 2022
1 parent 69756b3 commit dbb52cc
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/net/url/url.go
Original file line number Diff line number Diff line change
Expand Up @@ -1189,11 +1189,18 @@ func (u *URL) UnmarshalBinary(text []byte) error {

// JoinPath returns a new URL with the provided path elements joined to
// any existing path and the resulting path cleaned of any ./ or ../ elements.
// Any sequences of multiple / characters will be reduced to a single /.
func (u *URL) JoinPath(elem ...string) *URL {
url := *u
if len(elem) > 0 {
elem = append([]string{u.Path}, elem...)
url.setPath(path.Join(elem...))
p := path.Join(elem...)
// path.Join will remove any trailing slashes.
// Preserve at least one.
if strings.HasSuffix(elem[len(elem)-1], "/") && !strings.HasSuffix(p, "/") {
p += "/"
}
url.setPath(p)
}
return &url
}
Expand Down
25 changes: 25 additions & 0 deletions src/net/url/url_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2099,6 +2099,31 @@ func TestJoinPath(t *testing.T) {
base: "http://[fe80::1%en0]:8080/",
elem: []string{"/go"},
},
{
base: "https://go.googlesource.com",
elem: []string{"go/"},
out: "https://go.googlesource.com/go/",
},
{
base: "https://go.googlesource.com",
elem: []string{"go//"},
out: "https://go.googlesource.com/go/",
},
{
base: "https://go.googlesource.com",
elem: nil,
out: "https://go.googlesource.com",
},
{
base: "https://go.googlesource.com/",
elem: nil,
out: "https://go.googlesource.com/",
},
{
base: "/",
elem: nil,
out: "/",
},
}
for _, tt := range tests {
wantErr := "nil"
Expand Down

0 comments on commit dbb52cc

Please sign in to comment.