Lines Matching refs:parser
6 #include "http-parser.h"
8 #include "http-message-parser.h"
9 #include "http-response-parser.h"
26 struct http_message_parser parser;
40 struct http_response_parser *parser;
46 parser = i_new(struct http_response_parser, 1);
47 http_message_parser_init(&parser->parser,
49 return parser;
54 struct http_response_parser *parser = *_parser;
58 http_message_parser_deinit(&parser->parser);
59 i_free(parser);
63 http_response_parser_restart(struct http_response_parser *parser)
65 http_message_parser_restart(&parser->parser, NULL);
66 parser->response_status = 0;
67 parser->response_reason = NULL;
68 parser->response_offset = (uoff_t)-1;
71 static int http_response_parse_status(struct http_response_parser *parser)
73 const unsigned char *p = parser->parser.cur;
74 const size_t size = parser->parser.end - parser->parser.cur;
82 parser->response_status =
84 if (parser->response_status < 100 ||
85 parser->response_status >= 600)
87 parser->parser.cur += 3;
91 static int http_response_parse_reason(struct http_response_parser *parser)
93 const unsigned char *p = parser->parser.cur;
99 while (p < parser->parser.end && http_char_is_text(*p))
102 if (p == parser->parser.end)
104 pool = http_message_parser_get_pool(&parser->parser);
105 parser->response_reason =
106 p_strdup_until(pool, parser->parser.cur, p);
107 parser->parser.cur = p;
111 static const char *_reply_sanitize(struct http_message_parser *parser)
118 i_assert(parser->cur < parser->end);
119 for (p = parser->cur, i = 0; p < parser->end && i < 20; p++, i++) {
144 static int http_response_parse(struct http_response_parser *parser)
146 struct http_message_parser *_parser = &parser->parser;
155 switch (parser->state) {
157 parser->state = HTTP_RESPONSE_PARSE_STATE_VERSION;
158 parser->response_offset = _parser->input->v_offset +
169 parser->state = HTTP_RESPONSE_PARSE_STATE_SP1;
181 parser->state = HTTP_RESPONSE_PARSE_STATE_STATUS;
186 if ((ret=http_response_parse_status(parser)) <= 0) {
191 parser->state = HTTP_RESPONSE_PARSE_STATE_SP2;
203 parser->state = HTTP_RESPONSE_PARSE_STATE_REASON;
208 if ((ret=http_response_parse_reason(parser)) <= 0) {
212 parser->state = HTTP_RESPONSE_PARSE_STATE_CR;
219 parser->state = HTTP_RESPONSE_PARSE_STATE_LF;
231 parser->state = HTTP_RESPONSE_PARSE_STATE_HEADER;
243 http_response_parse_status_line(struct http_response_parser *parser)
245 struct http_message_parser *_parser = &parser->parser;
255 if ((ret = http_response_parse(parser)) < 0)
270 parser->state == HTTP_RESPONSE_PARSE_STATE_INIT)
309 uoff_t http_response_parser_get_last_offset(struct http_response_parser *parser)
311 return parser->response_offset;
314 int http_response_parse_next(struct http_response_parser *parser,
326 if ((ret = http_message_parse_finish_payload(&parser->parser)) <= 0) {
327 *error_r = parser->parser.error;
331 if (parser->state == HTTP_RESPONSE_PARSE_STATE_INIT)
332 http_response_parser_restart(parser);
341 if (parser->state != HTTP_RESPONSE_PARSE_STATE_HEADER) {
342 if ((ret = http_response_parse_status_line(parser)) <= 0) {
343 *error_r = parser->parser.error;
347 if ((ret = http_message_parse_headers(&parser->parser)) <= 0) {
348 *error_r = parser->parser.error;
357 if ((parser->response_status / 100 == 1 || parser->response_status == 204) &&
358 parser->parser.msg.content_length > 0) {
361 "(length=%"PRIuUOFF_T")", parser->response_status,
362 parser->parser.msg.content_length);
374 if (parser->response_status / 100 == 1 || parser->response_status == 204
375 || parser->response_status == 304) { // HEAD is handled in caller
381 parser->response_status / 100 != 2)) {
383 if (http_message_parse_body(&parser->parser, FALSE) < 0) {
384 *error_r = parser->parser.error;
399 if (parser->response_status == 503 || (parser->response_status / 100) == 3) {
400 hdrval = http_header_field_get(parser->parser.msg.header, "Retry-After");
403 (hdrval, parser->parser.msg.date, &retry_after);
408 parser->state = HTTP_RESPONSE_PARSE_STATE_INIT;
410 response->status = parser->response_status;
411 response->reason = parser->response_reason;
412 response->version_major = parser->parser.msg.version_major;
413 response->version_minor = parser->parser.msg.version_minor;
414 response->location = parser->parser.msg.location;
415 response->date = parser->parser.msg.date;
417 response->payload = parser->parser.payload;
418 response->header = parser->parser.msg.header;
419 response->connection_options = parser->parser.msg.connection_options;
420 response->connection_close = parser->parser.msg.connection_close;