Home | History | Annotate | Download | only in script-tests
      1 description("Canonicalization of paths.");
      2 
      3 cases = [ 
      4   ["/././foo", "/foo"],
      5   ["/./.foo", "/.foo"],
      6   ["/foo/.", "/foo/"],
      7   ["/foo/./", "/foo/"],
      8   // double dots followed by a slash or the end of the string count
      9   ["/foo/bar/..", "/foo/"],
     10   ["/foo/bar/../", "/foo/"],
     11   // don't count double dots when they aren't followed by a slash
     12   ["/foo/..bar", "/foo/..bar"],
     13   // some in the middle
     14   ["/foo/bar/../ton", "/foo/ton"],
     15   ["/foo/bar/../ton/../../a", "/a"],
     16   // we should not be able to go above the root
     17   ["/foo/../../..", "/"],
     18   ["/foo/../../../ton", "/ton"],
     19   // escaped dots should be unescaped and treated the same as dots
     20   ["/foo/%2e", "/foo/"],
     21   ["/foo/%2e%2", "/foo/.%2"],
     22   ["/foo/%2e./%2e%2e/.%2e/%2e.bar", "/..bar"],
     23   // Multiple slashes in a row should be preserved and treated like empty
     24   // directory names.
     25   ["////../..", "//"],
     26   ["/foo/bar//../..", "/foo/"],
     27   ["/foo/bar//..", "/foo/bar/"],
     28   ["/foo/bar/..", "/foo/"],
     29 
     30   // ----- escaping tests -----
     31   ["/foo", "/foo"],
     32   // Valid escape sequence
     33   ["/%20foo", "/%20foo"],
     34   // Invalid escape sequence we should pass through unchanged.
     35   ["/foo%", "/foo%"],
     36   ["/foo%2", "/foo%2"],
     37   // Invalid escape sequence: bad characters should be treated the same as
     38   // the sourrounding text, not as escaped (in this case, UTF-8).
     39   ["/foo%2zbar", "/foo%2zbar"],
     40   // (Disabled because requires UTF8)
     41   // ["/foo%2\xc2\xa9zbar", "/foo%2%C2%A9zbar"],
     42   ["/foo%2\u00c2\u00a9zbar", "/foo%2%C3%82%C2%A9zbar"],
     43   // Regular characters that are escaped should be unescaped
     44   ["/foo%41%7a", "/fooAz"],
     45   // Funny characters that are unescaped should be escaped
     46   ["/foo\u0009\u0091%91", "/foo%09%C2%91%91"],
     47   // Invalid characters that are escaped should cause a failure.
     48   ["/foo%00%51", "/foo%00Q"],
     49   // Some characters should be passed through unchanged regardless of esc.
     50   ["/(%28:%3A%29)", "/(%28:%3A%29)"],
     51   // Characters that are properly escaped should not have the case changed
     52   // of hex letters.
     53   ["/%3A%3a%3C%3c", "/%3A%3a%3C%3c"],
     54   // Funny characters that are unescaped should be escaped
     55   ["/foo\tbar", "/foo%09bar"],
     56   // Backslashes should get converted to forward slashes
     57   ["\\\\foo\\\\bar", "/foo/bar"],
     58   // Hashes found in paths (possibly only when the caller explicitly sets
     59   // the path on an already-parsed URL) should be escaped.
     60   // (Disabled because requires ability to set path directly.)
     61   // ["/foo#bar", "/foo%23bar"],
     62   // %7f should be allowed and %3D should not be unescaped (these were wrong
     63   // in a previous version).
     64   ["/%7Ffp3%3Eju%3Dduvgw%3Dd", "/%7Ffp3%3Eju%3Dduvgw%3Dd"],
     65   // @ should be passed through unchanged (escaped or unescaped).
     66   ["/@asdf%40", "/@asdf%40"],
     67 
     68   // ----- encoding tests -----
     69   // Basic conversions
     70   ["/\u4f60\u597d\u4f60\u597d", "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD"],
     71   // Invalid unicode characters should fail. We only do validation on
     72   // UTF-16 input, so this doesn't happen on 8-bit.
     73   ["/\ufdd0zyx", "/%EF%BF%BDzyx"],
     74 
     75 ];
     76 
     77 for (var i = 0; i < cases.length; ++i) {
     78   test_vector = cases[i][0];
     79   expected_result = cases[i][1];
     80   shouldBe("canonicalize('http://example.com" + test_vector + "')",
     81            "'http://example.com" + expected_result + "'");
     82 }
     83 
     84 var successfullyParsed = true;
     85