@@ -133,6 +133,48 @@ static const char acceptable_header[256] = {
133
133
'x' , 'y' , 'z' , 0 , 0 , 0 , 0 , 0 };
134
134
135
135
136
+ /* Tokens as defined by rfc 2616. Also lowercases them.
137
+ * token = 1*<any CHAR except CTLs or separators>
138
+ * separators = "(" | ")" | "<" | ">" | "@"
139
+ * | "," | ";" | ":" | "\" | <">
140
+ * | "/" | "[" | "]" | "?" | "="
141
+ * | "{" | "}" | SP | HT
142
+ */
143
+ static const char tokens [256 ] = {
144
+ /* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */
145
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
146
+ /* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */
147
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
148
+ /* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */
149
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
150
+ /* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */
151
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
152
+ /* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */
153
+ ' ' , '!' , '"' , '#' , '$' , '%' , '&' , '\'' ,
154
+ /* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */
155
+ 0 , 0 , '*' , '+' , 0 , '-' , '.' , '/' ,
156
+ /* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */
157
+ '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' ,
158
+ /* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */
159
+ '8' , '9' , 0 , 0 , 0 , 0 , 0 , 0 ,
160
+ /* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */
161
+ 0 , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' ,
162
+ /* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */
163
+ 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' ,
164
+ /* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */
165
+ 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' ,
166
+ /* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */
167
+ 'x' , 'y' , 'z' , 0 , 0 , 0 , '^' , '_' ,
168
+ /* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */
169
+ '`' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' ,
170
+ /* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */
171
+ 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' ,
172
+ /* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */
173
+ 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' ,
174
+ /* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */
175
+ 'x' , 'y' , 'z' , 0 , '|' , '}' , '~' , 0 };
176
+
177
+
136
178
static const int8_t unhex [256 ] =
137
179
{-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1
138
180
,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1
@@ -292,6 +334,7 @@ enum flags
292
334
#define CR '\r'
293
335
#define LF '\n'
294
336
#define LOWER (c ) (unsigned char)(c | 0x20)
337
+ #define TOKEN (c ) tokens[(unsigned char)c]
295
338
296
339
297
340
#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
@@ -996,9 +1039,9 @@ size_t http_parser_execute (http_parser *parser,
996
1039
goto headers_almost_done ;
997
1040
}
998
1041
999
- c = LOWER (ch );
1042
+ c = TOKEN (ch );
1000
1043
1001
- if (c < 'a' || 'z' < c ) goto error ;
1044
+ if (! c ) goto error ;
1002
1045
1003
1046
MARK (header_field );
1004
1047
@@ -1031,7 +1074,7 @@ size_t http_parser_execute (http_parser *parser,
1031
1074
1032
1075
case s_header_field :
1033
1076
{
1034
- c = acceptable_header [( unsigned char ) ch ] ;
1077
+ c = TOKEN ( ch ) ;
1035
1078
1036
1079
if (c ) {
1037
1080
switch (header_state ) {
0 commit comments