diff options
-rw-r--r-- | modules/caddyhttp/fileserver/browsetplcontext.go | 9 | ||||
-rw-r--r-- | modules/caddyhttp/fileserver/browsetplcontext_test.go | 13 |
2 files changed, 19 insertions, 3 deletions
diff --git a/modules/caddyhttp/fileserver/browsetplcontext.go b/modules/caddyhttp/fileserver/browsetplcontext.go index 2c57e52..b1b8e9e 100644 --- a/modules/caddyhttp/fileserver/browsetplcontext.go +++ b/modules/caddyhttp/fileserver/browsetplcontext.go @@ -77,9 +77,9 @@ func (fsrv *FileServer) directoryListing(files []os.FileInfo, canGoUp bool, root Mode: f.Mode(), }) } - + name, _ := url.PathUnescape(urlPath) return browseTemplateContext{ - Name: path.Base(urlPath), + Name: path.Base(name), Path: urlPath, CanGoUp: canGoUp, Items: fileInfos, @@ -133,13 +133,16 @@ func (l browseTemplateContext) Breadcrumbs() []crumb { if lpath[len(lpath)-1] == '/' { lpath = lpath[:len(lpath)-1] } - parts := strings.Split(lpath, "/") result := make([]crumb, len(parts)) for i, p := range parts { if i == 0 && p == "" { p = "/" } + // the directory name could include an encoded slash in its path, + // so the item name should be unescaped in the loop rather than unescaping the + // entire path outside the loop. + p, _ = url.PathUnescape(p) lnk := strings.Repeat("../", len(parts)-i-1) result[i] = crumb{Link: lnk, Text: p} } diff --git a/modules/caddyhttp/fileserver/browsetplcontext_test.go b/modules/caddyhttp/fileserver/browsetplcontext_test.go index 01e6c8f..9f0d08e 100644 --- a/modules/caddyhttp/fileserver/browsetplcontext_test.go +++ b/modules/caddyhttp/fileserver/browsetplcontext_test.go @@ -36,6 +36,19 @@ func TestBreadcrumbs(t *testing.T) { {Link: "../", Text: "quux"}, {Link: "", Text: "corge"}, }}, + {"/مجلد/", []crumb{ + {Link: "../", Text: "/"}, + {Link: "", Text: "مجلد"}, + }}, + {"/مجلد-1/مجلد-2", []crumb{ + {Link: "../../", Text: "/"}, + {Link: "../", Text: "مجلد-1"}, + {Link: "", Text: "مجلد-2"}, + }}, + {"/مجلد%2F1", []crumb{ + {Link: "../", Text: "/"}, + {Link: "", Text: "مجلد/1"}, + }}, } for _, d := range testdata { |