diff --git a/deps/llhttp/src/llhttp.c b/deps/llhttp/src/llhttp.c index a8efce1033e..0af3e5ed54c 100644 --- a/deps/llhttp/src/llhttp.c +++ b/deps/llhttp/src/llhttp.c @@ -677,9 +677,9 @@ int llhttp__internal__c_mul_add_content_length( if (state->content_length > 0xffffffffffffffffULL / 16) { return 1; } - + state->content_length *= 16; - + /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { @@ -856,9 +856,9 @@ int llhttp__internal__c_mul_add_content_length_1( if (state->content_length > 0xffffffffffffffffULL / 10) { return 1; } - + state->content_length *= 10; - + /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { @@ -955,9 +955,9 @@ int llhttp__internal__c_mul_add_status_code( if (state->status_code > 0xffff / 10) { return 1; } - + state->status_code *= 10; - + /* Addition overflow */ if (match >= 0) { if (state->status_code > 0xffff - match) { @@ -969,7 +969,7 @@ int llhttp__internal__c_mul_add_status_code( } } state->status_code += match; - + /* Enforce maximum */ if (state->status_code > 999) { return 1; @@ -1079,7 +1079,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_chunk_data_almost_done: s_n_llhttp__internal__n_chunk_data_almost_done: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_chunk_data_almost_done; } @@ -1102,9 +1102,9 @@ static llparse_state_t llhttp__internal__run( } case s_n_llhttp__internal__n_consume_content_length: s_n_llhttp__internal__n_consume_content_length: { - size_t avail; - size_t need; - + uint64_t avail; + uint64_t need; + avail = endp - p; need = state->content_length; if (avail >= need) { @@ -1112,7 +1112,7 @@ static llparse_state_t llhttp__internal__run( state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body; } - + state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length; /* UNREACHABLE */; @@ -1457,9 +1457,9 @@ static llparse_state_t llhttp__internal__run( } case s_n_llhttp__internal__n_consume_content_length_1: s_n_llhttp__internal__n_consume_content_length_1: { - size_t avail; - size_t need; - + uint64_t avail; + uint64_t need; + avail = endp - p; need = state->content_length; if (avail >= need) { @@ -1467,7 +1467,7 @@ static llparse_state_t llhttp__internal__run( state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body_1; } - + state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length_1; /* UNREACHABLE */; @@ -1743,7 +1743,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_value_connection_1: s_n_llhttp__internal__n_header_value_connection_1: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_1; } @@ -1767,7 +1767,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_value_connection_2: s_n_llhttp__internal__n_header_value_connection_2: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_2; } @@ -1791,7 +1791,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_value_connection_3: s_n_llhttp__internal__n_header_value_connection_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_3; } @@ -2024,17 +2024,17 @@ static llparse_state_t llhttp__internal__run( __m128i input; int avail; int match_len; - + /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob7); - + /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 6, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); - + if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_value; @@ -2096,7 +2096,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_value_te_chunked: s_n_llhttp__internal__n_header_value_te_chunked: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_value_te_chunked; } @@ -2211,29 +2211,29 @@ static llparse_state_t llhttp__internal__run( __m128i input; int avail; int match_len; - + /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob8); - + /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 16, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); - + if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; } ranges = _mm_loadu_si128((__m128i const*) llparse_blob9); - + /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 2, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); - + if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; @@ -2276,7 +2276,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_3: s_n_llhttp__internal__n_header_field_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_3; } @@ -2301,7 +2301,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_4: s_n_llhttp__internal__n_header_field_4: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_4; } @@ -2347,7 +2347,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_1: s_n_llhttp__internal__n_header_field_1: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_1; } @@ -2371,7 +2371,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_5: s_n_llhttp__internal__n_header_field_5: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_5; } @@ -2396,7 +2396,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_6: s_n_llhttp__internal__n_header_field_6: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_6; } @@ -2421,7 +2421,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_7: s_n_llhttp__internal__n_header_field_7: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_7; } @@ -2591,7 +2591,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_pri_upgrade: s_n_llhttp__internal__n_req_pri_upgrade: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_pri_upgrade; } @@ -2796,7 +2796,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_http_start_1: s_n_llhttp__internal__n_req_http_start_1: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_http_start_1; } @@ -2820,7 +2820,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_http_start_2: s_n_llhttp__internal__n_req_http_start_2: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_http_start_2; } @@ -2844,7 +2844,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_http_start_3: s_n_llhttp__internal__n_req_http_start_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_http_start_3; } @@ -3545,7 +3545,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_3: s_n_llhttp__internal__n_start_req_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_3; } @@ -3591,7 +3591,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_4: s_n_llhttp__internal__n_start_req_4: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_4; } @@ -3616,7 +3616,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_6: s_n_llhttp__internal__n_start_req_6: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_6; } @@ -3641,7 +3641,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_8: s_n_llhttp__internal__n_start_req_8: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_8; } @@ -3726,7 +3726,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_12: s_n_llhttp__internal__n_start_req_12: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_12; } @@ -3751,7 +3751,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_13: s_n_llhttp__internal__n_start_req_13: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_13; } @@ -3814,7 +3814,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_14: s_n_llhttp__internal__n_start_req_14: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_14; } @@ -3839,7 +3839,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_17: s_n_llhttp__internal__n_start_req_17: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_17; } @@ -3882,7 +3882,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_15: s_n_llhttp__internal__n_start_req_15: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_15; } @@ -3906,7 +3906,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_18: s_n_llhttp__internal__n_start_req_18: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_18; } @@ -3931,7 +3931,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_20: s_n_llhttp__internal__n_start_req_20: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_20; } @@ -3956,7 +3956,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_21: s_n_llhttp__internal__n_start_req_21: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_21; } @@ -4002,7 +4002,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_23: s_n_llhttp__internal__n_start_req_23: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_23; } @@ -4027,7 +4027,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_24: s_n_llhttp__internal__n_start_req_24: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_24; } @@ -4052,7 +4052,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_26: s_n_llhttp__internal__n_start_req_26: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_26; } @@ -4077,7 +4077,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_28: s_n_llhttp__internal__n_start_req_28: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_28; } @@ -4162,7 +4162,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_30: s_n_llhttp__internal__n_start_req_30: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_30; } @@ -4216,7 +4216,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_31: s_n_llhttp__internal__n_start_req_31: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_31; } @@ -4241,7 +4241,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_32: s_n_llhttp__internal__n_start_req_32: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_32; } @@ -4266,7 +4266,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_35: s_n_llhttp__internal__n_start_req_35: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_35; } @@ -4291,7 +4291,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_36: s_n_llhttp__internal__n_start_req_36: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_36; } @@ -4337,7 +4337,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_37: s_n_llhttp__internal__n_start_req_37: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_37; } @@ -4362,7 +4362,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_38: s_n_llhttp__internal__n_start_req_38: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_38; } @@ -4387,7 +4387,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_42: s_n_llhttp__internal__n_start_req_42: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_42; } @@ -4412,7 +4412,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_43: s_n_llhttp__internal__n_start_req_43: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_43; } @@ -4497,7 +4497,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_45: s_n_llhttp__internal__n_start_req_45: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_45; } @@ -4577,7 +4577,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_48: s_n_llhttp__internal__n_start_req_48: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_48; } @@ -4602,7 +4602,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_49: s_n_llhttp__internal__n_start_req_49: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_49; } @@ -4627,7 +4627,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_50: s_n_llhttp__internal__n_start_req_50: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_50; } @@ -4652,7 +4652,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_51: s_n_llhttp__internal__n_start_req_51: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_51; } @@ -4723,7 +4723,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_54: s_n_llhttp__internal__n_start_req_54: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_54; } @@ -4766,7 +4766,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_57: s_n_llhttp__internal__n_start_req_57: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_57; } @@ -4833,7 +4833,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_58: s_n_llhttp__internal__n_start_req_58: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_58; } @@ -4858,7 +4858,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_59: s_n_llhttp__internal__n_start_req_59: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_59; } @@ -4908,7 +4908,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_61: s_n_llhttp__internal__n_start_req_61: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_61; } @@ -4933,7 +4933,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_62: s_n_llhttp__internal__n_start_req_62: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_62; } @@ -4979,7 +4979,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_65: s_n_llhttp__internal__n_start_req_65: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_65; } @@ -5004,7 +5004,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_67: s_n_llhttp__internal__n_start_req_67: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_67; } @@ -5029,7 +5029,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_68: s_n_llhttp__internal__n_start_req_68: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_68; } @@ -5075,7 +5075,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_69: s_n_llhttp__internal__n_start_req_69: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_69; } @@ -5543,7 +5543,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_res: s_n_llhttp__internal__n_start_res: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_res; } @@ -5567,7 +5567,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_or_res_method_2: s_n_llhttp__internal__n_req_or_res_method_2: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_2; } @@ -5592,7 +5592,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_or_res_method_3: s_n_llhttp__internal__n_req_or_res_method_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_3; } @@ -5896,7 +5896,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_body: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); @@ -5988,7 +5988,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_body_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); @@ -6166,7 +6166,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -6323,7 +6323,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -6340,7 +6340,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -6358,7 +6358,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -6483,7 +6483,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -6518,7 +6518,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -6610,7 +6610,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_field: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); @@ -6628,7 +6628,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); @@ -6703,7 +6703,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_3: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -6729,7 +6729,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_4: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -6994,7 +6994,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_5: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7011,7 +7011,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_6: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7028,7 +7028,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_7: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7045,7 +7045,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_8: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7071,7 +7071,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_9: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7088,7 +7088,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_10: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7105,7 +7105,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_11: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7140,7 +7140,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7157,7 +7157,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7174,7 +7174,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_2: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7191,7 +7191,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_12: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7208,7 +7208,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_13: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7225,7 +7225,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_14: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -7360,7 +7360,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_status: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); @@ -7378,7 +7378,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_status_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); @@ -7564,7 +7564,7 @@ int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const cha if (state->_span_pos0 != NULL) { state->_span_pos0 = (void*) p; } - + next = llhttp__internal__run(state, (const unsigned char*) p, (const unsigned char*) endp); if (next == s_error) { return state->error; @@ -7574,7 +7574,7 @@ int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const cha /* execute spans */ if (state->_span_pos0 != NULL) { int error; - + error = ((llhttp__internal__span_cb) state->_span_cb0)(state, state->_span_pos0, (const char*) endp); if (error != 0) { state->error = error; @@ -7582,7 +7582,7 @@ int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const cha return error; } } - + return 0; } @@ -8267,9 +8267,9 @@ int llhttp__internal__c_mul_add_content_length( if (state->content_length > 0xffffffffffffffffULL / 16) { return 1; } - + state->content_length *= 16; - + /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { @@ -8446,9 +8446,9 @@ int llhttp__internal__c_mul_add_content_length_1( if (state->content_length > 0xffffffffffffffffULL / 10) { return 1; } - + state->content_length *= 10; - + /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { @@ -8545,9 +8545,9 @@ int llhttp__internal__c_mul_add_status_code( if (state->status_code > 0xffff / 10) { return 1; } - + state->status_code *= 10; - + /* Addition overflow */ if (match >= 0) { if (state->status_code > 0xffff - match) { @@ -8559,7 +8559,7 @@ int llhttp__internal__c_mul_add_status_code( } } state->status_code += match; - + /* Enforce maximum */ if (state->status_code > 999) { return 1; @@ -8676,9 +8676,9 @@ static llparse_state_t llhttp__internal__run( } case s_n_llhttp__internal__n_consume_content_length: s_n_llhttp__internal__n_consume_content_length: { - size_t avail; - size_t need; - + uint64_t avail; + uint64_t need; + avail = endp - p; need = state->content_length; if (avail >= need) { @@ -8686,7 +8686,7 @@ static llparse_state_t llhttp__internal__run( state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body; } - + state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length; /* UNREACHABLE */; @@ -9024,9 +9024,9 @@ static llparse_state_t llhttp__internal__run( } case s_n_llhttp__internal__n_consume_content_length_1: s_n_llhttp__internal__n_consume_content_length_1: { - size_t avail; - size_t need; - + uint64_t avail; + uint64_t need; + avail = endp - p; need = state->content_length; if (avail >= need) { @@ -9034,7 +9034,7 @@ static llparse_state_t llhttp__internal__run( state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body_1; } - + state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length_1; /* UNREACHABLE */; @@ -9296,7 +9296,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_value_connection_1: s_n_llhttp__internal__n_header_value_connection_1: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_1; } @@ -9320,7 +9320,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_value_connection_2: s_n_llhttp__internal__n_header_value_connection_2: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_2; } @@ -9344,7 +9344,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_value_connection_3: s_n_llhttp__internal__n_header_value_connection_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_3; } @@ -9577,17 +9577,17 @@ static llparse_state_t llhttp__internal__run( __m128i input; int avail; int match_len; - + /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob7); - + /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 6, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); - + if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_value; @@ -9649,7 +9649,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_value_te_chunked: s_n_llhttp__internal__n_header_value_te_chunked: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_value_te_chunked; } @@ -9764,29 +9764,29 @@ static llparse_state_t llhttp__internal__run( __m128i input; int avail; int match_len; - + /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob8); - + /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 16, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); - + if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; } ranges = _mm_loadu_si128((__m128i const*) llparse_blob9); - + /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 2, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); - + if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; @@ -9829,7 +9829,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_3: s_n_llhttp__internal__n_header_field_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_3; } @@ -9854,7 +9854,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_4: s_n_llhttp__internal__n_header_field_4: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_4; } @@ -9900,7 +9900,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_1: s_n_llhttp__internal__n_header_field_1: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_1; } @@ -9924,7 +9924,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_5: s_n_llhttp__internal__n_header_field_5: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_5; } @@ -9949,7 +9949,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_6: s_n_llhttp__internal__n_header_field_6: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_6; } @@ -9974,7 +9974,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_header_field_7: s_n_llhttp__internal__n_header_field_7: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_header_field_7; } @@ -10069,7 +10069,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_url_skip_lf_to_http09: s_n_llhttp__internal__n_url_skip_lf_to_http09: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_url_skip_lf_to_http09; } @@ -10093,7 +10093,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_pri_upgrade: s_n_llhttp__internal__n_req_pri_upgrade: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_pri_upgrade; } @@ -10298,7 +10298,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_http_start_1: s_n_llhttp__internal__n_req_http_start_1: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_http_start_1; } @@ -10322,7 +10322,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_http_start_2: s_n_llhttp__internal__n_req_http_start_2: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_http_start_2; } @@ -10346,7 +10346,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_http_start_3: s_n_llhttp__internal__n_req_http_start_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_http_start_3; } @@ -10566,17 +10566,17 @@ static llparse_state_t llhttp__internal__run( __m128i input; int avail; int match_len; - + /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob0); - + /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 12, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); - + if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_url_path; @@ -10952,7 +10952,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_3: s_n_llhttp__internal__n_start_req_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_3; } @@ -10998,7 +10998,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_4: s_n_llhttp__internal__n_start_req_4: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_4; } @@ -11023,7 +11023,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_6: s_n_llhttp__internal__n_start_req_6: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_6; } @@ -11048,7 +11048,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_8: s_n_llhttp__internal__n_start_req_8: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_8; } @@ -11133,7 +11133,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_12: s_n_llhttp__internal__n_start_req_12: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_12; } @@ -11158,7 +11158,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_13: s_n_llhttp__internal__n_start_req_13: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_13; } @@ -11221,7 +11221,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_14: s_n_llhttp__internal__n_start_req_14: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_14; } @@ -11246,7 +11246,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_17: s_n_llhttp__internal__n_start_req_17: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_17; } @@ -11289,7 +11289,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_15: s_n_llhttp__internal__n_start_req_15: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_15; } @@ -11313,7 +11313,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_18: s_n_llhttp__internal__n_start_req_18: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_18; } @@ -11338,7 +11338,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_20: s_n_llhttp__internal__n_start_req_20: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_20; } @@ -11363,7 +11363,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_21: s_n_llhttp__internal__n_start_req_21: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_21; } @@ -11409,7 +11409,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_23: s_n_llhttp__internal__n_start_req_23: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_23; } @@ -11434,7 +11434,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_24: s_n_llhttp__internal__n_start_req_24: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_24; } @@ -11459,7 +11459,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_26: s_n_llhttp__internal__n_start_req_26: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_26; } @@ -11484,7 +11484,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_28: s_n_llhttp__internal__n_start_req_28: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_28; } @@ -11569,7 +11569,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_30: s_n_llhttp__internal__n_start_req_30: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_30; } @@ -11623,7 +11623,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_31: s_n_llhttp__internal__n_start_req_31: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_31; } @@ -11648,7 +11648,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_32: s_n_llhttp__internal__n_start_req_32: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_32; } @@ -11673,7 +11673,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_35: s_n_llhttp__internal__n_start_req_35: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_35; } @@ -11698,7 +11698,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_36: s_n_llhttp__internal__n_start_req_36: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_36; } @@ -11744,7 +11744,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_37: s_n_llhttp__internal__n_start_req_37: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_37; } @@ -11769,7 +11769,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_38: s_n_llhttp__internal__n_start_req_38: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_38; } @@ -11794,7 +11794,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_42: s_n_llhttp__internal__n_start_req_42: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_42; } @@ -11819,7 +11819,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_43: s_n_llhttp__internal__n_start_req_43: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_43; } @@ -11904,7 +11904,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_45: s_n_llhttp__internal__n_start_req_45: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_45; } @@ -11984,7 +11984,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_48: s_n_llhttp__internal__n_start_req_48: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_48; } @@ -12009,7 +12009,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_49: s_n_llhttp__internal__n_start_req_49: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_49; } @@ -12034,7 +12034,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_50: s_n_llhttp__internal__n_start_req_50: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_50; } @@ -12059,7 +12059,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_51: s_n_llhttp__internal__n_start_req_51: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_51; } @@ -12130,7 +12130,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_54: s_n_llhttp__internal__n_start_req_54: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_54; } @@ -12173,7 +12173,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_57: s_n_llhttp__internal__n_start_req_57: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_57; } @@ -12240,7 +12240,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_58: s_n_llhttp__internal__n_start_req_58: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_58; } @@ -12265,7 +12265,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_59: s_n_llhttp__internal__n_start_req_59: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_59; } @@ -12315,7 +12315,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_61: s_n_llhttp__internal__n_start_req_61: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_61; } @@ -12340,7 +12340,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_62: s_n_llhttp__internal__n_start_req_62: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_62; } @@ -12386,7 +12386,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_65: s_n_llhttp__internal__n_start_req_65: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_65; } @@ -12411,7 +12411,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_67: s_n_llhttp__internal__n_start_req_67: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_67; } @@ -12436,7 +12436,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_68: s_n_llhttp__internal__n_start_req_68: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_68; } @@ -12482,7 +12482,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_req_69: s_n_llhttp__internal__n_start_req_69: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_req_69; } @@ -12943,7 +12943,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_start_res: s_n_llhttp__internal__n_start_res: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_start_res; } @@ -12967,7 +12967,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_or_res_method_2: s_n_llhttp__internal__n_req_or_res_method_2: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_2; } @@ -12992,7 +12992,7 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_req_or_res_method_3: s_n_llhttp__internal__n_req_or_res_method_3: { llparse_match_t match_seq; - + if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_3; } @@ -13269,7 +13269,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_body: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); @@ -13352,7 +13352,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_body_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); @@ -13521,7 +13521,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -13669,7 +13669,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -13686,7 +13686,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -13704,7 +13704,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -13829,7 +13829,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -13864,7 +13864,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -13956,7 +13956,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_field: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); @@ -13974,7 +13974,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); @@ -14049,7 +14049,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_3: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14075,7 +14075,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_4: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14340,7 +14340,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_5: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14357,7 +14357,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_6: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14374,7 +14374,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_7: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14391,7 +14391,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_8: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14417,7 +14417,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_9: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14434,7 +14434,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_10: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14451,7 +14451,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_11: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14486,7 +14486,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14503,7 +14503,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14520,7 +14520,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_2: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14537,7 +14537,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_12: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14554,7 +14554,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_13: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14571,7 +14571,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_url_14: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); @@ -14697,7 +14697,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_status: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); @@ -14715,7 +14715,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_span_end_llhttp__on_status_1: { const unsigned char* start; int err; - + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); @@ -14901,7 +14901,7 @@ int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const cha if (state->_span_pos0 != NULL) { state->_span_pos0 = (void*) p; } - + next = llhttp__internal__run(state, (const unsigned char*) p, (const unsigned char*) endp); if (next == s_error) { return state->error; @@ -14911,7 +14911,7 @@ int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const cha /* execute spans */ if (state->_span_pos0 != NULL) { int error; - + error = ((llhttp__internal__span_cb) state->_span_cb0)(state, state->_span_pos0, (const char*) endp); if (error != 0) { state->error = error; @@ -14919,7 +14919,7 @@ int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const cha return error; } } - + return 0; } diff --git a/docs/api/Errors.md b/docs/api/Errors.md index 0cde2b32a4f..01fa51c9847 100644 --- a/docs/api/Errors.md +++ b/docs/api/Errors.md @@ -7,15 +7,16 @@ You can find all the error objects inside the `errors` key. const { errors } = require('undici') ``` -| Error | Error Codes | Description | -| ------------------------------------|---------------------------------------|---------------------------------------------------| -| `InvalidArgumentError` | `UND_ERR_INVALID_ARG` | passed an invalid argument. | -| `InvalidReturnValueError` | `UND_ERR_INVALID_RETURN_VALUE` | returned an invalid value. | -| `RequestAbortedError` | `UND_ERR_ABORTED` | the request has been aborted by the user | -| `ClientDestroyedError` | `UND_ERR_DESTROYED` | trying to use a destroyed client. | -| `ClientClosedError` | `UND_ERR_CLOSED` | trying to use a closed client. | -| `SocketError` | `UND_ERR_SOCKET` | there is an error with the socket. | -| `NotSupportedError` | `UND_ERR_NOT_SUPPORTED` | encountered unsupported functionality. | -| `RequestContentLengthMismatchError` | `UND_ERR_REQ_CONTENT_LENGTH_MISMATCH`| request body does not match content-length header | -| `InformationalError` | `UND_ERR_INFO` | expected error with reason | -| `TrailerMismatchError` | `UND_ERR_TRAILER_MISMATCH` | trailers did not match specification | +| Error | Error Codes | Description | +| ------------------------------------|---------------------------------------|----------------------------------------------------| +| `InvalidArgumentError` | `UND_ERR_INVALID_ARG` | passed an invalid argument. | +| `InvalidReturnValueError` | `UND_ERR_INVALID_RETURN_VALUE` | returned an invalid value. | +| `RequestAbortedError` | `UND_ERR_ABORTED` | the request has been aborted by the user | +| `ClientDestroyedError` | `UND_ERR_DESTROYED` | trying to use a destroyed client. | +| `ClientClosedError` | `UND_ERR_CLOSED` | trying to use a closed client. | +| `SocketError` | `UND_ERR_SOCKET` | there is an error with the socket. | +| `NotSupportedError` | `UND_ERR_NOT_SUPPORTED` | encountered unsupported functionality. | +| `RequestContentLengthMismatchError` | `UND_ERR_REQ_CONTENT_LENGTH_MISMATCH`| request body does not match content-length header | +| `RequestContentLengthMismatchError` | `UND_ERR_RES_CONTENT_LENGTH_MISMATCH`| response body does not match content-length header | +| `InformationalError` | `UND_ERR_INFO` | expected error with reason | +| `TrailerMismatchError` | `UND_ERR_TRAILER_MISMATCH` | trailers did not match specification | diff --git a/lib/client.js b/lib/client.js index f7f56f0af16..d5985a781d6 100644 --- a/lib/client.js +++ b/lib/client.js @@ -9,6 +9,7 @@ const Request = require('./core/request') const Dispatcher = require('./dispatcher') const { RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, TrailerMismatchError, InvalidArgumentError, RequestAbortedError, @@ -448,8 +449,11 @@ class Parser { this.paused = false this.resume = this.resume.bind(this) + this.bytesRead = 0 + this.trailer = '' this.keepAlive = '' + this.contentLength = '' } setTimeout (value, type) { @@ -590,6 +594,8 @@ class Parser { this.keepAlive += buf.toString() } else if (key.length === 7 && key.toString().toLowerCase() === 'trailer') { this.trailer += buf.toString() + } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') { + this.contentLength += buf.toString() } this.trackHeader(buf.length) @@ -780,6 +786,8 @@ class Parser { assert(statusCode >= 200) + this.bytesRead += buf.length + try { if (request.onData(buf) === false) { return constants.ERROR.PAUSED @@ -790,7 +798,7 @@ class Parser { } onMessageComplete () { - const { client, socket, statusCode, upgrade, trailer, headers, shouldKeepAlive } = this + const { client, socket, statusCode, upgrade, trailer, headers, contentLength, bytesRead, shouldKeepAlive } = this if (socket.destroyed && (!statusCode || shouldKeepAlive)) { return -1 @@ -806,6 +814,8 @@ class Parser { assert(statusCode >= 100) this.statusCode = null + this.bytesRead = 0 + this.contentLength = '' this.trailer = '' this.keepAlive = '' @@ -834,6 +844,12 @@ class Parser { } } + /* istanbul ignore next: should be handled by llhttp? */ + if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError()) + return -1 + } + try { request.onComplete(headers) } catch (err) { diff --git a/lib/core/errors.js b/lib/core/errors.js index 5db37fde05c..97831a7e56a 100644 --- a/lib/core/errors.js +++ b/lib/core/errors.js @@ -94,7 +94,17 @@ class RequestContentLengthMismatchError extends UndiciError { Error.captureStackTrace(this, RequestContentLengthMismatchError) this.name = 'RequestContentLengthMismatchError' this.message = message || 'Request body length does not match content-length header' - this.code = 'UND_ERR_CONTENT_LENGTH_MISMATCH' + this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH' + } +} + +class ResponseContentLengthMismatchError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ResponseContentLengthMismatchError) + this.name = 'ResponseContentLengthMismatchError' + this.message = message || 'Response body length does not match content-length header' + this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH' } } @@ -163,5 +173,6 @@ module.exports = { ClientClosedError, InformationalError, SocketError, - NotSupportedError + NotSupportedError, + ResponseContentLengthMismatchError } diff --git a/lib/core/request.js b/lib/core/request.js index d60f15f27a2..04383a27688 100644 --- a/lib/core/request.js +++ b/lib/core/request.js @@ -189,7 +189,7 @@ function processHeader (request, key, val) { key.length === 14 && key.toLowerCase() === 'content-length' ) { - request.contentLength = parseInt(val) + request.contentLength = parseInt(val, 10) if (!Number.isFinite(request.contentLength)) { throw new InvalidArgumentError('invalid content-length header') } diff --git a/lib/core/util.js b/lib/core/util.js index 5ed0bc74fa0..2439bcf716a 100644 --- a/lib/core/util.js +++ b/lib/core/util.js @@ -147,7 +147,7 @@ function destroy (stream, err) { const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/ function parseKeepAliveTimeout (val) { const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR) - return m ? parseInt(m[1]) * 1000 : null + return m ? parseInt(m[1], 10) * 1000 : null } function parseHeaders (headers, obj = {}) { diff --git a/lib/llhttp/llhttp.wasm b/lib/llhttp/llhttp.wasm index 6ab61c4e8ee..d1f9c0e1faa 100755 Binary files a/lib/llhttp/llhttp.wasm and b/lib/llhttp/llhttp.wasm differ diff --git a/lib/llhttp/llhttp_simd.wasm b/lib/llhttp/llhttp_simd.wasm index 52db42fb67d..7d9493caf7d 100755 Binary files a/lib/llhttp/llhttp_simd.wasm and b/lib/llhttp/llhttp_simd.wasm differ diff --git a/test/errors.js b/test/errors.js index a9850ad179e..f5aab06538a 100644 --- a/test/errors.js +++ b/test/errors.js @@ -21,7 +21,7 @@ const scenarios = [ createScenario(errors.InvalidReturnValueError, 'Invalid Return Value Error', 'InvalidReturnValueError', 'UND_ERR_INVALID_RETURN_VALUE'), createScenario(errors.RequestAbortedError, 'Request aborted', 'RequestAbortedError', 'UND_ERR_ABORTED'), createScenario(errors.InformationalError, 'Request information', 'InformationalError', 'UND_ERR_INFO'), - createScenario(errors.RequestContentLengthMismatchError, 'Request body length does not match content-length header', 'RequestContentLengthMismatchError', 'UND_ERR_CONTENT_LENGTH_MISMATCH'), + createScenario(errors.RequestContentLengthMismatchError, 'Request body length does not match content-length header', 'RequestContentLengthMismatchError', 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'), createScenario(errors.TrailerMismatchError, 'Trailers does not match trailer header', 'TrailerMismatchError', 'UND_ERR_TRAILER_MISMATCH'), createScenario(errors.ClientDestroyedError, 'The client is destroyed', 'ClientDestroyedError', 'UND_ERR_DESTROYED'), createScenario(errors.ClientClosedError, 'The client is closed', 'ClientClosedError', 'UND_ERR_CLOSED'), diff --git a/test/issue-803.js b/test/issue-803.js new file mode 100644 index 00000000000..70f64cce773 --- /dev/null +++ b/test/issue-803.js @@ -0,0 +1,47 @@ +'use strict' + +const { test } = require('tap') +const { Client } = require('..') +const { createServer } = require('http') +const EE = require('events') + +test('https://github.com/nodejs/undici/issues/803', (t) => { + t.plan(2) + + const SIZE = 5900373096 + + const server = createServer(async (req, res) => { + res.setHeader('content-length', SIZE) + let pos = 0 + while (pos < SIZE) { + const len = Math.min(SIZE - pos, 65536) + if (!res.write(Buffer.allocUnsafe(len))) { + await EE.once(res, 'drain') + } + pos += len + } + + res.end() + }) + t.teardown(server.close.bind(server)) + + server.listen(0, () => { + const client = new Client(`http://localhost:${server.address().port}`) + t.teardown(client.close.bind(client)) + + client.request({ + path: '/', + method: 'GET' + }, (err, data) => { + t.error(err) + + let pos = 0 + data.body.on('data', (buf) => { + pos += buf.length + }) + data.body.on('end', () => { + t.equal(pos, SIZE) + }) + }) + }) +}) diff --git a/test/types/errors.test-d.ts b/test/types/errors.test-d.ts index 2d7082ea781..d7a58ac40ff 100644 --- a/test/types/errors.test-d.ts +++ b/test/types/errors.test-d.ts @@ -36,7 +36,7 @@ expectAssignable<'UND_ERR_INFO'>(new errors.InformationalError().code) expectAssignable(new errors.RequestContentLengthMismatchError()) expectAssignable(new errors.RequestContentLengthMismatchError()) expectAssignable<'RequestContentLengthMismatchError'>(new errors.RequestContentLengthMismatchError().name) -expectAssignable<'UND_ERR_CONTENT_LENGTH_MISMATCH'>(new errors.RequestContentLengthMismatchError().code) +expectAssignable<'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'>(new errors.RequestContentLengthMismatchError().code) expectAssignable(new errors.ClientDestroyedError()) expectAssignable(new errors.ClientDestroyedError()) diff --git a/types/errors.d.ts b/types/errors.d.ts index 705796dc1b2..2fced259ee5 100644 --- a/types/errors.d.ts +++ b/types/errors.d.ts @@ -48,7 +48,7 @@ declare namespace Errors { /** Body does not match content-length header. */ export class RequestContentLengthMismatchError extends UndiciError { name: 'RequestContentLengthMismatchError'; - code: 'UND_ERR_CONTENT_LENGTH_MISMATCH'; + code: 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'; } /** Trying to use a destroyed client. */