Commit 2f45f280 authored by Rick Arnold's avatar Rick Arnold Committed by Russ Cox

net/url: fix handling of relative paths in ResolveReference.

Fixes #3560.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6886047
parent dffdece8
...@@ -572,23 +572,33 @@ func resolvePath(basepath string, refpath string) string { ...@@ -572,23 +572,33 @@ func resolvePath(basepath string, refpath string) string {
if len(base) == 0 { if len(base) == 0 {
base = []string{""} base = []string{""}
} }
rm := true
for idx, ref := range refs { for idx, ref := range refs {
switch { switch {
case ref == ".": case ref == ".":
base[len(base)-1] = "" if idx == 0 {
base[len(base)-1] = ""
rm = true
} else {
rm = false
}
case ref == "..": case ref == "..":
newLen := len(base) - 1 newLen := len(base) - 1
if newLen < 1 { if newLen < 1 {
newLen = 1 newLen = 1
} }
base = base[0:newLen] base = base[0:newLen]
base[len(base)-1] = "" if rm {
base[len(base)-1] = ""
}
default: default:
if idx == 0 || base[len(base)-1] == "" { if idx == 0 || base[len(base)-1] == "" {
base[len(base)-1] = ref base[len(base)-1] = ref
} else { } else {
base = append(base, ref) base = append(base, ref)
} }
rm = false
} }
} }
return strings.Join(base, "/") return strings.Join(base, "/")
......
...@@ -536,6 +536,15 @@ var resolveReferenceTests = []struct { ...@@ -536,6 +536,15 @@ var resolveReferenceTests = []struct {
{"http://foo.com/bar/baz", "../../../../../quux", "http://foo.com/quux"}, {"http://foo.com/bar/baz", "../../../../../quux", "http://foo.com/quux"},
{"http://foo.com/bar", "..", "http://foo.com/"}, {"http://foo.com/bar", "..", "http://foo.com/"},
{"http://foo.com/bar/baz", "./..", "http://foo.com/"}, {"http://foo.com/bar/baz", "./..", "http://foo.com/"},
// ".." in the middle (issue 3560)
{"http://foo.com/bar/baz", "quux/dotdot/../tail", "http://foo.com/bar/quux/tail"},
{"http://foo.com/bar/baz", "quux/./dotdot/../tail", "http://foo.com/bar/quux/tail"},
{"http://foo.com/bar/baz", "quux/./dotdot/.././tail", "http://foo.com/bar/quux/tail"},
{"http://foo.com/bar/baz", "quux/./dotdot/./../tail", "http://foo.com/bar/quux/tail"},
{"http://foo.com/bar/baz", "quux/./dotdot/dotdot/././../../tail", "http://foo.com/bar/quux/tail"},
{"http://foo.com/bar/baz", "quux/./dotdot/dotdot/./.././../tail", "http://foo.com/bar/quux/tail"},
{"http://foo.com/bar/baz", "quux/./dotdot/dotdot/dotdot/./../../.././././tail", "http://foo.com/bar/quux/tail"},
{"http://foo.com/bar/baz", "quux/./dotdot/../dotdot/../dot/./tail/..", "http://foo.com/bar/quux/dot"},
// "." and ".." in the base aren't special // "." and ".." in the base aren't special
{"http://foo.com/dot/./dotdot/../foo/bar", "../baz", "http://foo.com/dot/./dotdot/../baz"}, {"http://foo.com/dot/./dotdot/../foo/bar", "../baz", "http://foo.com/dot/./dotdot/../baz"},
......
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