add FIELDVALUE_END to lexer result.
@@ -77,6 +77,9 @@ | ||
77 | 77 | case HTTP_HEADERLEXER_RESULT_LWS: |
78 | 78 | printf("LWS\n"); |
79 | 79 | break; |
80 | + case HTTP_HEADERLEXER_RESULT_FIELDVALUE_END: | |
81 | + printf("FIELDVALUE_END\n"); | |
82 | + break; | |
80 | 83 | case HTTP_HEADERLEXER_RESULT_MESSAGEHEADER_END: |
81 | 84 | printf("MESSAGEHEADER_END\n"); |
82 | 85 | break; |
@@ -181,6 +184,7 @@ | ||
181 | 184 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'a'}, |
182 | 185 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'b'}, |
183 | 186 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'c'}, |
187 | + {HTTP_HEADERLEXER_RESULT_FIELDVALUE_END, '\0'}, | |
184 | 188 | {HTTP_HEADERLEXER_RESULT_FIELDNAME, 'D'}, |
185 | 189 | {HTTP_HEADERLEXER_RESULT_FIELDNAME, 'E'}, |
186 | 190 | {HTTP_HEADERLEXER_RESULT_FIELDNAME, 'F'}, |
@@ -191,6 +195,7 @@ | ||
191 | 195 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'b'}, |
192 | 196 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'b'}, |
193 | 197 | {HTTP_HEADERLEXER_RESULT_LWS, ' '}, |
198 | + {HTTP_HEADERLEXER_RESULT_FIELDVALUE_END, '\0'}, | |
194 | 199 | {HTTP_HEADERLEXER_RESULT_FIELDNAME, 'X'}, |
195 | 200 | {HTTP_HEADERLEXER_RESULT_FIELDNAME, 'Y'}, |
196 | 201 | {HTTP_HEADERLEXER_RESULT_FIELDNAME, 'Z'}, |
@@ -202,6 +207,7 @@ | ||
202 | 207 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'A'}, |
203 | 208 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'A'}, |
204 | 209 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'A'}, |
210 | + {HTTP_HEADERLEXER_RESULT_FIELDVALUE_END, '\0'}, | |
205 | 211 | {HTTP_HEADERLEXER_RESULT_FIELDNAME, 'L'}, |
206 | 212 | {HTTP_HEADERLEXER_RESULT_FIELDNAME, 'M'}, |
207 | 213 | {HTTP_HEADERLEXER_RESULT_FIELDNAME, 'N'}, |
@@ -210,6 +216,7 @@ | ||
210 | 216 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'l'}, |
211 | 217 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'm'}, |
212 | 218 | {HTTP_HEADERLEXER_RESULT_FIELDCONTENT, 'n'}, |
219 | + {HTTP_HEADERLEXER_RESULT_FIELDVALUE_END, '\0'}, | |
213 | 220 | {HTTP_HEADERLEXER_RESULT_MESSAGEHEADER_END, '\0'}, |
214 | 221 | {-1, '\0'} |
215 | 222 | }; |
@@ -51,10 +51,25 @@ | ||
51 | 51 | *result_len = 0; |
52 | 52 | |
53 | 53 | switch (lexer->state) { |
54 | + case HTTP_HEADERLEXER_STATE_START: | |
55 | + DP_STATE(("state = START: %c[%02x]\n", ch, ch)); | |
56 | + if (ch == '\r') { | |
57 | + lexer->state = HTTP_HEADERLEXER_STATE_SEARCH_HEADER_CR; | |
58 | + break; | |
59 | + } | |
60 | + /* TODO: handling error charactors for "token" */ | |
61 | + lexer->state = HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDNAME; | |
62 | + lexer->buf[0].type = HTTP_HEADERLEXER_RESULT_FIELDNAME; | |
63 | + lexer->buf[0].ch = ch; | |
64 | + *result_len = 1; | |
65 | + break; | |
54 | 66 | case HTTP_HEADERLEXER_STATE_SEARCH_HEADER: |
55 | 67 | DP_STATE(("state = SEARCH_HEADER: %c[%02x]\n", ch, ch)); |
56 | 68 | if (ch == '\r') { |
57 | 69 | lexer->state = HTTP_HEADERLEXER_STATE_SEARCH_HEADER_CR; |
70 | + lexer->buf[0].type = HTTP_HEADERLEXER_RESULT_FIELDVALUE_END; | |
71 | + lexer->buf[0].ch = '\0'; | |
72 | + *result_len = 1; | |
58 | 73 | break; |
59 | 74 | } |
60 | 75 | if ((ch == ' ')&&(ch = '\t')) { |
@@ -66,9 +81,11 @@ | ||
66 | 81 | } |
67 | 82 | /* TODO: handling error charactors for "token" */ |
68 | 83 | lexer->state = HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDNAME; |
69 | - lexer->buf[0].type = HTTP_HEADERLEXER_RESULT_FIELDNAME; | |
70 | - lexer->buf[0].ch = ch; | |
71 | - *result_len = 1; | |
84 | + lexer->buf[0].type = HTTP_HEADERLEXER_RESULT_FIELDVALUE_END; | |
85 | + lexer->buf[0].ch = '\0'; | |
86 | + lexer->buf[1].type = HTTP_HEADERLEXER_RESULT_FIELDNAME; | |
87 | + lexer->buf[1].ch = ch; | |
88 | + *result_len = 2; | |
72 | 89 | break; |
73 | 90 | case HTTP_HEADERLEXER_STATE_SEARCH_HEADER_CR: |
74 | 91 | DP_STATE(("state = SEARCH_HEADER_CR: %c[%02x]\n", ch, ch)); |
@@ -152,7 +169,7 @@ | ||
152 | 169 | |
153 | 170 | EXPORT W http_headerlexer_initialize(http_headerlexer_t *lexer) |
154 | 171 | { |
155 | - lexer->state = HTTP_HEADERLEXER_STATE_SEARCH_HEADER; | |
172 | + lexer->state = HTTP_HEADERLEXER_STATE_START; | |
156 | 173 | return 0; |
157 | 174 | } |
158 | 175 |
@@ -47,6 +47,7 @@ | ||
47 | 47 | HTTP_HEADERLEXER_RESULT_FIELDNAME_END, |
48 | 48 | HTTP_HEADERLEXER_RESULT_FIELDCONTENT, |
49 | 49 | HTTP_HEADERLEXER_RESULT_LWS, |
50 | + HTTP_HEADERLEXER_RESULT_FIELDVALUE_END, | |
50 | 51 | HTTP_HEADERLEXER_RESULT_MESSAGEHEADER_END, |
51 | 52 | } type; |
52 | 53 | UB ch; |
@@ -57,6 +58,7 @@ | ||
57 | 58 | /* Detail name: headerlexer */ |
58 | 59 | struct http_headerlexer_t_ { |
59 | 60 | enum { |
61 | + HTTP_HEADERLEXER_STATE_START, | |
60 | 62 | HTTP_HEADERLEXER_STATE_SEARCH_HEADER, |
61 | 63 | HTTP_HEADERLEXER_STATE_SEARCH_HEADER_CR, |
62 | 64 | HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDNAME, |