Skip to content
This repository has been archived by the owner on Nov 6, 2022. It is now read-only.

Commit

Permalink
Add "int http_body_is_final(const http_parser *parser)" method.
Browse files Browse the repository at this point in the history
It's useful to check if the current chunk is the last one.
  • Loading branch information
bog-dan-ro authored and bnoordhuis committed Sep 1, 2012
1 parent ad3b631 commit 1ca7de5
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
5 changes: 5 additions & 0 deletions http_parser.c
Expand Up @@ -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;
}
3 changes: 3 additions & 0 deletions http_parser.h
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions test.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 1ca7de5

Please sign in to comment.