summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/fileserver
diff options
context:
space:
mode:
Diffstat (limited to 'modules/caddyhttp/fileserver')
-rw-r--r--modules/caddyhttp/fileserver/browsetplcontext.go9
-rw-r--r--modules/caddyhttp/fileserver/browsetplcontext_test.go13
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 {