mirror of https://github.com/golang/go.git
net/url: add JoinPath, URL.JoinPath
Builds on CL 332209.
Fixes #47005
Change-Id: I82708dede05d79a196ca63f5a4e7cb5ac9a041ea
GitHub-Last-Rev: 51b735066e
GitHub-Pull-Request: golang/go#50383
Reviewed-on: https://go-review.googlesource.com/c/go/+/374654
Reviewed-by: Russ Cox <rsc@golang.org>
Auto-Submit: Russ Cox <rsc@golang.org>
Trust: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
9faef5a654
commit
604140d931
|
|
@ -3,3 +3,5 @@ pkg encoding/binary, type AppendByteOrder interface, AppendUint16([]uint8, uint1
|
|||
pkg encoding/binary, type AppendByteOrder interface, AppendUint32([]uint8, uint32) []uint8
|
||||
pkg encoding/binary, type AppendByteOrder interface, AppendUint64([]uint8, uint64) []uint8
|
||||
pkg encoding/binary, type AppendByteOrder interface, String() string
|
||||
pkg net/url, func JoinPath(string, ...string) (string, error)
|
||||
pkg net/url, method (*URL) JoinPath(...string) *URL
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ package url
|
|||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"path"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
|
@ -1176,6 +1177,17 @@ func (u *URL) UnmarshalBinary(text []byte) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// JoinPath returns a new URL with the provided path elements joined to
|
||||
// any existing path and the resulting path cleaned of any ./ or ../ elements.
|
||||
func (u *URL) JoinPath(elem ...string) *URL {
|
||||
url := *u
|
||||
if len(elem) > 0 {
|
||||
elem = append([]string{u.Path}, elem...)
|
||||
url.setPath(path.Join(elem...))
|
||||
}
|
||||
return &url
|
||||
}
|
||||
|
||||
// validUserinfo reports whether s is a valid userinfo string per RFC 3986
|
||||
// Section 3.2.1:
|
||||
// userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
|
||||
|
|
@ -1216,3 +1228,14 @@ func stringContainsCTLByte(s string) bool {
|
|||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// JoinPath returns a URL string with the provided path elements joined to
|
||||
// the existing path of base and the resulting path cleaned of any ./ or ../ elements.
|
||||
func JoinPath(base string, elem ...string) (result string, err error) {
|
||||
url, err := Parse(base)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
result = url.JoinPath(elem...).String()
|
||||
return
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2062,3 +2062,59 @@ func BenchmarkPathUnescape(b *testing.B) {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestJoinPath(t *testing.T) {
|
||||
tests := []struct {
|
||||
base string
|
||||
elem []string
|
||||
out string
|
||||
}{
|
||||
{
|
||||
base: "https://go.googlesource.com",
|
||||
elem: []string{"go"},
|
||||
out: "https://go.googlesource.com/go",
|
||||
},
|
||||
{
|
||||
base: "https://go.googlesource.com/a/b/c",
|
||||
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: []string{"/go"},
|
||||
out: "https://go.googlesource.com/go",
|
||||
},
|
||||
{
|
||||
base: "https://go.googlesource.com//",
|
||||
elem: []string{"/go", "a", "b", "c"},
|
||||
out: "https://go.googlesource.com/go/a/b/c",
|
||||
},
|
||||
{
|
||||
base: "http://[fe80::1%en0]:8080/",
|
||||
elem: []string{"/go"},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
wantErr := "nil"
|
||||
if tt.out == "" {
|
||||
wantErr = "non-nil error"
|
||||
}
|
||||
if out, err := JoinPath(tt.base, tt.elem...); out != tt.out || (err == nil) != (tt.out != "") {
|
||||
t.Errorf("JoinPath(%q, %q) = %q, %v, want %q, %v", tt.base, tt.elem, out, err, tt.out, wantErr)
|
||||
}
|
||||
var out string
|
||||
u, err := Parse(tt.base)
|
||||
if err == nil {
|
||||
u = u.JoinPath(tt.elem...)
|
||||
out = u.String()
|
||||
}
|
||||
if out != tt.out || (err == nil) != (tt.out != "") {
|
||||
t.Errorf("Parse(%q).JoinPath(%q) = %q, %v, want %q, %v", tt.base, tt.elem, out, err, tt.out, wantErr)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue