diff --git a/src/lib-http/http-request-parser.c b/src/lib-http/http-request-parser.c index 538ae4d616..9e2a2cb91a 100644 --- a/src/lib-http/http-request-parser.c +++ b/src/lib-http/http-request-parser.c @@ -333,7 +333,8 @@ http_request_parser_message_error(struct http_request_parser *parser) return HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST; } -bool http_request_parser_pending_payload(struct http_request_parser *parser) +bool http_request_parser_pending_payload( + struct http_request_parser *parser) { if (parser->parser.payload == NULL) return FALSE; @@ -480,12 +481,11 @@ http_request_parse_headers(struct http_request_parser *parser, return 0; } -int http_request_parse_next(struct http_request_parser *parser, - pool_t pool, struct http_request *request, - enum http_request_parse_error *error_code_r, const char **error_r) +int http_request_parse_finish_payload( + struct http_request_parser *parser, + enum http_request_parse_error *error_code_r, + const char **error_r) { - const struct http_header_field *hdr; - const char *error; int ret; *error_code_r = parser->error_code = HTTP_REQUEST_PARSE_ERROR_NONE; @@ -498,8 +498,22 @@ int http_request_parse_next(struct http_request_parser *parser, *error_code_r = http_request_parser_message_error(parser); *error_r = parser->parser.error; } - return ret; } + return ret; +} + +int http_request_parse_next(struct http_request_parser *parser, + pool_t pool, struct http_request *request, + enum http_request_parse_error *error_code_r, const char **error_r) +{ + const struct http_header_field *hdr; + const char *error; + int ret; + + /* initialize and get rid of any payload of previous request */ + if ((ret=http_request_parse_finish_payload + (parser, error_code_r, error_r)) <= 0) + return ret; /* RFC 7230, Section 3: diff --git a/src/lib-http/http-request-parser.h b/src/lib-http/http-request-parser.h index 35386ccd88..ba16dc20cd 100644 --- a/src/lib-http/http-request-parser.h +++ b/src/lib-http/http-request-parser.h @@ -22,6 +22,11 @@ http_request_parser_init(struct istream *input, const struct http_request_limits *limits) ATTR_NULL(2); void http_request_parser_deinit(struct http_request_parser **_parser); +int http_request_parse_finish_payload( + struct http_request_parser *parser, + enum http_request_parse_error *error_code_r, + const char **error_r); + int http_request_parse_next(struct http_request_parser *parser, pool_t pool, struct http_request *request, enum http_request_parse_error *error_code_r, const char **error_r);