]> Cypherpunks repositories - gostls13.git/commitdiff
net/url: fix handling of relative paths in ResolveReference.
authorRick Arnold <rickarnoldjr@gmail.com>
Tue, 11 Dec 2012 16:06:07 +0000 (11:06 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 11 Dec 2012 16:06:07 +0000 (11:06 -0500)
Fixes #3560.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6886047

src/pkg/net/url/url.go
src/pkg/net/url/url_test.go

index 692a7fdc0484702f579f5c1f123705d751633e97..82db0367bc682eda736bc065323f22f10518fce1 100644 (file)
@@ -572,23 +572,33 @@ func resolvePath(basepath string, refpath string) string {
        if len(base) == 0 {
                base = []string{""}
        }
+
+       rm := true
        for idx, ref := range refs {
                switch {
                case ref == ".":
-                       base[len(base)-1] = ""
+                       if idx == 0 {
+                               base[len(base)-1] = ""
+                               rm = true
+                       } else {
+                               rm = false
+                       }
                case ref == "..":
                        newLen := len(base) - 1
                        if newLen < 1 {
                                newLen = 1
                        }
                        base = base[0:newLen]
-                       base[len(base)-1] = ""
+                       if rm {
+                               base[len(base)-1] = ""
+                       }
                default:
                        if idx == 0 || base[len(base)-1] == "" {
                                base[len(base)-1] = ref
                        } else {
                                base = append(base, ref)
                        }
+                       rm = false
                }
        }
        return strings.Join(base, "/")
index 64f11700278c1bc750454d7ac5376c9df03ee3a8..4a0918940383abf0a8f9b41301db313da341bdf8 100644 (file)
@@ -536,6 +536,15 @@ var resolveReferenceTests = []struct {
        {"http://foo.com/bar/baz", "../../../../../quux", "http://foo.com/quux"},
        {"http://foo.com/bar", "..", "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
        {"http://foo.com/dot/./dotdot/../foo/bar", "../baz", "http://foo.com/dot/./dotdot/../baz"},