Lines Matching refs:parser
6 #include "http-parser.h"
7 #include "http-message-parser.h"
8 #include "http-request-parser.h"
26 struct http_message_parser parser;
44 struct http_request_parser *parser;
49 parser = i_new(struct http_request_parser, 1);
59 if (parser->max_target_length == 0)
60 parser->max_target_length = HTTP_REQUEST_DEFAULT_MAX_TARGET_LENGTH;
72 http_message_parser_init(&parser->parser, input,
74 return parser;
79 struct http_request_parser *parser = *_parser;
83 http_message_parser_deinit(&parser->parser);
84 i_free(parser);
88 http_request_parser_restart(struct http_request_parser *parser,
91 http_message_parser_restart(&parser->parser, pool);
92 parser->request_method = NULL;
93 parser->request_target = NULL;
96 static int http_request_parse_method(struct http_request_parser *parser)
98 const unsigned char *p = parser->parser.cur;
103 while (p < parser->parser.end && http_char_is_token(*p))
106 if ((p - parser->parser.cur) > HTTP_REQUEST_PARSER_MAX_METHOD_LENGTH) {
107 parser->error_code = HTTP_REQUEST_PARSE_ERROR_METHOD_TOO_LONG;
108 parser->parser.error = "HTTP request method is too long";
111 if (p == parser->parser.end)
113 pool = http_message_parser_get_pool(&parser->parser);
114 parser->request_method =
115 p_strdup_until(pool, parser->parser.cur, p);
116 parser->parser.cur = p;
120 static int http_request_parse_target(struct http_request_parser *parser)
122 struct http_message_parser *_parser = &parser->parser;
123 const unsigned char *p = parser->parser.cur;
139 if ((uoff_t)(p - _parser->cur) > parser->max_target_length ||
142 parser->error_code = HTTP_REQUEST_PARSE_ERROR_TARGET_TOO_LONG;
143 parser->parser.error = "HTTP request target is too long";
149 parser->request_target = p_strdup_until(pool, _parser->cur, p);
150 parser->parser.cur = p;
165 static int http_request_parse(struct http_request_parser *parser,
168 struct http_message_parser *_parser = &parser->parser;
177 switch (parser->state) {
179 http_request_parser_restart(parser, pool);
180 parser->state = HTTP_REQUEST_PARSE_STATE_SKIP_LINE;
186 if (parser->skipping_line) {
188 parser->error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST;
194 parser->skipping_line = TRUE;
195 parser->state = HTTP_REQUEST_PARSE_STATE_CR;
198 parser->state = HTTP_REQUEST_PARSE_STATE_METHOD;
199 parser->skipping_line = FALSE;
202 if ((ret=http_request_parse_method(parser)) <= 0)
204 parser->state = HTTP_REQUEST_PARSE_STATE_SP1;
210 parser->error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST;
217 parser->state = HTTP_REQUEST_PARSE_STATE_TARGET;
222 if ((ret=http_request_parse_target(parser)) <= 0)
224 parser->state = HTTP_REQUEST_PARSE_STATE_SP2;
230 parser->error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST;
237 parser->state = HTTP_REQUEST_PARSE_STATE_VERSION;
242 if ((ret=http_message_parse_version(&parser->parser)) <= 0) {
244 parser->error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST;
249 parser->state = HTTP_REQUEST_PARSE_STATE_CR;
256 parser->state = HTTP_REQUEST_PARSE_STATE_LF;
262 parser->error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST;
269 if (!parser->skipping_line) {
270 parser->state = HTTP_REQUEST_PARSE_STATE_HEADER;
273 parser->state = HTTP_REQUEST_PARSE_STATE_INIT;
285 static int http_request_parse_request_line(struct http_request_parser *parser,
288 struct http_message_parser *_parser = &parser->parser;
298 if ((ret = http_request_parse(parser, pool)) < 0)
308 parser->error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST;
314 parser->state == HTTP_REQUEST_PARSE_STATE_INIT)
316 parser->error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_STREAM;
324 http_request_parser_message_error(struct http_request_parser *parser)
326 switch (parser->parser.error_code) {
345 struct http_request_parser *parser)
347 if (parser->parser.payload == NULL)
349 return i_stream_have_bytes_left(parser->parser.payload);
353 http_request_parse_expect_header(struct http_request_parser *parser,
356 struct http_message_parser *_parser = &parser->parser;
376 if (parser->error_code == HTTP_REQUEST_PARSE_ERROR_NONE) {
377 parser->error_code = HTTP_REQUEST_PARSE_ERROR_EXPECTATION_FAILED;
398 if (parser->error_code == HTTP_REQUEST_PARSE_ERROR_NONE) {
399 parser->error_code = HTTP_REQUEST_PARSE_ERROR_EXPECTATION_FAILED;
437 if (parser->error_code == HTTP_REQUEST_PARSE_ERROR_NONE) {
438 parser->error_code = HTTP_REQUEST_PARSE_ERROR_EXPECTATION_FAILED;
455 parser->error_code = HTTP_REQUEST_PARSE_ERROR_BAD_REQUEST;
460 if (parser->error_code != HTTP_REQUEST_PARSE_ERROR_NONE)
464 parser->error_code = HTTP_REQUEST_PARSE_ERROR_BAD_REQUEST;
472 http_request_parse_headers(struct http_request_parser *parser,
478 hdrs = http_header_get_fields(parser->parser.msg.header);
484 ret = http_request_parse_expect_header(parser, request, hdr);
493 struct http_request_parser *parser,
499 *error_code_r = parser->error_code = HTTP_REQUEST_PARSE_ERROR_NONE;
500 *error_r = parser->parser.error = NULL;
504 if ((ret = http_message_parse_finish_payload(&parser->parser)) <= 0) {
506 *error_code_r = http_request_parser_message_error(parser);
507 *error_r = parser->parser.error;
513 int http_request_parse_next(struct http_request_parser *parser,
523 (parser, error_code_r, error_r)) <= 0)
533 if (parser->state != HTTP_REQUEST_PARSE_STATE_HEADER) {
534 ret = http_request_parse_request_line(parser, pool);
537 request->method = parser->request_method;
538 request->target_raw = parser->request_target;
539 request->version_major = parser->parser.msg.version_major;
540 request->version_minor = parser->parser.msg.version_minor;
544 *error_code_r = parser->error_code;
545 *error_r = parser->parser.error;
551 if ((ret = http_message_parse_headers(&parser->parser)) <= 0) {
553 *error_code_r = http_request_parser_message_error(parser);
554 *error_r = parser->parser.error;
559 if (http_message_parse_body(&parser->parser, TRUE) < 0) {
560 *error_code_r = http_request_parser_message_error(parser);
561 *error_r = parser->parser.error;
564 parser->state = HTTP_REQUEST_PARSE_STATE_INIT;
574 (parser->parser.msg.header, "Host", &hdr)) <= 0) {
585 pool = http_message_parser_get_pool(&parser->parser);
586 if (http_url_request_target_parse(parser->request_target, hdr->value,
590 parser->request_target, error);
595 if (http_request_parse_headers(parser, request) < 0) {
596 *error_code_r = parser->error_code;
597 *error_r = parser->parser.error;
601 request->method = parser->request_method;
602 request->target_raw = parser->request_target;
603 request->version_major = parser->parser.msg.version_major;
604 request->version_minor = parser->parser.msg.version_minor;
605 request->date = parser->parser.msg.date;
606 request->payload = parser->parser.payload;
607 request->header = parser->parser.msg.header;
608 request->connection_options = parser->parser.msg.connection_options;
609 request->connection_close = parser->parser.msg.connection_close;
612 parser->request_method = NULL;
613 parser->request_target = NULL;