]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: request parser: Added support for explicitly finishing payload of previous...
authorStephan Bosch <stephan@rename-it.nl>
Wed, 10 Feb 2016 21:17:07 +0000 (22:17 +0100)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 11 Feb 2016 10:00:41 +0000 (12:00 +0200)
src/lib-http/http-request-parser.c
src/lib-http/http-request-parser.h

index 538ae4d616f982fb6d70fed1dc11da82a2ff093f..9e2a2cb91a1076c23173e3545b6b691cf5fc7053 100644 (file)
@@ -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:
                
index 35386ccd886e5b21ec70a8711e63c05ca906c74c..ba16dc20cd4aeb3cb68387b9c17775e1ee3ede0d 100644 (file)
@@ -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);