]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: response parser: Record input stream offset for the start of the last parse...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Mon, 19 Feb 2018 12:24:57 +0000 (13:24 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Mon, 12 Mar 2018 09:07:37 +0000 (11:07 +0200)
src/lib-http/http-response-parser.c
src/lib-http/http-response-parser.h

index 959afdbdb025167d91caec5c9ba41c85eecff2da..a53cf3749d9d9cee10f0591f0a63e639e8e45bb3 100644 (file)
@@ -28,6 +28,8 @@ struct http_response_parser {
 
        unsigned int response_status;
        const char *response_reason;
+
+       uoff_t response_offset;
 };
 
 struct http_response_parser *
@@ -63,6 +65,7 @@ http_response_parser_restart(struct http_response_parser *parser)
        http_message_parser_restart(&parser->parser, NULL);
        parser->response_status = 0;
        parser->response_reason = NULL;
+       parser->response_offset = (uoff_t)-1;
 }
 
 static int http_response_parse_status(struct http_response_parser *parser)
@@ -152,6 +155,8 @@ static int http_response_parse(struct http_response_parser *parser)
        switch (parser->state) {
        case HTTP_RESPONSE_PARSE_STATE_INIT:
                parser->state = HTTP_RESPONSE_PARSE_STATE_VERSION;
+               parser->response_offset = _parser->input->v_offset +
+                       (_parser->cur - _parser->begin);
                /* fall through */
        case HTTP_RESPONSE_PARSE_STATE_VERSION:
                if ((ret=http_message_parse_version(_parser)) <= 0) {
@@ -301,6 +306,11 @@ http_response_parse_retry_after(const char *hdrval, time_t resp_time,
                ((unsigned char *)hdrval, strlen(hdrval), retry_after_r) ? 0 : -1);
 }
 
+uoff_t http_response_parser_get_last_offset(struct http_response_parser *parser)
+{
+       return parser->response_offset;
+}
+
 int http_response_parse_next(struct http_response_parser *parser,
                             enum http_response_payload_type payload_type,
                             struct http_response *response, const char **error_r)
index 6bcdeba9cc2293fc53a3140c89d444c6abdc359f..877704840d2ce82b57455e165ee3f05bd06aff08 100644 (file)
@@ -17,6 +17,8 @@ http_response_parser_init(struct istream *input,
        enum http_response_parse_flags flags) ATTR_NULL(2);
 void http_response_parser_deinit(struct http_response_parser **_parser);
 
+uoff_t http_response_parser_get_last_offset(struct http_response_parser *parser);
+
 int http_response_parse_next(struct http_response_parser *parser,
                             enum http_response_payload_type payload_type,
                             struct http_response *response, const char **error_r);