diff options
author | Matt Holt <mholt@users.noreply.github.com> | 2019-10-15 16:05:53 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-15 16:05:53 -0600 |
commit | 2f91b44587fe487b6a05c1c7e56833247e4b8c79 (patch) | |
tree | bcee95d5d6e805b4ff0ff81df9916f8689f1c85e | |
parent | e3726588b416682db28ea9173bf2c36e4554ce05 (diff) |
v2: Make tests work on Windows (#2782)
* file_server: Make tests work on Windows
* caddyfile: Fix escaping when character is not escapable
We only escape certain characters depending on inside or outside of
quotes (mainly newlines and quotes). We don't want everyone to have to
escape Windows file paths like C:\\Windows\\... but we can't drop the
\ either if it's just C:\Windows\...
-rwxr-xr-x | caddyconfig/caddyfile/lexer.go | 5 | ||||
-rwxr-xr-x | caddyconfig/caddyfile/lexer_test.go | 6 | ||||
-rw-r--r-- | modules/caddyhttp/fileserver/staticfiles_test.go | 26 |
3 files changed, 27 insertions, 10 deletions
diff --git a/caddyconfig/caddyfile/lexer.go b/caddyconfig/caddyfile/lexer.go index 0ddad0e..687ff90 100755 --- a/caddyconfig/caddyfile/lexer.go +++ b/caddyconfig/caddyfile/lexer.go @@ -153,6 +153,11 @@ func (l *lexer) next() bool { } } + if escaped { + val = append(val, '\\') + escaped = false + } + val = append(val, ch) } } diff --git a/caddyconfig/caddyfile/lexer_test.go b/caddyconfig/caddyfile/lexer_test.go index ce2e147..9105eb5 100755 --- a/caddyconfig/caddyfile/lexer_test.go +++ b/caddyconfig/caddyfile/lexer_test.go @@ -152,6 +152,12 @@ func TestLexer(t *testing.T) { }, }, { + input: `un\escapable`, + expected: []Token{ + {Line: 1, Text: `un\escapable`}, + }, + }, + { input: `A "quoted value with line break inside" { foobar diff --git a/modules/caddyhttp/fileserver/staticfiles_test.go b/modules/caddyhttp/fileserver/staticfiles_test.go index d381d42..73762c7 100644 --- a/modules/caddyhttp/fileserver/staticfiles_test.go +++ b/modules/caddyhttp/fileserver/staticfiles_test.go @@ -16,14 +16,15 @@ package fileserver import ( "net/url" + "path/filepath" "testing" ) func TestSanitizedPathJoin(t *testing.T) { // For easy reference: - // %2E = . - // %2F = / - // %5C = \ + // %2e = . + // %2f = / + // %5c = \ for i, tc := range []struct { inputRoot string inputPath string @@ -43,12 +44,12 @@ func TestSanitizedPathJoin(t *testing.T) { }, { inputPath: "/foo/bar", - expect: "foo/bar", + expect: filepath.Join("foo", "bar"), }, { inputRoot: "/a", inputPath: "/foo/bar", - expect: "/a/foo/bar", + expect: filepath.Join("/", "a", "foo", "bar"), }, { inputPath: "/foo/../bar", @@ -57,24 +58,29 @@ func TestSanitizedPathJoin(t *testing.T) { { inputRoot: "/a/b", inputPath: "/foo/../bar", - expect: "/a/b/bar", + expect: filepath.Join("/", "a", "b", "bar"), }, { inputRoot: "/a/b", inputPath: "/..%2fbar", - expect: "/a/b/bar", + expect: filepath.Join("/", "a", "b", "bar"), }, { inputRoot: "/a/b", inputPath: "/%2e%2e%2fbar", - expect: "/a/b/bar", + expect: filepath.Join("/", "a", "b", "bar"), }, { inputRoot: "/a/b", inputPath: "/%2e%2e%2f%2e%2e%2f", - expect: "/a/b", + expect: filepath.Join("/", "a", "b"), }, - // TODO: test windows paths... on windows... sigh. + { + inputRoot: "C:\\www", + inputPath: "/foo/bar", + expect: filepath.Join("C:\\www", "foo", "bar"), + }, + // TODO: test more windows paths... on windows... sigh. } { // we don't *need* to use an actual parsed URL, but it // adds some authenticity to the tests since real-world |