Lines Matching refs:parser

8 #include "http-parser.h"
11 #include "http-header-parser.h"
48 struct http_header_parser *parser;
50 parser = i_new(struct http_header_parser, 1);
51 parser->input = input;
54 parser->limits = *limits;
56 if (parser->limits.max_size == 0)
57 parser->limits.max_size = (uoff_t)-1;
58 if (parser->limits.max_field_size == 0)
59 parser->limits.max_field_size = (uoff_t)-1;
60 if (parser->limits.max_fields == 0)
61 parser->limits.max_fields = (unsigned int)-1;
63 parser->flags = flags;
65 parser->name = str_new(default_pool, 128);
66 parser->value_buf = buffer_create_dynamic(default_pool, 4096);
68 return parser;
73 struct http_header_parser *parser = *_parser;
78 buffer_free(&parser->value_buf);
79 str_free(&parser->name);
80 i_free(parser);
83 void http_header_parser_reset(struct http_header_parser *parser)
85 parser->state = HTTP_HEADER_PARSE_STATE_INIT;
86 parser->size = 0;
87 parser->field_size = 0;
88 parser->field_count = 0;
91 static int http_header_parse_name(struct http_header_parser *parser)
93 const unsigned char *first = parser->cur;
98 while (parser->cur < parser->end && http_char_is_token(*parser->cur))
99 parser->cur++;
101 str_append_n(parser->name, first, parser->cur-first);
103 if (parser->cur == parser->end)
105 if (str_len(parser->name) == 0) {
106 parser->error = "Empty header field name";
112 static int http_header_parse_ows(struct http_header_parser *parser)
117 while (parser->cur < parser->end &&
118 (*parser->cur == ' ' || *parser->cur == '\t'))
119 parser->cur++;
120 return (parser->cur == parser->end ? 0 : 1);
123 static int http_header_parse_content(struct http_header_parser *parser)
131 first = parser->cur;
132 while (parser->cur < parser->end && http_char_is_text(*parser->cur)) {
133 parser->cur++;
135 buffer_append(parser->value_buf, first, parser->cur-first);
137 if ((parser->flags & HTTP_HEADER_PARSE_FLAG_STRICT) != 0)
142 while (parser->cur < parser->end && !http_char_is_text(*parser->cur) &&
143 (*parser->cur != '\r' && *parser->cur != '\n'))
144 parser->cur++;
145 } while (parser->cur < parser->end &&
146 (*parser->cur != '\r' && *parser->cur != '\n'));
148 if (parser->cur == parser->end)
160 static int http_header_parse(struct http_header_parser *parser)
180 switch (parser->state) {
182 buffer_set_used_size(parser->value_buf, 0);
183 str_truncate(parser->name, 0);
184 if (*parser->cur == '\r') {
186 parser->cur++;
187 parser->state = HTTP_HEADER_PARSE_STATE_EOH;
188 if (parser->cur == parser->end)
191 } else if (*parser->cur == '\n') {
193 parser->state = HTTP_HEADER_PARSE_STATE_EOH;
197 parser->state = HTTP_HEADER_PARSE_STATE_NAME;
200 if ((ret=http_header_parse_name(parser)) <= 0)
202 parser->state = HTTP_HEADER_PARSE_STATE_COLON;
205 if (*parser->cur != ':') {
206 parser->error = t_strdup_printf
208 str_sanitize(str_c(parser->name),64),
209 _chr_sanitize(*parser->cur));
212 parser->cur++;
213 if (str_len(parser->name) == 0) {
214 parser->error = "Empty header field name";
217 if (++parser->field_count > parser->limits.max_fields) {
218 parser->error = "Excessive number of header fields";
221 parser->state = HTTP_HEADER_PARSE_STATE_OWS;
224 if ((ret=http_header_parse_ows(parser)) <= 0)
226 parser->state = HTTP_HEADER_PARSE_STATE_CONTENT;
229 if ((ret=http_header_parse_content(parser)) <= 0)
231 parser->state = HTTP_HEADER_PARSE_STATE_CR;
234 if (*parser->cur == '\r') {
235 parser->cur++;
236 } else if (*parser->cur != '\n') {
237 parser->error = t_strdup_printf
239 _chr_sanitize(*parser->cur),
240 str_sanitize(str_c(parser->name),64));
243 parser->state = HTTP_HEADER_PARSE_STATE_LF;
244 if (parser->cur == parser->end)
248 if (*parser->cur != '\n') {
249 parser->error = t_strdup_printf
251 str_sanitize(str_c(parser->name),64),
252 _chr_sanitize(*parser->cur));
255 parser->cur++;
256 parser->state = HTTP_HEADER_PARSE_STATE_NEW_LINE;
257 if (parser->cur == parser->end)
261 if (*parser->cur == ' ' || *parser->cur == '\t') {
263 buffer_append_c(parser->value_buf, ' ');
264 parser->state = HTTP_HEADER_PARSE_STATE_OWS;
268 parser->state = HTTP_HEADER_PARSE_STATE_INIT;
271 if (*parser->cur != '\n') {
272 parser->error = t_strdup_printf
274 _chr_sanitize(*parser->cur));
278 parser->cur++;
290 int http_header_parse_next_field(struct http_header_parser *parser,
294 const uoff_t max_size = parser->limits.max_size;
295 const uoff_t max_field_size = parser->limits.max_field_size;
302 while ((ret=i_stream_read_more(parser->input, &parser->begin, &size)) > 0) {
305 if (parser->size >= max_size) {
309 if (parser->field_size > max_field_size) {
315 if (size > (max_size - parser->size))
316 size = max_size - parser->size;
317 if (size > (max_field_size - parser->field_size)) {
318 size = max_field_size - parser->field_size;
322 parser->cur = parser->begin;
323 parser->end = parser->cur + size;
325 if ((ret=http_header_parse(parser)) < 0) {
326 *error_r = parser->error;
330 i_stream_skip(parser->input, parser->cur - parser->begin);
331 parser->size += parser->cur - parser->begin;
332 parser->field_size += parser->cur - parser->begin;
335 parser->field_size = 0;
337 if (parser->state != HTTP_HEADER_PARSE_STATE_EOH) {
338 data = buffer_get_data(parser->value_buf, &size);
345 *name_r = str_c(parser->name);
348 parser->state = HTTP_HEADER_PARSE_STATE_INIT;
359 i_assert(parser->input->eof);
360 if (parser->input->stream_errno == 0)
364 i_stream_get_error(parser->input));