mirror of
https://github.com/golang/go
synced 2024-11-17 04:04:46 -07:00
net/url: preserve a trailing slash in JoinPath
Fixes #52074 Change-Id: I30897f32e70a6ca0c4e11aaf07088c27336efaba Reviewed-on: https://go-review.googlesource.com/c/go/+/397256 Trust: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Matt Layher <mdlayher@gmail.com> Trust: Matt Layher <mdlayher@gmail.com>
This commit is contained in:
parent
69756b38f2
commit
dbb52cc9f3
@ -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
|
||||
}
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user