summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/fileserver/matcher_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/caddyhttp/fileserver/matcher_test.go')
-rw-r--r--modules/caddyhttp/fileserver/matcher_test.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/modules/caddyhttp/fileserver/matcher_test.go b/modules/caddyhttp/fileserver/matcher_test.go
index 746a5d7..5b6078a 100644
--- a/modules/caddyhttp/fileserver/matcher_test.go
+++ b/modules/caddyhttp/fileserver/matcher_test.go
@@ -17,12 +17,31 @@ package fileserver
import (
"net/http"
"net/url"
+ "os"
+ "runtime"
"testing"
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
)
func TestFileMatcher(t *testing.T) {
+
+ // Windows doesn't like colons in files names
+ isWindows := runtime.GOOS == "windows"
+ if !isWindows {
+ filename := "with:in-name.txt"
+ f, err := os.Create("./testdata/" + filename)
+ if err != nil {
+ t.Fail()
+ return
+ }
+ t.Cleanup(func() {
+ os.Remove("./testdata/" + filename)
+ })
+ f.WriteString(filename)
+ f.Close()
+ }
+
for i, tc := range []struct {
path string
expectedPath string
@@ -63,6 +82,30 @@ func TestFileMatcher(t *testing.T) {
path: "/missingfile.php",
matched: false,
},
+ {
+ path: "ملف.txt", // the path file name is not escaped
+ expectedPath: "ملف.txt",
+ expectedType: "file",
+ matched: true,
+ },
+ {
+ path: url.PathEscape("ملف.txt"), // singly-escaped path
+ expectedPath: "ملف.txt",
+ expectedType: "file",
+ matched: true,
+ },
+ {
+ path: url.PathEscape(url.PathEscape("ملف.txt")), // doubly-escaped path
+ expectedPath: "%D9%85%D9%84%D9%81.txt",
+ expectedType: "file",
+ matched: true,
+ },
+ {
+ path: "./with:in-name.txt", // browsers send the request with the path as such
+ expectedPath: "with:in-name.txt",
+ expectedType: "file",
+ matched: !isWindows,
+ },
} {
m := &MatchFile{
Root: "./testdata",