From 1ca7de52587f19cb87a28b8ace2e0f2e6cfcde7f Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Fri, 31 Aug 2012 09:07:55 +0300 Subject: [PATCH] Add "int http_body_is_final(const http_parser *parser)" method. It's useful to check if the current chunk is the last one. --- http_parser.c | 5 +++++ http_parser.h | 3 +++ test.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/http_parser.c b/http_parser.c index 5e0a950..542a875 100644 --- a/http_parser.c +++ b/http_parser.c @@ -2175,3 +2175,8 @@ http_parser_pause(http_parser *parser, int paused) { assert(0 && "Attempting to pause parser in error state"); } } + +int +http_body_is_final(const struct http_parser *parser) { + return parser->state == s_message_done; +} diff --git a/http_parser.h b/http_parser.h index 7908ad0..d3f60f9 100644 --- a/http_parser.h +++ b/http_parser.h @@ -313,6 +313,9 @@ int http_parser_parse_url(const char *buf, size_t buflen, /* Pause or un-pause the parser; a nonzero value pauses */ void http_parser_pause(http_parser *parser, int paused); +/* Checks if this is the final chunk of the body. */ +int http_body_is_final(const http_parser *parser); + #ifdef __cplusplus } #endif diff --git a/test.c b/test.c index 81e0c3b..d205c0d 100644 --- a/test.c +++ b/test.c @@ -67,6 +67,7 @@ struct message { int headers_complete_cb_called; int message_complete_cb_called; int message_complete_on_eof; + int body_is_final; }; static int currently_parsing_eof; @@ -1449,12 +1450,26 @@ header_value_cb (http_parser *p, const char *buf, size_t len) return 0; } +void +check_body_is_final (const http_parser *p) +{ + if (messages[num_messages].body_is_final) { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + messages[num_messages].body_is_final = http_body_is_final(p); +} + int body_cb (http_parser *p, const char *buf, size_t len) { assert(p == parser); strncat(messages[num_messages].body, buf, len); messages[num_messages].body_size += len; + check_body_is_final(p); // printf("body_cb: '%s'\n", requests[num_messages].body); return 0; } @@ -1465,6 +1480,7 @@ count_body_cb (http_parser *p, const char *buf, size_t len) assert(p == parser); assert(buf); messages[num_messages].body_size += len; + check_body_is_final(p); return 0; } @@ -1501,6 +1517,18 @@ message_complete_cb (http_parser *p) assert(0); abort(); } + + if (messages[num_messages].body_size && + http_body_is_final(p) && + !messages[num_messages].body_is_final) + { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + messages[num_messages].message_complete_cb_called = TRUE; messages[num_messages].message_complete_on_eof = currently_parsing_eof;