From 9d3af98a5e2d1116fc29fde0804642b881506743 Mon Sep 17 00:00:00 2001 From: Sergey Lyubka Date: Thu, 9 Feb 2012 22:55:24 +0000 Subject: [PATCH] Remove repeating backslashes only on Windows --- "test/\\/a.txt" | 1 + test/test.pl | 5 +++-- test/unit_test.c | 31 ++++++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 "test/\\/a.txt" diff --git "a/test/\\/a.txt" "b/test/\\/a.txt" new file mode 100644 index 00000000..907b3081 --- /dev/null +++ "b/test/\\/a.txt" @@ -0,0 +1 @@ +blah diff --git a/test/test.pl b/test/test.pl index 467ff37d..aaccfafb 100644 --- a/test/test.pl +++ b/test/test.pl @@ -201,7 +201,7 @@ $num_requests++; write_file("$root/a+.txt", ''); o("GET /a+.txt HTTP/1.0\n\n", 'HTTP/1.1 200 OK', 'URL-decoding, + in URI'); -#o("GET /hh HTTP/1.0\n\n", 'HTTP/1.1 200 OK', 'GET admin URI'); +o("GET /%5c/a.txt HTTP/1.0\n\n", 'blah', 'GET dir backslash'); # Test HTTP version parsing o("GET / HTTPX/1.0\r\n\r\n", '400 Bad Request', 'Bad HTTP Version', 0); @@ -213,7 +213,8 @@ o("GET / HTTP/02.0\r\n\r\n", '505 HTTP version not supported', # File with leading single dot o("GET /.leading.dot.txt HTTP/1.0\n\n", 'abc123', 'Leading dot 1'); o("GET /...leading.dot.txt HTTP/1.0\n\n", 'abc123', 'Leading dot 2'); -o("GET /../\\\\/.//...leading.dot.txt HTTP/1.0\n\n", 'abc123', 'Leading dot 3'); +o("GET /../\\\\/.//...leading.dot.txt HTTP/1.0\n\n", 'abc123', 'Leading dot 3') + if on_windows(); o("GET .. HTTP/1.0\n\n", '400 Bad Request', 'Leading dot 4', 0); mkdir $test_dir unless -d $test_dir; diff --git a/test/unit_test.c b/test/unit_test.c index 65f9778b..daa37de8 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -1,6 +1,6 @@ #include "mongoose.c" -int main(void) { +static void test_match_prefix(void) { assert(match_prefix("/a/", 3, "/a/b/c") == 3); assert(match_prefix("/a/", 3, "/ab/c") == -1); assert(match_prefix("/*/", 3, "/ab/c") == 4); @@ -25,6 +25,35 @@ int main(void) { assert(match_prefix("**.a$|**.b$", 11, "/a/b.b/") == -1); assert(match_prefix("**.a$|**.b$", 11, "/a/b.b") == 6); assert(match_prefix("**.a$|**.b$", 11, "/a/b.a") == 6); +} +static void test_remove_double_dots() { + struct { char before[20], after[20]; } data[] = { + {"////a", "/a"}, + {"/.....", "/."}, + {"/......", "/"}, + {"...", "..."}, + {"/...///", "/./"}, + {"/a...///", "/a.../"}, + {"/.x", "/.x"}, +#if defined(_WIN32) + {"/\\", "/"}, +#else + {"/\\", "/\\"}, +#endif + {"/a\\", "/a\\"}, + }; + size_t i; + + for (i = 0; i < ARRAY_SIZE(data); i++) { + //printf("[%s] -> [%s]\n", data[i].before, data[i].after); + remove_double_dots_and_double_slashes(data[i].before); + assert(strcmp(data[i].before, data[i].after) == 0); + } +} + +int main(void) { + test_match_prefix(); + test_remove_double_dots(); return 0; }