Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Add "int http_body_is_final(const http_parser *parser)" method.

It's useful to check if the current chunk is the last one.
  • Loading branch information...
commit 1ca7de52587f19cb87a28b8ace2e0f2e6cfcde7f 1 parent ad3b631
@bog-dan-ro bog-dan-ro authored bnoordhuis committed
Showing with 36 additions and 0 deletions.
  1. +5 −0 http_parser.c
  2. +3 −0  http_parser.h
  3. +28 −0 test.c
View
5 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;
+}
View
3  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
View
28 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;

0 comments on commit 1ca7de5

Please sign in to comment.
Something went wrong with that request. Please try again.