src: clean up WHATWG WG parser
* reduce indentation * refactor URL inlined methods * prefer templates over macros * do not export ARG_* flags in url binding PR-URL: https://github.com/nodejs/node/pull/12251 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
1777a862a2
commit
ade80eeb1a
585
src/node_url.cc
585
src/node_url.cc
@ -15,8 +15,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
#define UNICODE_REPLACEMENT_CHARACTER 0xFFFD
|
|
||||||
|
|
||||||
namespace node {
|
namespace node {
|
||||||
|
|
||||||
using v8::Array;
|
using v8::Array;
|
||||||
@ -55,6 +53,505 @@ using v8::Value;
|
|||||||
|
|
||||||
namespace url {
|
namespace url {
|
||||||
|
|
||||||
|
// https://url.spec.whatwg.org/#eof-code-point
|
||||||
|
static const char kEOL = -1;
|
||||||
|
|
||||||
|
// Used in ToUSVString().
|
||||||
|
static const char16_t kUnicodeReplacementCharacter = 0xFFFD;
|
||||||
|
|
||||||
|
union url_host_value {
|
||||||
|
std::string domain;
|
||||||
|
uint32_t ipv4;
|
||||||
|
uint16_t ipv6[8];
|
||||||
|
~url_host_value() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
enum url_host_type {
|
||||||
|
HOST_TYPE_FAILED = -1,
|
||||||
|
HOST_TYPE_DOMAIN = 0,
|
||||||
|
HOST_TYPE_IPV4 = 1,
|
||||||
|
HOST_TYPE_IPV6 = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
struct url_host {
|
||||||
|
url_host_value value;
|
||||||
|
enum url_host_type type;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ARGS(XX) \
|
||||||
|
XX(ARG_FLAGS) \
|
||||||
|
XX(ARG_PROTOCOL) \
|
||||||
|
XX(ARG_USERNAME) \
|
||||||
|
XX(ARG_PASSWORD) \
|
||||||
|
XX(ARG_HOST) \
|
||||||
|
XX(ARG_PORT) \
|
||||||
|
XX(ARG_PATH) \
|
||||||
|
XX(ARG_QUERY) \
|
||||||
|
XX(ARG_FRAGMENT)
|
||||||
|
|
||||||
|
#define ERR_ARGS(XX) \
|
||||||
|
XX(ERR_ARG_FLAGS) \
|
||||||
|
XX(ERR_ARG_INPUT) \
|
||||||
|
|
||||||
|
enum url_cb_args {
|
||||||
|
#define XX(name) name,
|
||||||
|
ARGS(XX)
|
||||||
|
#undef XX
|
||||||
|
};
|
||||||
|
|
||||||
|
enum url_error_cb_args {
|
||||||
|
#define XX(name) name,
|
||||||
|
ERR_ARGS(XX)
|
||||||
|
#undef XX
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CHAR_TEST(bits, name, expr) \
|
||||||
|
template <typename T> \
|
||||||
|
static inline bool name(const T ch) { \
|
||||||
|
static_assert(sizeof(ch) >= (bits) / 8, \
|
||||||
|
"Character must be wider than " #bits " bits"); \
|
||||||
|
return (expr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TWO_CHAR_STRING_TEST(bits, name, expr) \
|
||||||
|
template <typename T> \
|
||||||
|
static inline bool name(const T ch1, const T ch2) { \
|
||||||
|
static_assert(sizeof(ch1) >= (bits) / 8, \
|
||||||
|
"Character must be wider than " #bits " bits"); \
|
||||||
|
return (expr); \
|
||||||
|
} \
|
||||||
|
template <typename T> \
|
||||||
|
static inline bool name(const std::basic_string<T>& str) { \
|
||||||
|
static_assert(sizeof(str[0]) >= (bits) / 8, \
|
||||||
|
"Character must be wider than " #bits " bits"); \
|
||||||
|
return str.length() >= 2 && name(str[0], str[1]); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://infra.spec.whatwg.org/#ascii-tab-or-newline
|
||||||
|
CHAR_TEST(8, IsASCIITabOrNewline, (ch == '\t' || ch == '\n' || ch == '\r'))
|
||||||
|
|
||||||
|
// https://infra.spec.whatwg.org/#ascii-digit
|
||||||
|
CHAR_TEST(8, IsASCIIDigit, (ch >= '0' && ch <= '9'))
|
||||||
|
|
||||||
|
// https://infra.spec.whatwg.org/#ascii-hex-digit
|
||||||
|
CHAR_TEST(8, IsASCIIHexDigit, (IsASCIIDigit(ch) ||
|
||||||
|
(ch >= 'A' && ch <= 'F') ||
|
||||||
|
(ch >= 'a' && ch <= 'f')))
|
||||||
|
|
||||||
|
// https://infra.spec.whatwg.org/#ascii-alpha
|
||||||
|
CHAR_TEST(8, IsASCIIAlpha, ((ch >= 'A' && ch <= 'Z') ||
|
||||||
|
(ch >= 'a' && ch <= 'z')))
|
||||||
|
|
||||||
|
// https://infra.spec.whatwg.org/#ascii-alphanumeric
|
||||||
|
CHAR_TEST(8, IsASCIIAlphanumeric, (IsASCIIDigit(ch) || IsASCIIAlpha(ch)))
|
||||||
|
|
||||||
|
// https://infra.spec.whatwg.org/#ascii-lowercase
|
||||||
|
template <typename T>
|
||||||
|
static inline T ASCIILowercase(T ch) {
|
||||||
|
return IsASCIIAlpha(ch) ? (ch | 0x20) : ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://url.spec.whatwg.org/#windows-drive-letter
|
||||||
|
TWO_CHAR_STRING_TEST(8, IsWindowsDriveLetter,
|
||||||
|
(IsASCIIAlpha(ch1) && (ch2 == ':' || ch2 == '|')))
|
||||||
|
|
||||||
|
// https://url.spec.whatwg.org/#normalized-windows-drive-letter
|
||||||
|
TWO_CHAR_STRING_TEST(8, IsNormalizedWindowsDriveLetter,
|
||||||
|
(IsASCIIAlpha(ch1) && ch2 == ':'))
|
||||||
|
|
||||||
|
// If a UTF-16 character is a low/trailing surrogate.
|
||||||
|
CHAR_TEST(16, IsUnicodeTrail, (ch & 0xFC00) == 0xDC00)
|
||||||
|
|
||||||
|
// If a UTF-16 character is a surrogate.
|
||||||
|
CHAR_TEST(16, IsUnicodeSurrogate, (ch & 0xF800) == 0xD800)
|
||||||
|
|
||||||
|
// If a UTF-16 surrogate is a low/trailing one.
|
||||||
|
CHAR_TEST(16, IsUnicodeSurrogateTrail, (ch & 0x400) != 0)
|
||||||
|
|
||||||
|
#undef CHAR_TEST
|
||||||
|
#undef TWO_CHAR_STRING_TEST
|
||||||
|
|
||||||
|
static const char* hex[256] = {
|
||||||
|
"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
|
||||||
|
"%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E", "%0F",
|
||||||
|
"%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
|
||||||
|
"%18", "%19", "%1A", "%1B", "%1C", "%1D", "%1E", "%1F",
|
||||||
|
"%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
|
||||||
|
"%28", "%29", "%2A", "%2B", "%2C", "%2D", "%2E", "%2F",
|
||||||
|
"%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
|
||||||
|
"%38", "%39", "%3A", "%3B", "%3C", "%3D", "%3E", "%3F",
|
||||||
|
"%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
|
||||||
|
"%48", "%49", "%4A", "%4B", "%4C", "%4D", "%4E", "%4F",
|
||||||
|
"%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
|
||||||
|
"%58", "%59", "%5A", "%5B", "%5C", "%5D", "%5E", "%5F",
|
||||||
|
"%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
|
||||||
|
"%68", "%69", "%6A", "%6B", "%6C", "%6D", "%6E", "%6F",
|
||||||
|
"%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
|
||||||
|
"%78", "%79", "%7A", "%7B", "%7C", "%7D", "%7E", "%7F",
|
||||||
|
"%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
|
||||||
|
"%88", "%89", "%8A", "%8B", "%8C", "%8D", "%8E", "%8F",
|
||||||
|
"%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
|
||||||
|
"%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F",
|
||||||
|
"%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7",
|
||||||
|
"%A8", "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF",
|
||||||
|
"%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7",
|
||||||
|
"%B8", "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF",
|
||||||
|
"%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7",
|
||||||
|
"%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF",
|
||||||
|
"%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7",
|
||||||
|
"%D8", "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF",
|
||||||
|
"%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7",
|
||||||
|
"%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF",
|
||||||
|
"%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7",
|
||||||
|
"%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t SIMPLE_ENCODE_SET[32] = {
|
||||||
|
// 00 01 02 03 04 05 06 07
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 08 09 0A 0B 0C 0D 0E 0F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 10 11 12 13 14 15 16 17
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 18 19 1A 1B 1C 1D 1E 1F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 20 21 22 23 24 25 26 27
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 28 29 2A 2B 2C 2D 2E 2F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 30 31 32 33 34 35 36 37
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 38 39 3A 3B 3C 3D 3E 3F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 40 41 42 43 44 45 46 47
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 48 49 4A 4B 4C 4D 4E 4F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 50 51 52 53 54 55 56 57
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 58 59 5A 5B 5C 5D 5E 5F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 60 61 62 63 64 65 66 67
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 68 69 6A 6B 6C 6D 6E 6F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 70 71 72 73 74 75 76 77
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 78 79 7A 7B 7C 7D 7E 7F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80,
|
||||||
|
// 80 81 82 83 84 85 86 87
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 88 89 8A 8B 8C 8D 8E 8F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 90 91 92 93 94 95 96 97
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 98 99 9A 9B 9C 9D 9E 9F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// A0 A1 A2 A3 A4 A5 A6 A7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// A8 A9 AA AB AC AD AE AF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// B0 B1 B2 B3 B4 B5 B6 B7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// B8 B9 BA BB BC BD BE BF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// C0 C1 C2 C3 C4 C5 C6 C7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// C8 C9 CA CB CC CD CE CF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// D0 D1 D2 D3 D4 D5 D6 D7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// D8 D9 DA DB DC DD DE DF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// E0 E1 E2 E3 E4 E5 E6 E7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// E8 E9 EA EB EC ED EE EF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// F0 F1 F2 F3 F4 F5 F6 F7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// F8 F9 FA FB FC FD FE FF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t DEFAULT_ENCODE_SET[32] = {
|
||||||
|
// 00 01 02 03 04 05 06 07
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 08 09 0A 0B 0C 0D 0E 0F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 10 11 12 13 14 15 16 17
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 18 19 1A 1B 1C 1D 1E 1F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 20 21 22 23 24 25 26 27
|
||||||
|
0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 28 29 2A 2B 2C 2D 2E 2F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 30 31 32 33 34 35 36 37
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 38 39 3A 3B 3C 3D 3E 3F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x80,
|
||||||
|
// 40 41 42 43 44 45 46 47
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 48 49 4A 4B 4C 4D 4E 4F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 50 51 52 53 54 55 56 57
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 58 59 5A 5B 5C 5D 5E 5F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 60 61 62 63 64 65 66 67
|
||||||
|
0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 68 69 6A 6B 6C 6D 6E 6F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 70 71 72 73 74 75 76 77
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 78 79 7A 7B 7C 7D 7E 7F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x00 | 0x80,
|
||||||
|
// 80 81 82 83 84 85 86 87
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 88 89 8A 8B 8C 8D 8E 8F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 90 91 92 93 94 95 96 97
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 98 99 9A 9B 9C 9D 9E 9F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// A0 A1 A2 A3 A4 A5 A6 A7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// A8 A9 AA AB AC AD AE AF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// B0 B1 B2 B3 B4 B5 B6 B7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// B8 B9 BA BB BC BD BE BF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// C0 C1 C2 C3 C4 C5 C6 C7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// C8 C9 CA CB CC CD CE CF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// D0 D1 D2 D3 D4 D5 D6 D7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// D8 D9 DA DB DC DD DE DF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// E0 E1 E2 E3 E4 E5 E6 E7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// E8 E9 EA EB EC ED EE EF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// F0 F1 F2 F3 F4 F5 F6 F7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// F8 F9 FA FB FC FD FE FF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t USERINFO_ENCODE_SET[32] = {
|
||||||
|
// 00 01 02 03 04 05 06 07
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 08 09 0A 0B 0C 0D 0E 0F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 10 11 12 13 14 15 16 17
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 18 19 1A 1B 1C 1D 1E 1F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 20 21 22 23 24 25 26 27
|
||||||
|
0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 28 29 2A 2B 2C 2D 2E 2F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80,
|
||||||
|
// 30 31 32 33 34 35 36 37
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 38 39 3A 3B 3C 3D 3E 3F
|
||||||
|
0x00 | 0x00 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 40 41 42 43 44 45 46 47
|
||||||
|
0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 48 49 4A 4B 4C 4D 4E 4F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 50 51 52 53 54 55 56 57
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 58 59 5A 5B 5C 5D 5E 5F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x40 | 0x00,
|
||||||
|
// 60 61 62 63 64 65 66 67
|
||||||
|
0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 68 69 6A 6B 6C 6D 6E 6F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 70 71 72 73 74 75 76 77
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 78 79 7A 7B 7C 7D 7E 7F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x00 | 0x80,
|
||||||
|
// 80 81 82 83 84 85 86 87
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 88 89 8A 8B 8C 8D 8E 8F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 90 91 92 93 94 95 96 97
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 98 99 9A 9B 9C 9D 9E 9F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// A0 A1 A2 A3 A4 A5 A6 A7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// A8 A9 AA AB AC AD AE AF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// B0 B1 B2 B3 B4 B5 B6 B7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// B8 B9 BA BB BC BD BE BF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// C0 C1 C2 C3 C4 C5 C6 C7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// C8 C9 CA CB CC CD CE CF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// D0 D1 D2 D3 D4 D5 D6 D7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// D8 D9 DA DB DC DD DE DF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// E0 E1 E2 E3 E4 E5 E6 E7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// E8 E9 EA EB EC ED EE EF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// F0 F1 F2 F3 F4 F5 F6 F7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// F8 F9 FA FB FC FD FE FF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t QUERY_ENCODE_SET[32] = {
|
||||||
|
// 00 01 02 03 04 05 06 07
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 08 09 0A 0B 0C 0D 0E 0F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 10 11 12 13 14 15 16 17
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 18 19 1A 1B 1C 1D 1E 1F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 20 21 22 23 24 25 26 27
|
||||||
|
0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 28 29 2A 2B 2C 2D 2E 2F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 30 31 32 33 34 35 36 37
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 38 39 3A 3B 3C 3D 3E 3F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x00,
|
||||||
|
// 40 41 42 43 44 45 46 47
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 48 49 4A 4B 4C 4D 4E 4F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 50 51 52 53 54 55 56 57
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 58 59 5A 5B 5C 5D 5E 5F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 60 61 62 63 64 65 66 67
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 68 69 6A 6B 6C 6D 6E 6F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 70 71 72 73 74 75 76 77
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
||||||
|
// 78 79 7A 7B 7C 7D 7E 7F
|
||||||
|
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80,
|
||||||
|
// 80 81 82 83 84 85 86 87
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 88 89 8A 8B 8C 8D 8E 8F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 90 91 92 93 94 95 96 97
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// 98 99 9A 9B 9C 9D 9E 9F
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// A0 A1 A2 A3 A4 A5 A6 A7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// A8 A9 AA AB AC AD AE AF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// B0 B1 B2 B3 B4 B5 B6 B7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// B8 B9 BA BB BC BD BE BF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// C0 C1 C2 C3 C4 C5 C6 C7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// C8 C9 CA CB CC CD CE CF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// D0 D1 D2 D3 D4 D5 D6 D7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// D8 D9 DA DB DC DD DE DF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// E0 E1 E2 E3 E4 E5 E6 E7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// E8 E9 EA EB EC ED EE EF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// F0 F1 F2 F3 F4 F5 F6 F7
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
||||||
|
// F8 F9 FA FB FC FD FE FF
|
||||||
|
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline bool BitAt(const uint8_t a[], const uint8_t i) {
|
||||||
|
return !!(a[i >> 3] & (1 << (i & 7)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Appends ch to str. If ch position in encode_set is set, the ch will
|
||||||
|
// be percent-encoded then appended.
|
||||||
|
static inline void AppendOrEscape(std::string* str,
|
||||||
|
const unsigned char ch,
|
||||||
|
const uint8_t encode_set[]) {
|
||||||
|
if (BitAt(encode_set, ch))
|
||||||
|
*str += hex[ch];
|
||||||
|
else
|
||||||
|
*str += ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static inline unsigned hex2bin(const T ch) {
|
||||||
|
if (ch >= '0' && ch <= '9')
|
||||||
|
return ch - '0';
|
||||||
|
if (ch >= 'A' && ch <= 'F')
|
||||||
|
return 10 + (ch - 'A');
|
||||||
|
if (ch >= 'a' && ch <= 'f')
|
||||||
|
return 10 + (ch - 'a');
|
||||||
|
return static_cast<unsigned>(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void PercentDecode(const char* input,
|
||||||
|
size_t len,
|
||||||
|
std::string* dest) {
|
||||||
|
if (len == 0)
|
||||||
|
return;
|
||||||
|
dest->reserve(len);
|
||||||
|
const char* pointer = input;
|
||||||
|
const char* end = input + len;
|
||||||
|
size_t remaining = pointer - end - 1;
|
||||||
|
while (pointer < end) {
|
||||||
|
const char ch = pointer[0];
|
||||||
|
remaining = (end - pointer) + 1;
|
||||||
|
if (ch != '%' || remaining < 2 ||
|
||||||
|
(ch == '%' &&
|
||||||
|
(!IsASCIIHexDigit(pointer[1]) ||
|
||||||
|
!IsASCIIHexDigit(pointer[2])))) {
|
||||||
|
*dest += ch;
|
||||||
|
pointer++;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
unsigned a = hex2bin(pointer[1]);
|
||||||
|
unsigned b = hex2bin(pointer[2]);
|
||||||
|
char c = static_cast<char>(a * 16 + b);
|
||||||
|
*dest += c;
|
||||||
|
pointer += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SPECIALS(XX) \
|
||||||
|
XX("ftp:", 21) \
|
||||||
|
XX("file:", -1) \
|
||||||
|
XX("gopher:", 70) \
|
||||||
|
XX("http:", 80) \
|
||||||
|
XX("https:", 443) \
|
||||||
|
XX("ws:", 80) \
|
||||||
|
XX("wss:", 443)
|
||||||
|
|
||||||
|
static inline bool IsSpecial(std::string scheme) {
|
||||||
|
#define XX(name, _) if (scheme == name) return true;
|
||||||
|
SPECIALS(XX);
|
||||||
|
#undef XX
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int NormalizePort(std::string scheme, int p) {
|
||||||
|
#define XX(name, port) if (scheme == name && p == port) return -1;
|
||||||
|
SPECIALS(XX);
|
||||||
|
#undef XX
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(NODE_HAVE_I18N_SUPPORT)
|
#if defined(NODE_HAVE_I18N_SUPPORT)
|
||||||
static inline bool ToUnicode(std::string* input, std::string* output) {
|
static inline bool ToUnicode(std::string* input, std::string* output) {
|
||||||
MaybeStackBuffer<char> buf;
|
MaybeStackBuffer<char> buf;
|
||||||
@ -84,21 +581,6 @@ namespace url {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// If a UTF-16 character is a low/trailing surrogate.
|
|
||||||
static inline bool IsUnicodeTrail(uint16_t c) {
|
|
||||||
return (c & 0xFC00) == 0xDC00;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If a UTF-16 character is a surrogate.
|
|
||||||
static inline bool IsUnicodeSurrogate(uint16_t c) {
|
|
||||||
return (c & 0xF800) == 0xD800;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If a UTF-16 surrogate is a low/trailing one.
|
|
||||||
static inline bool IsUnicodeSurrogateTrail(uint16_t c) {
|
|
||||||
return (c & 0x400) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static url_host_type ParseIPv6Host(url_host* host,
|
static url_host_type ParseIPv6Host(url_host* host,
|
||||||
const char* input,
|
const char* input,
|
||||||
size_t length) {
|
size_t length) {
|
||||||
@ -134,7 +616,7 @@ namespace url {
|
|||||||
}
|
}
|
||||||
value = 0;
|
value = 0;
|
||||||
len = 0;
|
len = 0;
|
||||||
while (len < 4 && ASCII_HEX_DIGIT(ch)) {
|
while (len < 4 && IsASCIIHexDigit(ch)) {
|
||||||
value = value * 0x10 + hex2bin(ch);
|
value = value * 0x10 + hex2bin(ch);
|
||||||
pointer++;
|
pointer++;
|
||||||
ch = pointer < end ? pointer[0] : kEOL;
|
ch = pointer < end ? pointer[0] : kEOL;
|
||||||
@ -159,9 +641,9 @@ namespace url {
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ASCII_DIGIT(ch))
|
if (!IsASCIIDigit(ch))
|
||||||
goto end;
|
goto end;
|
||||||
while (ASCII_DIGIT(ch)) {
|
while (IsASCIIDigit(ch)) {
|
||||||
unsigned number = ch - '0';
|
unsigned number = ch - '0';
|
||||||
if (value == 0xffffffff) {
|
if (value == 0xffffffff) {
|
||||||
value = number;
|
value = number;
|
||||||
@ -241,11 +723,11 @@ namespace url {
|
|||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
if (!ASCII_DIGIT(ch))
|
if (!IsASCIIDigit(ch))
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
if (!ASCII_HEX_DIGIT(ch))
|
if (!IsASCIIHexDigit(ch))
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -543,7 +1025,7 @@ namespace url {
|
|||||||
case 3:
|
case 3:
|
||||||
return str[0] == '%' &&
|
return str[0] == '%' &&
|
||||||
str[1] == '2' &&
|
str[1] == '2' &&
|
||||||
TO_LOWER(str[2]) == 'e';
|
ASCIILowercase(str[2]) == 'e';
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -562,18 +1044,18 @@ namespace url {
|
|||||||
return ((str[0] == '.' &&
|
return ((str[0] == '.' &&
|
||||||
str[1] == '%' &&
|
str[1] == '%' &&
|
||||||
str[2] == '2' &&
|
str[2] == '2' &&
|
||||||
TO_LOWER(str[3]) == 'e') ||
|
ASCIILowercase(str[3]) == 'e') ||
|
||||||
(str[0] == '%' &&
|
(str[0] == '%' &&
|
||||||
str[1] == '2' &&
|
str[1] == '2' &&
|
||||||
TO_LOWER(str[2]) == 'e' &&
|
ASCIILowercase(str[2]) == 'e' &&
|
||||||
str[3] == '.'));
|
str[3] == '.'));
|
||||||
case 6:
|
case 6:
|
||||||
return (str[0] == '%' &&
|
return (str[0] == '%' &&
|
||||||
str[1] == '2' &&
|
str[1] == '2' &&
|
||||||
TO_LOWER(str[2]) == 'e' &&
|
ASCIILowercase(str[2]) == 'e' &&
|
||||||
str[3] == '%' &&
|
str[3] == '%' &&
|
||||||
str[4] == '2' &&
|
str[4] == '2' &&
|
||||||
TO_LOWER(str[5]) == 'e');
|
ASCIILowercase(str[5]) == 'e');
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -582,7 +1064,7 @@ namespace url {
|
|||||||
static inline void ShortenUrlPath(struct url_data* url) {
|
static inline void ShortenUrlPath(struct url_data* url) {
|
||||||
if (url->path.empty()) return;
|
if (url->path.empty()) return;
|
||||||
if (url->path.size() == 1 && url->scheme == "file:" &&
|
if (url->path.size() == 1 && url->scheme == "file:" &&
|
||||||
NORMALIZED_WINDOWS_DRIVE_LETTER(url->path[0])) return;
|
IsNormalizedWindowsDriveLetter(url->path[0])) return;
|
||||||
url->path.pop_back();
|
url->path.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -624,7 +1106,7 @@ namespace url {
|
|||||||
while (p <= end) {
|
while (p <= end) {
|
||||||
const char ch = p < end ? p[0] : kEOL;
|
const char ch = p < end ? p[0] : kEOL;
|
||||||
|
|
||||||
if (TAB_AND_NEWLINE(ch)) {
|
if (IsASCIITabOrNewline(ch)) {
|
||||||
if (state == kAuthority) {
|
if (state == kAuthority) {
|
||||||
// It's necessary to keep track of how much whitespace
|
// It's necessary to keep track of how much whitespace
|
||||||
// is being ignored when in kAuthority state because of
|
// is being ignored when in kAuthority state because of
|
||||||
@ -641,8 +1123,8 @@ namespace url {
|
|||||||
const bool special_back_slash = (special && ch == '\\');
|
const bool special_back_slash = (special && ch == '\\');
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case kSchemeStart:
|
case kSchemeStart:
|
||||||
if (ASCII_ALPHA(ch)) {
|
if (IsASCIIAlpha(ch)) {
|
||||||
buffer += TO_LOWER(ch);
|
buffer += ASCIILowercase(ch);
|
||||||
state = kScheme;
|
state = kScheme;
|
||||||
} else if (!has_state_override) {
|
} else if (!has_state_override) {
|
||||||
state = kNoScheme;
|
state = kNoScheme;
|
||||||
@ -653,8 +1135,8 @@ namespace url {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kScheme:
|
case kScheme:
|
||||||
if (SCHEME_CHAR(ch)) {
|
if (IsASCIIAlphanumeric(ch) || ch == '+' || ch == '-' || ch == '.') {
|
||||||
buffer += TO_LOWER(ch);
|
buffer += ASCIILowercase(ch);
|
||||||
p++;
|
p++;
|
||||||
continue;
|
continue;
|
||||||
} else if (ch == ':' || (has_state_override && ch == kEOL)) {
|
} else if (ch == ':' || (has_state_override && ch == kEOL)) {
|
||||||
@ -921,9 +1403,9 @@ namespace url {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (uflag) {
|
if (uflag) {
|
||||||
AppendOrEscape(&url->password, bch, UserinfoEncodeSet);
|
AppendOrEscape(&url->password, bch, USERINFO_ENCODE_SET);
|
||||||
} else {
|
} else {
|
||||||
AppendOrEscape(&url->username, bch, UserinfoEncodeSet);
|
AppendOrEscape(&url->username, bch, USERINFO_ENCODE_SET);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
@ -981,11 +1463,11 @@ namespace url {
|
|||||||
sbflag = true;
|
sbflag = true;
|
||||||
if (ch == ']')
|
if (ch == ']')
|
||||||
sbflag = false;
|
sbflag = false;
|
||||||
buffer += TO_LOWER(ch);
|
buffer += ASCIILowercase(ch);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kPort:
|
case kPort:
|
||||||
if (ASCII_DIGIT(ch)) {
|
if (IsASCIIDigit(ch)) {
|
||||||
buffer += ch;
|
buffer += ch;
|
||||||
} else if (has_state_override ||
|
} else if (has_state_override ||
|
||||||
ch == kEOL ||
|
ch == kEOL ||
|
||||||
@ -1085,7 +1567,7 @@ namespace url {
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
if (base_is_file &&
|
if (base_is_file &&
|
||||||
(!WINDOWS_DRIVE_LETTER(ch, p[1]) ||
|
(!IsWindowsDriveLetter(ch, p[1]) ||
|
||||||
end - p == 1 ||
|
end - p == 1 ||
|
||||||
(p[2] != '/' &&
|
(p[2] != '/' &&
|
||||||
p[2] != '\\' &&
|
p[2] != '\\' &&
|
||||||
@ -1111,7 +1593,7 @@ namespace url {
|
|||||||
} else {
|
} else {
|
||||||
if (has_base &&
|
if (has_base &&
|
||||||
base->scheme == "file:") {
|
base->scheme == "file:") {
|
||||||
if (NORMALIZED_WINDOWS_DRIVE_LETTER(base->path[0])) {
|
if (IsNormalizedWindowsDriveLetter(base->path[0])) {
|
||||||
url->flags |= URL_FLAGS_HAS_PATH;
|
url->flags |= URL_FLAGS_HAS_PATH;
|
||||||
url->path.push_back(base->path[0]);
|
url->path.push_back(base->path[0]);
|
||||||
} else {
|
} else {
|
||||||
@ -1130,7 +1612,7 @@ namespace url {
|
|||||||
ch == '?' ||
|
ch == '?' ||
|
||||||
ch == '#') {
|
ch == '#') {
|
||||||
if (buffer.size() == 2 &&
|
if (buffer.size() == 2 &&
|
||||||
WINDOWS_DRIVE_LETTER(buffer[0], buffer[1])) {
|
IsWindowsDriveLetter(buffer)) {
|
||||||
state = kPath;
|
state = kPath;
|
||||||
} else if (buffer.size() == 0) {
|
} else if (buffer.size() == 0) {
|
||||||
state = kPathStart;
|
state = kPathStart;
|
||||||
@ -1191,7 +1673,7 @@ namespace url {
|
|||||||
if (url->scheme == "file:" &&
|
if (url->scheme == "file:" &&
|
||||||
url->path.empty() &&
|
url->path.empty() &&
|
||||||
buffer.size() == 2 &&
|
buffer.size() == 2 &&
|
||||||
WINDOWS_DRIVE_LETTER(buffer[0], buffer[1])) {
|
IsWindowsDriveLetter(buffer)) {
|
||||||
url->flags &= ~URL_FLAGS_HAS_HOST;
|
url->flags &= ~URL_FLAGS_HAS_HOST;
|
||||||
buffer[1] = ':';
|
buffer[1] = ':';
|
||||||
}
|
}
|
||||||
@ -1215,7 +1697,7 @@ namespace url {
|
|||||||
state = kFragment;
|
state = kFragment;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
AppendOrEscape(&buffer, ch, DefaultEncodeSet);
|
AppendOrEscape(&buffer, ch, DEFAULT_ENCODE_SET);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kCannotBeBase:
|
case kCannotBeBase:
|
||||||
@ -1230,7 +1712,7 @@ namespace url {
|
|||||||
if (url->path.size() == 0)
|
if (url->path.size() == 0)
|
||||||
url->path.push_back("");
|
url->path.push_back("");
|
||||||
if (url->path.size() > 0 && ch != kEOL)
|
if (url->path.size() > 0 && ch != kEOL)
|
||||||
AppendOrEscape(&url->path[0], ch, SimpleEncodeSet);
|
AppendOrEscape(&url->path[0], ch, SIMPLE_ENCODE_SET);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kQuery:
|
case kQuery:
|
||||||
@ -1241,7 +1723,7 @@ namespace url {
|
|||||||
if (ch == '#')
|
if (ch == '#')
|
||||||
state = kFragment;
|
state = kFragment;
|
||||||
} else {
|
} else {
|
||||||
AppendOrEscape(&buffer, ch, QueryEncodeSet);
|
AppendOrEscape(&buffer, ch, QUERY_ENCODE_SET);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kFragment:
|
case kFragment:
|
||||||
@ -1253,7 +1735,7 @@ namespace url {
|
|||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
AppendOrEscape(&buffer, ch, SimpleEncodeSet);
|
AppendOrEscape(&buffer, ch, SIMPLE_ENCODE_SET);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1263,7 +1745,7 @@ namespace url {
|
|||||||
|
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
}
|
} // NOLINT(readability/fn_size)
|
||||||
|
|
||||||
static inline void SetArgs(Environment* env,
|
static inline void SetArgs(Environment* env,
|
||||||
Local<Value> argv[],
|
Local<Value> argv[],
|
||||||
@ -1382,7 +1864,7 @@ namespace url {
|
|||||||
output.reserve(len);
|
output.reserve(len);
|
||||||
for (size_t n = 0; n < len; n++) {
|
for (size_t n = 0; n < len; n++) {
|
||||||
const char ch = (*value)[n];
|
const char ch = (*value)[n];
|
||||||
AppendOrEscape(&output, ch, UserinfoEncodeSet);
|
AppendOrEscape(&output, ch, USERINFO_ENCODE_SET);
|
||||||
}
|
}
|
||||||
args.GetReturnValue().Set(
|
args.GetReturnValue().Set(
|
||||||
String::NewFromUtf8(env->isolate(),
|
String::NewFromUtf8(env->isolate(),
|
||||||
@ -1403,17 +1885,17 @@ namespace url {
|
|||||||
CHECK_GE(start, 0);
|
CHECK_GE(start, 0);
|
||||||
|
|
||||||
for (size_t i = start; i < n; i++) {
|
for (size_t i = start; i < n; i++) {
|
||||||
uint16_t c = value[i];
|
char16_t c = value[i];
|
||||||
if (!IsUnicodeSurrogate(c)) {
|
if (!IsUnicodeSurrogate(c)) {
|
||||||
continue;
|
continue;
|
||||||
} else if (IsUnicodeSurrogateTrail(c) || i == n - 1) {
|
} else if (IsUnicodeSurrogateTrail(c) || i == n - 1) {
|
||||||
value[i] = UNICODE_REPLACEMENT_CHARACTER;
|
value[i] = kUnicodeReplacementCharacter;
|
||||||
} else {
|
} else {
|
||||||
uint16_t d = value[i + 1];
|
char16_t d = value[i + 1];
|
||||||
if (IsUnicodeTrail(d)) {
|
if (IsUnicodeTrail(d)) {
|
||||||
i++;
|
i++;
|
||||||
} else {
|
} else {
|
||||||
value[i] = UNICODE_REPLACEMENT_CHARACTER;
|
value[i] = kUnicodeReplacementCharacter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1534,7 +2016,6 @@ namespace url {
|
|||||||
#undef XX
|
#undef XX
|
||||||
|
|
||||||
#define XX(name) NODE_DEFINE_CONSTANT(target, name);
|
#define XX(name) NODE_DEFINE_CONSTANT(target, name);
|
||||||
ARGS(XX)
|
|
||||||
PARSESTATES(XX)
|
PARSESTATES(XX)
|
||||||
#undef XX
|
#undef XX
|
||||||
}
|
}
|
||||||
|
467
src/node_url.h
467
src/node_url.h
@ -16,411 +16,6 @@ using v8::Local;
|
|||||||
using v8::Value;
|
using v8::Value;
|
||||||
|
|
||||||
|
|
||||||
#define BIT_AT(a, i) \
|
|
||||||
(!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \
|
|
||||||
(1 << ((unsigned int) (i) & 7))))
|
|
||||||
#define TAB_AND_NEWLINE(ch) \
|
|
||||||
(ch == 0x09 || ch == 0x0a || ch == 0x0d)
|
|
||||||
#define ASCII_DIGIT(ch) \
|
|
||||||
(ch >= 0x30 && ch <= 0x39)
|
|
||||||
#define ASCII_HEX_DIGIT(ch) \
|
|
||||||
(ASCII_DIGIT(ch) || (ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66))
|
|
||||||
#define ASCII_ALPHA(ch) \
|
|
||||||
((ch >= 0x41 && ch <= 0x5a) || (ch >= 0x61 && ch <= 0x7a))
|
|
||||||
#define ASCII_ALPHANUMERIC(ch) \
|
|
||||||
(ASCII_DIGIT(ch) || ASCII_ALPHA(ch))
|
|
||||||
#define TO_LOWER(ch) \
|
|
||||||
(ASCII_ALPHA(ch) ? (ch | 0x20) : ch)
|
|
||||||
#define SCHEME_CHAR(ch) \
|
|
||||||
(ASCII_ALPHANUMERIC(ch) || ch == '+' || ch == '-' || ch == '.')
|
|
||||||
#define WINDOWS_DRIVE_LETTER(ch, next) \
|
|
||||||
(ASCII_ALPHA(ch) && (next == ':' || next == '|'))
|
|
||||||
#define NORMALIZED_WINDOWS_DRIVE_LETTER(str) \
|
|
||||||
(str.length() == 2 && \
|
|
||||||
ASCII_ALPHA(str[0]) && \
|
|
||||||
str[1] == ':')
|
|
||||||
|
|
||||||
static const char* hex[256] = {
|
|
||||||
"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
|
|
||||||
"%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E", "%0F",
|
|
||||||
"%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
|
|
||||||
"%18", "%19", "%1A", "%1B", "%1C", "%1D", "%1E", "%1F",
|
|
||||||
"%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
|
|
||||||
"%28", "%29", "%2A", "%2B", "%2C", "%2D", "%2E", "%2F",
|
|
||||||
"%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
|
|
||||||
"%38", "%39", "%3A", "%3B", "%3C", "%3D", "%3E", "%3F",
|
|
||||||
"%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
|
|
||||||
"%48", "%49", "%4A", "%4B", "%4C", "%4D", "%4E", "%4F",
|
|
||||||
"%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
|
|
||||||
"%58", "%59", "%5A", "%5B", "%5C", "%5D", "%5E", "%5F",
|
|
||||||
"%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
|
|
||||||
"%68", "%69", "%6A", "%6B", "%6C", "%6D", "%6E", "%6F",
|
|
||||||
"%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
|
|
||||||
"%78", "%79", "%7A", "%7B", "%7C", "%7D", "%7E", "%7F",
|
|
||||||
"%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
|
|
||||||
"%88", "%89", "%8A", "%8B", "%8C", "%8D", "%8E", "%8F",
|
|
||||||
"%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
|
|
||||||
"%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F",
|
|
||||||
"%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7",
|
|
||||||
"%A8", "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF",
|
|
||||||
"%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7",
|
|
||||||
"%B8", "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF",
|
|
||||||
"%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7",
|
|
||||||
"%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF",
|
|
||||||
"%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7",
|
|
||||||
"%D8", "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF",
|
|
||||||
"%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7",
|
|
||||||
"%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF",
|
|
||||||
"%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7",
|
|
||||||
"%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t SIMPLE_ENCODE_SET[32] = {
|
|
||||||
// 00 01 02 03 04 05 06 07
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 08 09 0A 0B 0C 0D 0E 0F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 10 11 12 13 14 15 16 17
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 18 19 1A 1B 1C 1D 1E 1F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 20 21 22 23 24 25 26 27
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 28 29 2A 2B 2C 2D 2E 2F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 30 31 32 33 34 35 36 37
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 38 39 3A 3B 3C 3D 3E 3F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 40 41 42 43 44 45 46 47
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 48 49 4A 4B 4C 4D 4E 4F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 50 51 52 53 54 55 56 57
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 58 59 5A 5B 5C 5D 5E 5F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 60 61 62 63 64 65 66 67
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 68 69 6A 6B 6C 6D 6E 6F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 70 71 72 73 74 75 76 77
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 78 79 7A 7B 7C 7D 7E 7F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80,
|
|
||||||
// 80 81 82 83 84 85 86 87
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 88 89 8A 8B 8C 8D 8E 8F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 90 91 92 93 94 95 96 97
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 98 99 9A 9B 9C 9D 9E 9F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// A0 A1 A2 A3 A4 A5 A6 A7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// A8 A9 AA AB AC AD AE AF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// B0 B1 B2 B3 B4 B5 B6 B7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// B8 B9 BA BB BC BD BE BF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// C0 C1 C2 C3 C4 C5 C6 C7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// C8 C9 CA CB CC CD CE CF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// D0 D1 D2 D3 D4 D5 D6 D7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// D8 D9 DA DB DC DD DE DF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// E0 E1 E2 E3 E4 E5 E6 E7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// E8 E9 EA EB EC ED EE EF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// F0 F1 F2 F3 F4 F5 F6 F7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// F8 F9 FA FB FC FD FE FF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t DEFAULT_ENCODE_SET[32] = {
|
|
||||||
// 00 01 02 03 04 05 06 07
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 08 09 0A 0B 0C 0D 0E 0F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 10 11 12 13 14 15 16 17
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 18 19 1A 1B 1C 1D 1E 1F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 20 21 22 23 24 25 26 27
|
|
||||||
0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 28 29 2A 2B 2C 2D 2E 2F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 30 31 32 33 34 35 36 37
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 38 39 3A 3B 3C 3D 3E 3F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x80,
|
|
||||||
// 40 41 42 43 44 45 46 47
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 48 49 4A 4B 4C 4D 4E 4F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 50 51 52 53 54 55 56 57
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 58 59 5A 5B 5C 5D 5E 5F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 60 61 62 63 64 65 66 67
|
|
||||||
0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 68 69 6A 6B 6C 6D 6E 6F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 70 71 72 73 74 75 76 77
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 78 79 7A 7B 7C 7D 7E 7F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x00 | 0x80,
|
|
||||||
// 80 81 82 83 84 85 86 87
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 88 89 8A 8B 8C 8D 8E 8F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 90 91 92 93 94 95 96 97
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 98 99 9A 9B 9C 9D 9E 9F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// A0 A1 A2 A3 A4 A5 A6 A7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// A8 A9 AA AB AC AD AE AF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// B0 B1 B2 B3 B4 B5 B6 B7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// B8 B9 BA BB BC BD BE BF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// C0 C1 C2 C3 C4 C5 C6 C7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// C8 C9 CA CB CC CD CE CF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// D0 D1 D2 D3 D4 D5 D6 D7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// D8 D9 DA DB DC DD DE DF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// E0 E1 E2 E3 E4 E5 E6 E7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// E8 E9 EA EB EC ED EE EF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// F0 F1 F2 F3 F4 F5 F6 F7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// F8 F9 FA FB FC FD FE FF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t USERINFO_ENCODE_SET[32] = {
|
|
||||||
// 00 01 02 03 04 05 06 07
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 08 09 0A 0B 0C 0D 0E 0F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 10 11 12 13 14 15 16 17
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 18 19 1A 1B 1C 1D 1E 1F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 20 21 22 23 24 25 26 27
|
|
||||||
0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 28 29 2A 2B 2C 2D 2E 2F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80,
|
|
||||||
// 30 31 32 33 34 35 36 37
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 38 39 3A 3B 3C 3D 3E 3F
|
|
||||||
0x00 | 0x00 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 40 41 42 43 44 45 46 47
|
|
||||||
0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 48 49 4A 4B 4C 4D 4E 4F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 50 51 52 53 54 55 56 57
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 58 59 5A 5B 5C 5D 5E 5F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x40 | 0x00,
|
|
||||||
// 60 61 62 63 64 65 66 67
|
|
||||||
0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 68 69 6A 6B 6C 6D 6E 6F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 70 71 72 73 74 75 76 77
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 78 79 7A 7B 7C 7D 7E 7F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x00 | 0x80,
|
|
||||||
// 80 81 82 83 84 85 86 87
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 88 89 8A 8B 8C 8D 8E 8F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 90 91 92 93 94 95 96 97
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 98 99 9A 9B 9C 9D 9E 9F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// A0 A1 A2 A3 A4 A5 A6 A7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// A8 A9 AA AB AC AD AE AF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// B0 B1 B2 B3 B4 B5 B6 B7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// B8 B9 BA BB BC BD BE BF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// C0 C1 C2 C3 C4 C5 C6 C7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// C8 C9 CA CB CC CD CE CF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// D0 D1 D2 D3 D4 D5 D6 D7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// D8 D9 DA DB DC DD DE DF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// E0 E1 E2 E3 E4 E5 E6 E7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// E8 E9 EA EB EC ED EE EF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// F0 F1 F2 F3 F4 F5 F6 F7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// F8 F9 FA FB FC FD FE FF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t QUERY_ENCODE_SET[32] = {
|
|
||||||
// 00 01 02 03 04 05 06 07
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 08 09 0A 0B 0C 0D 0E 0F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 10 11 12 13 14 15 16 17
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 18 19 1A 1B 1C 1D 1E 1F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 20 21 22 23 24 25 26 27
|
|
||||||
0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 28 29 2A 2B 2C 2D 2E 2F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 30 31 32 33 34 35 36 37
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 38 39 3A 3B 3C 3D 3E 3F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x00,
|
|
||||||
// 40 41 42 43 44 45 46 47
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 48 49 4A 4B 4C 4D 4E 4F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 50 51 52 53 54 55 56 57
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 58 59 5A 5B 5C 5D 5E 5F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 60 61 62 63 64 65 66 67
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 68 69 6A 6B 6C 6D 6E 6F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 70 71 72 73 74 75 76 77
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
|
|
||||||
// 78 79 7A 7B 7C 7D 7E 7F
|
|
||||||
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80,
|
|
||||||
// 80 81 82 83 84 85 86 87
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 88 89 8A 8B 8C 8D 8E 8F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 90 91 92 93 94 95 96 97
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// 98 99 9A 9B 9C 9D 9E 9F
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// A0 A1 A2 A3 A4 A5 A6 A7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// A8 A9 AA AB AC AD AE AF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// B0 B1 B2 B3 B4 B5 B6 B7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// B8 B9 BA BB BC BD BE BF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// C0 C1 C2 C3 C4 C5 C6 C7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// C8 C9 CA CB CC CD CE CF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// D0 D1 D2 D3 D4 D5 D6 D7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// D8 D9 DA DB DC DD DE DF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// E0 E1 E2 E3 E4 E5 E6 E7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// E8 E9 EA EB EC ED EE EF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// F0 F1 F2 F3 F4 F5 F6 F7
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
|
|
||||||
// F8 F9 FA FB FC FD FE FF
|
|
||||||
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
|
|
||||||
};
|
|
||||||
|
|
||||||
// Must return true if the character is to be percent-encoded
|
|
||||||
typedef bool (*must_escape_cb)(const unsigned char ch);
|
|
||||||
|
|
||||||
// Appends ch to str. If test(ch) returns true, the ch will
|
|
||||||
// be percent-encoded then appended.
|
|
||||||
static inline void AppendOrEscape(std::string* str,
|
|
||||||
const unsigned char ch,
|
|
||||||
must_escape_cb test) {
|
|
||||||
if (test(ch))
|
|
||||||
*str += hex[ch];
|
|
||||||
else
|
|
||||||
*str += ch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool SimpleEncodeSet(const unsigned char ch) {
|
|
||||||
return BIT_AT(SIMPLE_ENCODE_SET, ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool DefaultEncodeSet(const unsigned char ch) {
|
|
||||||
return BIT_AT(DEFAULT_ENCODE_SET, ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool UserinfoEncodeSet(const unsigned char ch) {
|
|
||||||
return BIT_AT(USERINFO_ENCODE_SET, ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool QueryEncodeSet(const unsigned char ch) {
|
|
||||||
return BIT_AT(QUERY_ENCODE_SET, ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned hex2bin(const char ch) {
|
|
||||||
if (ch >= '0' && ch <= '9')
|
|
||||||
return ch - '0';
|
|
||||||
if (ch >= 'A' && ch <= 'F')
|
|
||||||
return 10 + (ch - 'A');
|
|
||||||
if (ch >= 'a' && ch <= 'f')
|
|
||||||
return 10 + (ch - 'a');
|
|
||||||
return static_cast<unsigned>(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void PercentDecode(const char* input,
|
|
||||||
size_t len,
|
|
||||||
std::string* dest) {
|
|
||||||
if (len == 0)
|
|
||||||
return;
|
|
||||||
dest->reserve(len);
|
|
||||||
const char* pointer = input;
|
|
||||||
const char* end = input + len;
|
|
||||||
size_t remaining = pointer - end - 1;
|
|
||||||
while (pointer < end) {
|
|
||||||
const char ch = pointer[0];
|
|
||||||
remaining = (end - pointer) + 1;
|
|
||||||
if (ch != '%' || remaining < 2 ||
|
|
||||||
(ch == '%' &&
|
|
||||||
(!ASCII_HEX_DIGIT(pointer[1]) ||
|
|
||||||
!ASCII_HEX_DIGIT(pointer[2])))) {
|
|
||||||
*dest += ch;
|
|
||||||
pointer++;
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
unsigned a = hex2bin(pointer[1]);
|
|
||||||
unsigned b = hex2bin(pointer[2]);
|
|
||||||
char c = static_cast<char>(a * 16 + b);
|
|
||||||
*dest += c;
|
|
||||||
pointer += 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SPECIALS(XX) \
|
|
||||||
XX("ftp:", 21) \
|
|
||||||
XX("file:", -1) \
|
|
||||||
XX("gopher:", 70) \
|
|
||||||
XX("http:", 80) \
|
|
||||||
XX("https:", 443) \
|
|
||||||
XX("ws:", 80) \
|
|
||||||
XX("wss:", 443)
|
|
||||||
|
|
||||||
#define PARSESTATES(XX) \
|
#define PARSESTATES(XX) \
|
||||||
XX(kSchemeStart) \
|
XX(kSchemeStart) \
|
||||||
XX(kScheme) \
|
XX(kScheme) \
|
||||||
@ -458,23 +53,6 @@ static inline void PercentDecode(const char* input,
|
|||||||
XX(URL_FLAGS_HAS_QUERY, 0x200) \
|
XX(URL_FLAGS_HAS_QUERY, 0x200) \
|
||||||
XX(URL_FLAGS_HAS_FRAGMENT, 0x400)
|
XX(URL_FLAGS_HAS_FRAGMENT, 0x400)
|
||||||
|
|
||||||
#define ARGS(XX) \
|
|
||||||
XX(ARG_FLAGS) \
|
|
||||||
XX(ARG_PROTOCOL) \
|
|
||||||
XX(ARG_USERNAME) \
|
|
||||||
XX(ARG_PASSWORD) \
|
|
||||||
XX(ARG_HOST) \
|
|
||||||
XX(ARG_PORT) \
|
|
||||||
XX(ARG_PATH) \
|
|
||||||
XX(ARG_QUERY) \
|
|
||||||
XX(ARG_FRAGMENT)
|
|
||||||
|
|
||||||
#define ERR_ARGS(XX) \
|
|
||||||
XX(ERR_ARG_FLAGS) \
|
|
||||||
XX(ERR_ARG_INPUT) \
|
|
||||||
|
|
||||||
static const char kEOL = -1;
|
|
||||||
|
|
||||||
enum url_parse_state {
|
enum url_parse_state {
|
||||||
kUnknownState = -1,
|
kUnknownState = -1,
|
||||||
#define XX(name) name,
|
#define XX(name) name,
|
||||||
@ -488,32 +66,6 @@ enum url_flags {
|
|||||||
#undef XX
|
#undef XX
|
||||||
};
|
};
|
||||||
|
|
||||||
enum url_cb_args {
|
|
||||||
#define XX(name) name,
|
|
||||||
ARGS(XX)
|
|
||||||
#undef XX
|
|
||||||
};
|
|
||||||
|
|
||||||
enum url_error_cb_args {
|
|
||||||
#define XX(name) name,
|
|
||||||
ERR_ARGS(XX)
|
|
||||||
#undef XX
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline bool IsSpecial(std::string scheme) {
|
|
||||||
#define XX(name, _) if (scheme == name) return true;
|
|
||||||
SPECIALS(XX);
|
|
||||||
#undef XX
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int NormalizePort(std::string scheme, int p) {
|
|
||||||
#define XX(name, port) if (scheme == name && p == port) return -1;
|
|
||||||
SPECIALS(XX);
|
|
||||||
#undef XX
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct url_data {
|
struct url_data {
|
||||||
int32_t flags = URL_FLAGS_NONE;
|
int32_t flags = URL_FLAGS_NONE;
|
||||||
int port = -1;
|
int port = -1;
|
||||||
@ -526,25 +78,6 @@ struct url_data {
|
|||||||
std::vector<std::string> path;
|
std::vector<std::string> path;
|
||||||
};
|
};
|
||||||
|
|
||||||
union url_host_value {
|
|
||||||
std::string domain;
|
|
||||||
uint32_t ipv4;
|
|
||||||
uint16_t ipv6[8];
|
|
||||||
~url_host_value() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
enum url_host_type {
|
|
||||||
HOST_TYPE_FAILED = -1,
|
|
||||||
HOST_TYPE_DOMAIN = 0,
|
|
||||||
HOST_TYPE_IPV4 = 1,
|
|
||||||
HOST_TYPE_IPV6 = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
struct url_host {
|
|
||||||
url_host_value value;
|
|
||||||
enum url_host_type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
class URL {
|
class URL {
|
||||||
public:
|
public:
|
||||||
static void Parse(const char* input,
|
static void Parse(const char* input,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user