Skip to content

Commit

Permalink
Update http-parser to 8d9e5db981b623fffc93657abacdc80270cbee58
Browse files Browse the repository at this point in the history
  • Loading branch information
tatsuhiro-t committed May 15, 2014
1 parent 694cd07 commit 3b5b5ce
Show file tree
Hide file tree
Showing 10 changed files with 252 additions and 83 deletions.
4 changes: 2 additions & 2 deletions src/nghttp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -972,7 +972,7 @@ int htp_msg_begincb(http_parser *htp)
} // namespace

namespace {
int htp_status_completecb(http_parser *htp)
int htp_statuscb(http_parser *htp, const char *at, size_t length)
{
auto client = static_cast<HttpClient*>(htp->data);
client->upgrade_response_status_code = htp->status_code;
Expand All @@ -993,7 +993,7 @@ namespace {
http_parser_settings htp_hooks = {
htp_msg_begincb, // http_cb on_message_begin;
nullptr, // http_data_cb on_url;
htp_status_completecb, // http_cb on_status_complete;
htp_statuscb, // http_data_cb on_status;
nullptr, // http_data_cb on_header_field;
nullptr, // http_data_cb on_header_value;
nullptr, // http_cb on_headers_complete;
Expand Down
2 changes: 1 addition & 1 deletion src/shrpx_http2_session.cc
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ namespace {
http_parser_settings htp_hooks = {
nullptr, // http_cb on_message_begin;
nullptr, // http_data_cb on_url;
nullptr, // http_cb on_status_complete;
nullptr, // http_data_cb on_status;
nullptr, // http_data_cb on_header_field;
nullptr, // http_data_cb on_header_value;
htp_hdrs_completecb, // http_cb on_headers_complete;
Expand Down
2 changes: 1 addition & 1 deletion src/shrpx_http_downstream_connection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,7 @@ namespace {
http_parser_settings htp_hooks = {
nullptr, // http_cb on_message_begin;
nullptr, // http_data_cb on_url;
nullptr, // http_cb on_status_complete;
nullptr, // http_data_cb on_status;
htp_hdr_keycb, // http_data_cb on_header_field;
htp_hdr_valcb, // http_data_cb on_header_value;
htp_hdrs_completecb, // http_cb on_headers_complete;
Expand Down
2 changes: 1 addition & 1 deletion src/shrpx_https_upstream.cc
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ namespace {
http_parser_settings htp_hooks = {
htp_msg_begin, // http_cb on_message_begin;
htp_uricb, // http_data_cb on_url;
nullptr, // http_cb on_status_complete;
nullptr, // http_data_cb on_status;
htp_hdr_keycb, // http_data_cb on_header_field;
htp_hdr_valcb, // http_data_cb on_header_value;
htp_hdrs_completecb, // http_cb on_headers_complete;
Expand Down
9 changes: 9 additions & 0 deletions third-party/http-parser/AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,12 @@ BogDan Vatra <[email protected]>
Peter Faiman <[email protected]>
Corey Richardson <[email protected]>
Tóth Tamás <[email protected]>
Patrik Stutz <[email protected]>
Cam Swords <[email protected]>
Chris Dickinson <[email protected]>
Uli Köhler <[email protected]>
Charlie Somerville <[email protected]>
Fedor Indutny <[email protected]>
runner <[email protected]>
Alexis Campailla <[email protected]>
David Wragg <[email protected]>
2 changes: 1 addition & 1 deletion third-party/http-parser/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ if (recved < 0) {
}
/* Start up / continue the parser.
* Note we pass recved==0 to signal that EOF has been recieved.
* Note we pass recved==0 to signal that EOF has been received.
*/
nparsed = http_parser_execute(parser, &settings, buf, recved);
Expand Down
12 changes: 8 additions & 4 deletions third-party/http-parser/contrib/parsertrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,22 +111,22 @@ int main(int argc, char* argv[]) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
perror("fopen");
return EXIT_FAILURE;
goto fail;
}

fseek(file, 0, SEEK_END);
long file_length = ftell(file);
if (file_length == -1) {
perror("ftell");
return EXIT_FAILURE;
goto fail;
}
fseek(file, 0, SEEK_SET);

char* data = malloc(file_length);
if (fread(data, 1, file_length, file) != (size_t)file_length) {
fprintf(stderr, "couldn't read entire file\n");
free(data);
return EXIT_FAILURE;
goto fail;
}

http_parser_settings settings;
Expand All @@ -149,8 +149,12 @@ int main(int argc, char* argv[]) {
"Error: %s (%s)\n",
http_errno_description(HTTP_PARSER_ERRNO(&parser)),
http_errno_name(HTTP_PARSER_ERRNO(&parser)));
return EXIT_FAILURE;
goto fail;
}

return EXIT_SUCCESS;

fail:
fclose(file);
return EXIT_FAILURE;
}
108 changes: 78 additions & 30 deletions third-party/http-parser/http_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ enum state
, s_res_http_minor
, s_res_first_status_code
, s_res_status_code
, s_res_status_start
, s_res_status
, s_res_line_almost_done

Expand Down Expand Up @@ -279,6 +280,9 @@ enum state

, s_header_field_start
, s_header_field
, s_header_value_discard_ws
, s_header_value_discard_ws_almost_done
, s_header_value_discard_lws
, s_header_value_start
, s_header_value
, s_header_value_lws
Expand Down Expand Up @@ -581,6 +585,7 @@ size_t http_parser_execute (http_parser *parser,
const char *header_value_mark = 0;
const char *url_mark = 0;
const char *body_mark = 0;
const char *status_mark = 0;

/* We're in an error state. Don't bother doing anything. */
if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {
Expand Down Expand Up @@ -627,6 +632,9 @@ size_t http_parser_execute (http_parser *parser,
case s_req_fragment:
url_mark = data;
break;
case s_res_status:
status_mark = data;
break;
}

for (p=data; p != data + len; p++) {
Expand All @@ -645,7 +653,7 @@ size_t http_parser_execute (http_parser *parser,
* than any reasonable request or response so this should never affect
* day-to-day operation.
*/
if (parser->nread > HTTP_MAX_HEADER_SIZE) {
if (parser->nread > (HTTP_MAX_HEADER_SIZE)) {
SET_ERRNO(HPE_HEADER_OVERFLOW);
goto error;
}
Expand Down Expand Up @@ -833,7 +841,7 @@ size_t http_parser_execute (http_parser *parser,
if (!IS_NUM(ch)) {
switch (ch) {
case ' ':
parser->state = s_res_status;
parser->state = s_res_status_start;
break;
case CR:
parser->state = s_res_line_almost_done;
Expand All @@ -859,24 +867,42 @@ size_t http_parser_execute (http_parser *parser,
break;
}

case s_res_status_start:
{
if (ch == CR) {
parser->state = s_res_line_almost_done;
break;
}

if (ch == LF) {
parser->state = s_header_field_start;
break;
}

MARK(status);
parser->state = s_res_status;
parser->index = 0;
break;
}

case s_res_status:
/* the human readable status. e.g. "NOT FOUND"
* we are not humans so just ignore this */
if (ch == CR) {
parser->state = s_res_line_almost_done;
CALLBACK_DATA(status);
break;
}

if (ch == LF) {
parser->state = s_header_field_start;
CALLBACK_DATA(status);
break;
}

break;

case s_res_line_almost_done:
STRICT_CHECK(ch != LF);
parser->state = s_header_field_start;
CALLBACK_NOTIFY(status_complete);
break;

case s_start_req:
Expand Down Expand Up @@ -1357,7 +1383,7 @@ size_t http_parser_execute (http_parser *parser,
}

if (ch == ':') {
parser->state = s_header_value_start;
parser->state = s_header_value_discard_ws;
CALLBACK_DATA(header_field);
break;
}
Expand All @@ -1378,28 +1404,28 @@ size_t http_parser_execute (http_parser *parser,
goto error;
}

case s_header_value_start:
{
case s_header_value_discard_ws:
if (ch == ' ' || ch == '\t') break;

MARK(header_value);

parser->state = s_header_value;
parser->index = 0;

if (ch == CR) {
parser->header_state = h_general;
parser->state = s_header_almost_done;
CALLBACK_DATA(header_value);
parser->state = s_header_value_discard_ws_almost_done;
break;
}

if (ch == LF) {
parser->state = s_header_field_start;
CALLBACK_DATA(header_value);
parser->state = s_header_value_discard_lws;
break;
}

/* FALLTHROUGH */

case s_header_value_start:
{
MARK(header_value);

parser->state = s_header_value;
parser->index = 0;

c = LOWER(ch);

switch (parser->header_state) {
Expand Down Expand Up @@ -1486,8 +1512,8 @@ size_t http_parser_execute (http_parser *parser,
t *= 10;
t += ch - '0';

/* Overflow? */
if (t < parser->content_length || t == ULLONG_MAX) {
/* Overflow? Test against a conservative limit for simplicity. */
if ((ULLONG_MAX - 10) / 10 < parser->content_length) {
SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
goto error;
}
Expand Down Expand Up @@ -1547,7 +1573,17 @@ size_t http_parser_execute (http_parser *parser,
STRICT_CHECK(ch != LF);

parser->state = s_header_value_lws;
break;
}

case s_header_value_lws:
{
if (ch == ' ' || ch == '\t') {
parser->state = s_header_value_start;
goto reexecute_byte;
}

/* finished the header */
switch (parser->header_state) {
case h_connection_keep_alive:
parser->flags |= F_CONNECTION_KEEP_ALIVE;
Expand All @@ -1562,19 +1598,29 @@ size_t http_parser_execute (http_parser *parser,
break;
}

parser->state = s_header_field_start;
goto reexecute_byte;
}

case s_header_value_discard_ws_almost_done:
{
STRICT_CHECK(ch != LF);
parser->state = s_header_value_discard_lws;
break;
}

case s_header_value_lws:
case s_header_value_discard_lws:
{
if (ch == ' ' || ch == '\t')
parser->state = s_header_value_start;
else
{
if (ch == ' ' || ch == '\t') {
parser->state = s_header_value_discard_ws;
break;
} else {
/* header value was empty */
MARK(header_value);
parser->state = s_header_field_start;
CALLBACK_DATA_NOADVANCE(header_value);
goto reexecute_byte;
}
break;
}

case s_headers_almost_done:
Expand Down Expand Up @@ -1759,8 +1805,8 @@ size_t http_parser_execute (http_parser *parser,
t *= 16;
t += unhex_val;

/* Overflow? */
if (t < parser->content_length || t == ULLONG_MAX) {
/* Overflow? Test against a conservative limit for simplicity. */
if ((ULLONG_MAX - 16) / 16 < parser->content_length) {
SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
goto error;
}
Expand Down Expand Up @@ -1854,12 +1900,14 @@ size_t http_parser_execute (http_parser *parser,
assert(((header_field_mark ? 1 : 0) +
(header_value_mark ? 1 : 0) +
(url_mark ? 1 : 0) +
(body_mark ? 1 : 0)) <= 1);
(body_mark ? 1 : 0) +
(status_mark ? 1 : 0)) <= 1);

CALLBACK_DATA_NOADVANCE(header_field);
CALLBACK_DATA_NOADVANCE(header_value);
CALLBACK_DATA_NOADVANCE(url);
CALLBACK_DATA_NOADVANCE(body);
CALLBACK_DATA_NOADVANCE(status);

return len;

Expand Down Expand Up @@ -2094,7 +2142,7 @@ http_parser_parse_url(const char *buf, size_t buflen, int is_connect,

u->port = u->field_set = 0;
s = is_connect ? s_req_server_start : s_req_spaces_before_url;
old_uf = UF_MAX;
uf = old_uf = UF_MAX;

for (p = buf; p < buf + buflen; p++) {
s = parse_url_char(s, *p);
Expand Down
Loading

0 comments on commit 3b5b5ce

Please sign in to comment.