GCC Code Coverage Report
Directory: ../src/ Exec Total Coverage
File: /home/node-core-coverage/node-core-coverage/workdir/node/out/../src/node_url.h Lines: 48 49 98.0 %
Date: 2016-12-18 Branches: 77 92 83.7 %

Line Branch Exec Source
1
#ifndef SRC_NODE_URL_H_
2
#define SRC_NODE_URL_H_
3
4
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
6
#include "node.h"
7
#include <string>
8
9
namespace node {
10
namespace url {
11
12
#define BIT_AT(a, i)                                                          \
13
  (!!((unsigned int) (a)[(unsigned int) (i) >> 3] &                           \
14
  (1 << ((unsigned int) (i) & 7))))
15
#define TAB_AND_NEWLINE(ch)                                                   \
16
  (ch == 0x09 || ch == 0x0a || ch == 0x0d)
17
#define ASCII_DIGIT(ch)                                                       \
18
  (ch >= 0x30 && ch <= 0x39)
19
#define ASCII_HEX_DIGIT(ch)                                                   \
20
  (ASCII_DIGIT(ch) || (ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66))
21
#define ASCII_ALPHA(ch)                                                       \
22
  ((ch >= 0x41 && ch <= 0x5a) || (ch >= 0x61 && ch <= 0x7a))
23
#define ASCII_ALPHANUMERIC(ch)                                                \
24
  (ASCII_DIGIT(ch) || ASCII_ALPHA(ch))
25
#define TO_LOWER(ch)                                                          \
26
  (ASCII_ALPHA(ch) ? (ch | 0x20) : ch)
27
#define SCHEME_CHAR(ch)                                                       \
28
  (ASCII_ALPHANUMERIC(ch) || ch == '+' || ch == '-' || ch == '.')
29
#define WINDOWS_DRIVE_LETTER(ch, next)                                        \
30
  (ASCII_ALPHA(ch) && (next == ':' || next == '|'))
31
#define NORMALIZED_WINDOWS_DRIVE_LETTER(str)                                  \
32
  (str.length() == 2 &&                                                       \
33
  ASCII_ALPHA(str[0]) &&                                                      \
34
  str[1] == ':')
35
36
static const char* hex[256] = {
37
  "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
38
  "%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E", "%0F",
39
  "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
40
  "%18", "%19", "%1A", "%1B", "%1C", "%1D", "%1E", "%1F",
41
  "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
42
  "%28", "%29", "%2A", "%2B", "%2C", "%2D", "%2E", "%2F",
43
  "%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
44
  "%38", "%39", "%3A", "%3B", "%3C", "%3D", "%3E", "%3F",
45
  "%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
46
  "%48", "%49", "%4A", "%4B", "%4C", "%4D", "%4E", "%4F",
47
  "%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
48
  "%58", "%59", "%5A", "%5B", "%5C", "%5D", "%5E", "%5F",
49
  "%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
50
  "%68", "%69", "%6A", "%6B", "%6C", "%6D", "%6E", "%6F",
51
  "%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
52
  "%78", "%79", "%7A", "%7B", "%7C", "%7D", "%7E", "%7F",
53
  "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
54
  "%88", "%89", "%8A", "%8B", "%8C", "%8D", "%8E", "%8F",
55
  "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
56
  "%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F",
57
  "%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7",
58
  "%A8", "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF",
59
  "%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7",
60
  "%B8", "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF",
61
  "%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7",
62
  "%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF",
63
  "%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7",
64
  "%D8", "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF",
65
  "%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7",
66
  "%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF",
67
  "%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7",
68
  "%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF"
69
};
70
71
static const uint8_t SIMPLE_ENCODE_SET[32] = {
72
  // 00     01     02     03     04     05     06     07
73
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
74
  // 08     09     0A     0B     0C     0D     0E     0F
75
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
76
  // 10     11     12     13     14     15     16     17
77
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
78
  // 18     19     1A     1B     1C     1D     1E     1F
79
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
80
  // 20     21     22     23     24     25     26     27
81
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
82
  // 28     29     2A     2B     2C     2D     2E     2F
83
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
84
  // 30     31     32     33     34     35     36     37
85
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
86
  // 38     39     3A     3B     3C     3D     3E     3F
87
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
88
  // 40     41     42     43     44     45     46     47
89
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
90
  // 48     49     4A     4B     4C     4D     4E     4F
91
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
92
  // 50     51     52     53     54     55     56     57
93
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
94
  // 58     59     5A     5B     5C     5D     5E     5F
95
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
96
  // 60     61     62     63     64     65     66     67
97
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
98
  // 68     69     6A     6B     6C     6D     6E     6F
99
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
100
  // 70     71     72     73     74     75     76     77
101
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
102
  // 78     79     7A     7B     7C     7D     7E     7F
103
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80,
104
  // 80     81     82     83     84     85     86     87
105
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
106
  // 88     89     8A     8B     8C     8D     8E     8F
107
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
108
  // 90     91     92     93     94     95     96     97
109
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
110
  // 98     99     9A     9B     9C     9D     9E     9F
111
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
112
  // A0     A1     A2     A3     A4     A5     A6     A7
113
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
114
  // A8     A9     AA     AB     AC     AD     AE     AF
115
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
116
  // B0     B1     B2     B3     B4     B5     B6     B7
117
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
118
  // B8     B9     BA     BB     BC     BD     BE     BF
119
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
120
  // C0     C1     C2     C3     C4     C5     C6     C7
121
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
122
  // C8     C9     CA     CB     CC     CD     CE     CF
123
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
124
  // D0     D1     D2     D3     D4     D5     D6     D7
125
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
126
  // D8     D9     DA     DB     DC     DD     DE     DF
127
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
128
  // E0     E1     E2     E3     E4     E5     E6     E7
129
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
130
  // E8     E9     EA     EB     EC     ED     EE     EF
131
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
132
  // F0     F1     F2     F3     F4     F5     F6     F7
133
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
134
  // F8     F9     FA     FB     FC     FD     FE     FF
135
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
136
};
137
138
static const uint8_t DEFAULT_ENCODE_SET[32] = {
139
  // 00     01     02     03     04     05     06     07
140
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
141
  // 08     09     0A     0B     0C     0D     0E     0F
142
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
143
  // 10     11     12     13     14     15     16     17
144
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
145
  // 18     19     1A     1B     1C     1D     1E     1F
146
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
147
  // 20     21     22     23     24     25     26     27
148
    0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00,
149
  // 28     29     2A     2B     2C     2D     2E     2F
150
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
151
  // 30     31     32     33     34     35     36     37
152
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
153
  // 38     39     3A     3B     3C     3D     3E     3F
154
    0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x80,
155
  // 40     41     42     43     44     45     46     47
156
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
157
  // 48     49     4A     4B     4C     4D     4E     4F
158
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
159
  // 50     51     52     53     54     55     56     57
160
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
161
  // 58     59     5A     5B     5C     5D     5E     5F
162
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
163
  // 60     61     62     63     64     65     66     67
164
    0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
165
  // 68     69     6A     6B     6C     6D     6E     6F
166
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
167
  // 70     71     72     73     74     75     76     77
168
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
169
  // 78     79     7A     7B     7C     7D     7E     7F
170
    0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x00 | 0x80,
171
  // 80     81     82     83     84     85     86     87
172
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
173
  // 88     89     8A     8B     8C     8D     8E     8F
174
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
175
  // 90     91     92     93     94     95     96     97
176
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
177
  // 98     99     9A     9B     9C     9D     9E     9F
178
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
179
  // A0     A1     A2     A3     A4     A5     A6     A7
180
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
181
  // A8     A9     AA     AB     AC     AD     AE     AF
182
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
183
  // B0     B1     B2     B3     B4     B5     B6     B7
184
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
185
  // B8     B9     BA     BB     BC     BD     BE     BF
186
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
187
  // C0     C1     C2     C3     C4     C5     C6     C7
188
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
189
  // C8     C9     CA     CB     CC     CD     CE     CF
190
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
191
  // D0     D1     D2     D3     D4     D5     D6     D7
192
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
193
  // D8     D9     DA     DB     DC     DD     DE     DF
194
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
195
  // E0     E1     E2     E3     E4     E5     E6     E7
196
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
197
  // E8     E9     EA     EB     EC     ED     EE     EF
198
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
199
  // F0     F1     F2     F3     F4     F5     F6     F7
200
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
201
  // F8     F9     FA     FB     FC     FD     FE     FF
202
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
203
};
204
205
static const uint8_t USERINFO_ENCODE_SET[32] = {
206
  // 00     01     02     03     04     05     06     07
207
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
208
  // 08     09     0A     0B     0C     0D     0E     0F
209
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
210
  // 10     11     12     13     14     15     16     17
211
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
212
  // 18     19     1A     1B     1C     1D     1E     1F
213
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
214
  // 20     21     22     23     24     25     26     27
215
    0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00,
216
  // 28     29     2A     2B     2C     2D     2E     2F
217
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80,
218
  // 30     31     32     33     34     35     36     37
219
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
220
  // 38     39     3A     3B     3C     3D     3E     3F
221
    0x00 | 0x00 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
222
  // 40     41     42     43     44     45     46     47
223
    0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
224
  // 48     49     4A     4B     4C     4D     4E     4F
225
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
226
  // 50     51     52     53     54     55     56     57
227
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
228
  // 58     59     5A     5B     5C     5D     5E     5F
229
    0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x40 | 0x00,
230
  // 60     61     62     63     64     65     66     67
231
    0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
232
  // 68     69     6A     6B     6C     6D     6E     6F
233
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
234
  // 70     71     72     73     74     75     76     77
235
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
236
  // 78     79     7A     7B     7C     7D     7E     7F
237
    0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x00 | 0x80,
238
  // 80     81     82     83     84     85     86     87
239
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
240
  // 88     89     8A     8B     8C     8D     8E     8F
241
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
242
  // 90     91     92     93     94     95     96     97
243
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
244
  // 98     99     9A     9B     9C     9D     9E     9F
245
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
246
  // A0     A1     A2     A3     A4     A5     A6     A7
247
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
248
  // A8     A9     AA     AB     AC     AD     AE     AF
249
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
250
  // B0     B1     B2     B3     B4     B5     B6     B7
251
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
252
  // B8     B9     BA     BB     BC     BD     BE     BF
253
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
254
  // C0     C1     C2     C3     C4     C5     C6     C7
255
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
256
  // C8     C9     CA     CB     CC     CD     CE     CF
257
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
258
  // D0     D1     D2     D3     D4     D5     D6     D7
259
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
260
  // D8     D9     DA     DB     DC     DD     DE     DF
261
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
262
  // E0     E1     E2     E3     E4     E5     E6     E7
263
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
264
  // E8     E9     EA     EB     EC     ED     EE     EF
265
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
266
  // F0     F1     F2     F3     F4     F5     F6     F7
267
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
268
  // F8     F9     FA     FB     FC     FD     FE     FF
269
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
270
};
271
272
static const uint8_t QUERY_ENCODE_SET[32] = {
273
  // 00     01     02     03     04     05     06     07
274
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
275
  // 08     09     0A     0B     0C     0D     0E     0F
276
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
277
  // 10     11     12     13     14     15     16     17
278
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
279
  // 18     19     1A     1B     1C     1D     1E     1F
280
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
281
  // 20     21     22     23     24     25     26     27
282
    0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00,
283
  // 28     29     2A     2B     2C     2D     2E     2F
284
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
285
  // 30     31     32     33     34     35     36     37
286
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
287
  // 38     39     3A     3B     3C     3D     3E     3F
288
    0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x00,
289
  // 40     41     42     43     44     45     46     47
290
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
291
  // 48     49     4A     4B     4C     4D     4E     4F
292
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
293
  // 50     51     52     53     54     55     56     57
294
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
295
  // 58     59     5A     5B     5C     5D     5E     5F
296
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
297
  // 60     61     62     63     64     65     66     67
298
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
299
  // 68     69     6A     6B     6C     6D     6E     6F
300
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
301
  // 70     71     72     73     74     75     76     77
302
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
303
  // 78     79     7A     7B     7C     7D     7E     7F
304
    0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80,
305
  // 80     81     82     83     84     85     86     87
306
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
307
  // 88     89     8A     8B     8C     8D     8E     8F
308
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
309
  // 90     91     92     93     94     95     96     97
310
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
311
  // 98     99     9A     9B     9C     9D     9E     9F
312
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
313
  // A0     A1     A2     A3     A4     A5     A6     A7
314
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
315
  // A8     A9     AA     AB     AC     AD     AE     AF
316
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
317
  // B0     B1     B2     B3     B4     B5     B6     B7
318
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
319
  // B8     B9     BA     BB     BC     BD     BE     BF
320
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
321
  // C0     C1     C2     C3     C4     C5     C6     C7
322
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
323
  // C8     C9     CA     CB     CC     CD     CE     CF
324
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
325
  // D0     D1     D2     D3     D4     D5     D6     D7
326
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
327
  // D8     D9     DA     DB     DC     DD     DE     DF
328
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
329
  // E0     E1     E2     E3     E4     E5     E6     E7
330
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
331
  // E8     E9     EA     EB     EC     ED     EE     EF
332
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
333
  // F0     F1     F2     F3     F4     F5     F6     F7
334
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
335
  // F8     F9     FA     FB     FC     FD     FE     FF
336
    0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80
337
};
338
339
// Must return true if the character is to be percent-encoded
340
typedef bool (*must_escape_cb)(const unsigned char ch);
341
342
// Appends ch to str. If test(ch) returns true, the ch will
343
// be percent-encoded then appended.
344
9026
static inline void AppendOrEscape(std::string* str,
345
                                  const unsigned char ch,
346
                                  must_escape_cb test) {
347
9026
  if (test(ch))
348
277
    *str += hex[ch];
349
  else
350
8749
    *str += ch;
351
9026
}
352
353
2503
static inline bool SimpleEncodeSet(const unsigned char ch) {
354
2503
  return BIT_AT(SIMPLE_ENCODE_SET, ch);
355
}
356
357
5461
static inline bool DefaultEncodeSet(const unsigned char ch) {
358
5461
  return BIT_AT(DEFAULT_ENCODE_SET, ch);
359
}
360
361
576
static inline bool UserinfoEncodeSet(const unsigned char ch) {
362
576
  return BIT_AT(USERINFO_ENCODE_SET, ch);
363
}
364
365
486
static inline bool QueryEncodeSet(const unsigned char ch) {
366
486
  return BIT_AT(QUERY_ENCODE_SET, ch);
367
}
368
369
static inline unsigned hex2bin(const char ch) {
370

232
  if (ch >= '0' && ch <= '9')
371
193
    return ch - '0';
372

39
  if (ch >= 'A' && ch <= 'F')
373
    return 10 + (ch - 'A');
374

39
  if (ch >= 'a' && ch <= 'f')
375
39
    return 10 + (ch - 'a');
376
  return static_cast<unsigned>(-1);
377
}
378
379
1170
static inline int PercentDecode(const char* input,
380
                                size_t len,
381
                                std::string* dest) {
382
1170
  if (len == 0)
383
    return 0;
384
1170
  dest->reserve(len);
385
1170
  const char* pointer = input;
386
1170
  const char* end = input + len;
387
1170
  size_t remaining = pointer - end - 1;
388
13081
  while (pointer < end) {
389
11911
    const char ch = pointer[0];
390
11911
    remaining = (end - pointer) + 1;
391

11911
    if (ch != '%' || remaining < 2 ||
392
95
        (ch == '%' &&
393

205
         (!ASCII_HEX_DIGIT(pointer[1]) ||
394
121
          !ASCII_HEX_DIGIT(pointer[2])))) {
395
23638
      *dest += ch;
396
11819
      pointer++;
397
11819
      continue;
398
    } else {
399
184
      unsigned a = hex2bin(pointer[1]);
400
184
      unsigned b = hex2bin(pointer[2]);
401
92
      char c = static_cast<char>(a * 16 + b);
402
184
      *dest += static_cast<char>(c);
403
92
      pointer += 3;
404
    }
405
  }
406
  return 0;
407
}
408
409
#define SPECIALS(XX)                                                          \
410
  XX("ftp:", 21)                                                              \
411
  XX("file:", -1)                                                             \
412
  XX("gopher:", 70)                                                           \
413
  XX("http:", 80)                                                             \
414
  XX("https:", 443)                                                           \
415
  XX("ws:", 80)                                                               \
416
  XX("wss:", 443)
417
418
#define PARSESTATES(XX)                                                       \
419
  XX(kSchemeStart)                                                            \
420
  XX(kScheme)                                                                 \
421
  XX(kNoScheme)                                                               \
422
  XX(kSpecialRelativeOrAuthority)                                             \
423
  XX(kPathOrAuthority)                                                        \
424
  XX(kRelative)                                                               \
425
  XX(kRelativeSlash)                                                          \
426
  XX(kSpecialAuthoritySlashes)                                                \
427
  XX(kSpecialAuthorityIgnoreSlashes)                                          \
428
  XX(kAuthority)                                                              \
429
  XX(kHost)                                                                   \
430
  XX(kHostname)                                                               \
431
  XX(kPort)                                                                   \
432
  XX(kFile)                                                                   \
433
  XX(kFileSlash)                                                              \
434
  XX(kFileHost)                                                               \
435
  XX(kPathStart)                                                              \
436
  XX(kPath)                                                                   \
437
  XX(kCannotBeBase)                                                           \
438
  XX(kQuery)                                                                  \
439
  XX(kFragment)
440
441
#define FLAGS(XX)                                                             \
442
  XX(URL_FLAGS_NONE, 0)                                                       \
443
  XX(URL_FLAGS_FAILED, 0x01)                                                  \
444
  XX(URL_FLAGS_CANNOT_BE_BASE, 0x02)                                          \
445
  XX(URL_FLAGS_INVALID_PARSE_STATE, 0x04)                                     \
446
  XX(URL_FLAGS_TERMINATED, 0x08)                                              \
447
  XX(URL_FLAGS_SPECIAL, 0x10)                                                 \
448
  XX(URL_FLAGS_HAS_SCHEME, 0x20)                                              \
449
  XX(URL_FLAGS_HAS_USERNAME, 0x40)                                            \
450
  XX(URL_FLAGS_HAS_PASSWORD, 0x80)                                            \
451
  XX(URL_FLAGS_HAS_HOST, 0x100)                                               \
452
  XX(URL_FLAGS_HAS_PATH, 0x200)                                               \
453
  XX(URL_FLAGS_HAS_QUERY, 0x400)                                              \
454
  XX(URL_FLAGS_HAS_FRAGMENT, 0x800)
455
456
#define ARGS(XX)                                                              \
457
  XX(ARG_FLAGS)                                                               \
458
  XX(ARG_PROTOCOL)                                                            \
459
  XX(ARG_USERNAME)                                                            \
460
  XX(ARG_PASSWORD)                                                            \
461
  XX(ARG_HOST)                                                                \
462
  XX(ARG_PORT)                                                                \
463
  XX(ARG_PATH)                                                                \
464
  XX(ARG_QUERY)                                                               \
465
  XX(ARG_FRAGMENT)
466
467
static const char kEOL = -1;
468
469
enum url_parse_state {
470
  kUnknownState = -1,
471
#define XX(name) name,
472
  PARSESTATES(XX)
473
#undef XX
474
} url_parse_state;
475
476
enum url_flags {
477
#define XX(name, val) name = val,
478
  FLAGS(XX)
479
#undef XX
480
} url_flags;
481
482
enum url_cb_args {
483
#define XX(name) name,
484
  ARGS(XX)
485
#undef XX
486
} url_cb_args;
487
488
1790
static inline bool IsSpecial(std::string scheme) {
489
#define XX(name, _) if (scheme == name) return true;
490



9097
  SPECIALS(XX);
491
#undef XX
492
659
  return false;
493
}
494
495
146
static inline int NormalizePort(std::string scheme, int p) {
496
#define XX(name, port) if (scheme == name && p == port) return -1;
497










946
  SPECIALS(XX);
498
#undef XX
499
118
  return p;
500
}
501
502
56160
struct url_data {
503
  int32_t flags = URL_FLAGS_NONE;
504
  int port = -1;
505
  std::string scheme;
506
  std::string username;
507
  std::string password;
508
  std::string host;
509
  std::string query;
510
  std::string fragment;
511
  std::vector<std::string> path;
512
};
513
514
union url_host_value {
515
  std::string domain;
516
  uint32_t ipv4;
517
  uint16_t ipv6[8];
518
1185
  ~url_host_value() {}
519
};
520
521
enum url_host_type {
522
  HOST_TYPE_FAILED = -1,
523
  HOST_TYPE_DOMAIN = 0,
524
  HOST_TYPE_IPV4 = 1,
525
  HOST_TYPE_IPV6 = 2
526
};
527
528
2370
struct url_host {
529
  url_host_value value;
530
  enum url_host_type type;
531
};
532
}  // namespace url
533
534
}  // namespace node
535
536
#endif  // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
537
538
#endif  // SRC_NODE_URL_H_