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

It's useful to check if the current chunk is the last one.
make-http-max-header-size-gyp-configurable
BogDan Vatra 12 years ago committed by Ben Noordhuis
parent ad3b631d4f
commit 1ca7de5258

@ -2175,3 +2175,8 @@ http_parser_pause(http_parser *parser, int paused) {
assert(0 && "Attempting to pause parser in error state"); 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;
}

@ -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 */ /* Pause or un-pause the parser; a nonzero value pauses */
void http_parser_pause(http_parser *parser, int paused); 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 #ifdef __cplusplus
} }
#endif #endif

@ -67,6 +67,7 @@ struct message {
int headers_complete_cb_called; int headers_complete_cb_called;
int message_complete_cb_called; int message_complete_cb_called;
int message_complete_on_eof; int message_complete_on_eof;
int body_is_final;
}; };
static int currently_parsing_eof; static int currently_parsing_eof;
@ -1449,12 +1450,26 @@ header_value_cb (http_parser *p, const char *buf, size_t len)
return 0; 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 int
body_cb (http_parser *p, const char *buf, size_t len) body_cb (http_parser *p, const char *buf, size_t len)
{ {
assert(p == parser); assert(p == parser);
strncat(messages[num_messages].body, buf, len); strncat(messages[num_messages].body, buf, len);
messages[num_messages].body_size += len; messages[num_messages].body_size += len;
check_body_is_final(p);
// printf("body_cb: '%s'\n", requests[num_messages].body); // printf("body_cb: '%s'\n", requests[num_messages].body);
return 0; return 0;
} }
@ -1465,6 +1480,7 @@ count_body_cb (http_parser *p, const char *buf, size_t len)
assert(p == parser); assert(p == parser);
assert(buf); assert(buf);
messages[num_messages].body_size += len; messages[num_messages].body_size += len;
check_body_is_final(p);
return 0; return 0;
} }
@ -1501,6 +1517,18 @@ message_complete_cb (http_parser *p)
assert(0); assert(0);
abort(); 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_cb_called = TRUE;
messages[num_messages].message_complete_on_eof = currently_parsing_eof; messages[num_messages].message_complete_on_eof = currently_parsing_eof;

Loading…
Cancel
Save