@@ -814,10 +814,24 @@ void URL::setQuery(StringView newQuery)
814
814
maybeTrimTrailingSpacesFromOpaquePath ();
815
815
}
816
816
817
+ // To match Node.js pathToFileURL, the following chars are escaped: \0, \t, \n, \r, " # % ? [ ] ^ | ~
818
+ // https://github.com/nodejs/node/blob/532fff6b27be6b0d833d06b4a9fe46d6fb7f0f6c/src/node_url.cc#L82-L121
819
+ // RFC1738 defines the following chars as "unsafe" for URLs
820
+ // @see https://www.ietf.org/rfc/rfc1738.txt 2.2. URL Character Encoding Issues
821
+ static constexpr uint64_t escapeTable[] = {
822
+ // 0-63: Only specific control chars (\0, \t, \n, \r), space, ", #, %, ?
823
+ (1ULL << 0 ) | (1ULL << ' \t ' ) | (1ULL << ' \n ' ) | (1ULL << ' \r ' ) |
824
+ (1ULL << ' ' ) | (1ULL << ' "' ) | (1ULL << ' #' ) | (1ULL << ' %' ) | (1ULL << ' ?' ),
825
+
826
+ // 64-127: [, \, ], ^, |, ~
827
+ (1ULL << (' [' - 64 )) | (1ULL << (' \\ ' - 64 )) | (1ULL << (' ]' - 64 )) |
828
+ (1ULL << (' ^' - 64 )) | (1ULL << (' |' - 64 )) | (1ULL << (' ~' - 64 ))
829
+ };
830
+
817
831
static String escapePathWithoutCopying (StringView path)
818
832
{
819
- auto questionMarkOrNumberSignOrNonASCII = [] (UChar character) {
820
- return character == ' ? ' || character == ' # ' || ! isASCII (character);
833
+ auto questionMarkOrNumberSignOrNonASCII = [](UChar character) {
834
+ return character >= 128 || ((escapeTable[ character >> 6 ] >> (character & 63 )) & 1 );
821
835
};
822
836
return percentEncodeCharacters (path, questionMarkOrNumberSignOrNonASCII);
823
837
}
0 commit comments