From 4b108fc0e7ef715a38b3f2fe1afab2b038d156b1 Mon Sep 17 00:00:00 2001 From: lijia Date: Mon, 2 Sep 2024 19:16:34 +0800 Subject: TSG-22621, http push all headers together --- decoders/http/CMakeLists.txt | 5 +- decoders/http/http_decoder.c | 553 +++--------- decoders/http/http_decoder_half.c | 966 +++++++++------------ decoders/http/http_decoder_half.h | 38 +- decoders/http/http_decoder_private.h | 10 +- decoders/http/http_decoder_result_queue.c | 18 +- decoders/http/http_decoder_string.c | 289 ------ decoders/http/http_decoder_string.h | 73 -- decoders/http/http_decoder_table.c | 579 ------------ decoders/http/http_decoder_table.h | 79 -- decoders/http/http_decoder_tunnel.c | 116 --- decoders/http/http_decoder_tunnel.h | 36 - decoders/http/http_decoder_utils.c | 229 ++++- decoders/http/http_decoder_utils.h | 26 +- decoders/http/version.map | 1 + include/stellar/http.h | 77 +- include/stellar/utils.h | 2 +- test/decoders/http/CMakeLists.txt | 4 +- .../http/benchmarks/json/http_chn_encode_url.json | 6 +- .../benchmarks/json/http_chunked_res_gzip.json | 8 +- .../http/benchmarks/json/http_get_encoded_uri.json | 14 +- .../http/benchmarks/json/http_get_long_cookie.json | 5 +- .../http/benchmarks/json/http_get_multi_trans.json | 26 +- .../benchmarks/json/http_get_req_pipeline.json | 13 +- .../benchmarks/json/http_get_single_trans.json | 7 +- .../benchmarks/json/http_gzip_out_of_order.json | 8 +- .../benchmarks/json/http_hdrs_exceed_maximum.json | 99 +-- .../http/benchmarks/json/http_msg_type_state.json | 22 +- .../benchmarks/json/http_msg_type_state_c2s.json | 12 +- .../json/http_msg_type_state_exception_c2s.json | 10 +- .../json/http_msg_type_state_exception_s2c.json | 14 +- .../json/http_msg_type_state_pipeline.json | 82 +- .../benchmarks/json/http_msg_type_state_s2c.json | 12 +- .../json/http_msg_type_state_tunnel.json | 6 +- .../json/http_msg_type_state_tunnel_c2s.json | 2 - .../json/http_msg_type_state_tunnel_s2c.json | 2 - .../benchmarks/json/http_multi_parse_error.json | 10 +- .../benchmarks/json/http_no_content_length.json | 7 +- .../http/benchmarks/json/http_out_of_order.json | 7 +- .../http/benchmarks/json/http_over_pppoe.json | 7 +- .../benchmarks/json/http_over_tcp_keepalive.json | 8 +- .../json/http_pipeline_header_splitting.json | 14 +- .../json/http_post_multipart_form_data.json | 22 +- .../json/http_req_1byte_sliding_window.json | 7 +- .../json/http_res_1byte_sliding_window.json | 7 +- .../http/benchmarks/json/http_res_gzip.json | 8 +- .../http/benchmarks/json/http_trans_pipeline.json | 116 +-- .../benchmarks/json/http_upgrade_websocket.json | 6 +- .../json/http_url_test_without_host.json | 7 +- .../json/http_url_test_without_host_v6.json | 6 +- .../http/benchmarks/json/http_zlib_deadlock.json | 8 +- test/decoders/http/http_gtest.cpp | 285 +++++- test/decoders/http/http_test_plug.cpp | 166 ++-- .../http/test_based_on_stellar/CMakeLists.txt | 4 + .../test_based_on_stellar/env/http_decoder.toml | 3 - 55 files changed, 1458 insertions(+), 2689 deletions(-) delete mode 100644 decoders/http/http_decoder_string.c delete mode 100644 decoders/http/http_decoder_string.h delete mode 100644 decoders/http/http_decoder_table.c delete mode 100644 decoders/http/http_decoder_table.h delete mode 100644 decoders/http/http_decoder_tunnel.c delete mode 100644 decoders/http/http_decoder_tunnel.h diff --git a/decoders/http/CMakeLists.txt b/decoders/http/CMakeLists.txt index c242afe..cc78ffc 100644 --- a/decoders/http/CMakeLists.txt +++ b/decoders/http/CMakeLists.txt @@ -1,8 +1,7 @@ include_directories(${CMAKE_SOURCE_DIR}/deps) -set(HTTP_SRC http_decoder.c http_decoder_utils.c http_decoder_half.c - http_decoder_table.c http_decoder_string.c http_content_decompress.c - http_decoder_result_queue.c http_decoder_stat.c http_decoder_tunnel.c) +set(HTTP_SRC http_decoder.c http_decoder_utils.c http_decoder_half.c http_content_decompress.c + http_decoder_result_queue.c http_decoder_stat.c ) add_library(http STATIC ${HTTP_SRC}) add_library(http_dyn SHARED ${HTTP_SRC}) diff --git a/decoders/http/http_decoder.c b/decoders/http/http_decoder.c index 5e2db72..a57bbdb 100644 --- a/decoders/http/http_decoder.c +++ b/decoders/http/http_decoder.c @@ -5,8 +5,6 @@ #include #include "http_decoder_private.h" -#pragma GCC diagnostic ignored "-Wunused-parameter" - struct http_message *http_message_new(enum http_message_type type, struct http_decoder_result_queue *queue, int queue_index, uint8_t flow_type) { @@ -39,7 +37,7 @@ struct http_message *http_body_message_new(enum http_message_type type, struct h return msg; } -static void http_message_decompress_buffer_free(struct http_message *msg) +static void http_half_data_decompress_free(struct http_message *msg) { struct http_decoder_half_data *ref_data = NULL; if (HTTP_MESSAGE_REQ_BODY_START == msg->type || HTTP_MESSAGE_REQ_BODY == msg->type || HTTP_MESSAGE_REQ_BODY_END == msg->type) @@ -50,17 +48,44 @@ static void http_message_decompress_buffer_free(struct http_message *msg) { ref_data = msg->ref_queue->array[msg->queue_index].res_data; } + else + { + return; + } if (ref_data != NULL && msg->decompress_payload.iov_base != NULL) { http_half_decompress_buffer_free(ref_data, &msg->decompress_payload); } } -static void http_message_free(void *http_msg, void *cb_arg) +static void http_half_data_headers_free(struct http_message *msg) +{ + struct http_decoder_half_data *ref_data = NULL; + if (HTTP_MESSAGE_REQ_LINE_HEADERS == msg->type) + { + ref_data = msg->ref_queue->array[msg->queue_index].req_data; + } + else if (HTTP_MESSAGE_RES_LINE_HEADERS == msg->type) + { + ref_data = msg->ref_queue->array[msg->queue_index].res_data; + } + else + { + return; + } + + if (ref_data) + { + http_half_headers_ref_free(ref_data); + } +} + +static void http_message_free(void *http_msg, UNUSED void *cb_arg) { if (http_msg) { - http_message_decompress_buffer_free((struct http_message *)http_msg); + http_half_data_decompress_free((struct http_message *)http_msg); + http_half_data_headers_free((struct http_message *)http_msg); FREE(http_msg); } } @@ -110,11 +135,10 @@ static void http_event_handler(enum http_event event, struct http_decoder_half_d half_data = NULL; } - half_data = http_decoder_half_data_new(mempool); + half_data = http_decoder_half_data_new(mempool, FLOW_TYPE_C2S); ret = http_decoder_result_queue_push_req(queue, half_data); if (ret < 0) { - fprintf(stderr, "http_decoder_result_queue_push req failed."); http_decoder_half_data_free(mempool, half_data); half_data = NULL; } @@ -125,38 +149,16 @@ static void http_event_handler(enum http_event event, struct http_decoder_half_d session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_TRANSACTION_NEW, 1); break; - case HTTP_EVENT_REQ_LINE: - msg = http_message_new(HTTP_MESSAGE_REQ_LINE, queue, queue_idx, HTTP_REQUEST); - session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); - if (httpd_tunnel_identify(httpd_env, FLOW_TYPE_C2S, half_data)) - { - exdata->tunnel_state = HTTP_TUN_C2S_HDR_START; - // http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTPD_STAT_TUNNEL, 1); - } - if (httpd_is_tunnel_session(httpd_env, exdata)) - { - http_decoder_get_url(half_data, mempool); - } - break; - case HTTP_EVENT_REQ_HDR: - msg = http_message_new(HTTP_MESSAGE_REQ_HEADER, queue, queue_idx, HTTP_REQUEST); - session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); - break; + case HTTP_EVENT_REQ_HDR_END: { - http_decoder_join_url_finally(ev_ctx, half_data, mempool); + http_parse_headers_finally(ev_ctx, half_data); /* maybe some parsed headers in buffer, but has not pushed to plugins yet */ - - if (http_decoder_half_data_has_parsed_header(half_data)) { - msg = http_message_new(HTTP_MESSAGE_REQ_HEADER, queue, queue_idx, HTTP_REQUEST); + msg = http_message_new(HTTP_MESSAGE_REQ_LINE_HEADERS, queue, queue_idx, HTTP_REQUEST); session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); } - http_half_data_update_commit_index(half_data); - msg = http_message_new(HTTP_MESSAGE_REQ_HEADER_END, queue, queue_idx, HTTP_REQUEST); - session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); - - int tot_c2s_headers = http_half_data_get_total_parsed_header_count(half_data); + int tot_c2s_headers = http_half_get_header_count(half_data); http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_C2S_HEADERS, tot_c2s_headers); const char *tmp_url = NULL; @@ -171,15 +173,14 @@ static void http_event_handler(enum http_event event, struct http_decoder_half_d break; case HTTP_EVENT_REQ_BODY_DATA: { - hstring raw_body = {}; + hstring *raw_body = http_half_get_raw_body(half_data); hstring decompress_body = {}; - http_decoder_half_data_get_raw_body(half_data, (const char **)&raw_body.iov_base, &raw_body.iov_len); http_half_get_lastest_decompress_buffer(half_data, &decompress_body); - msg = http_body_message_new(HTTP_MESSAGE_REQ_BODY, queue, queue_idx, HTTP_REQUEST, &raw_body, &decompress_body); + msg = http_body_message_new(HTTP_MESSAGE_REQ_BODY, queue, queue_idx, HTTP_REQUEST, raw_body, &decompress_body); session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); if (decompress_body.iov_base != NULL) { - http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_C2S_ZIP_BYTES, raw_body.iov_len); + http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_C2S_ZIP_BYTES, raw_body->iov_len); http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_C2S_UNZIP_BYTES, decompress_body.iov_len); } } @@ -199,18 +200,6 @@ static void http_event_handler(enum http_event event, struct http_decoder_half_d http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_TRANSACTION_FREE, 1); http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_C2S_ASYMMETRY_TRANSACTION, 1); } - if (httpd_is_tunnel_session(httpd_env, exdata)) - { - if (SESSION_SEEN_C2S_FLOW == flow_flag) - { - exdata->tunnel_state = HTTP_TUN_INNER_STARTING; - exdata->pub_topic_id = httpd_env->topic_exdata_compose[HTTPD_TOPIC_HTTP_TUNNEL_INDEX].sub_topic_id; - } - else - { - exdata->tunnel_state = HTTP_TUN_C2S_END; - } - } http_half_update_state(half_data, event); http_decoder_result_queue_inc_req_index(queue); half_data = http_decoder_result_queue_pop_req(queue); @@ -237,11 +226,10 @@ static void http_event_handler(enum http_event event, struct http_decoder_half_d half_data = NULL; } - half_data = http_decoder_half_data_new(mempool); + half_data = http_decoder_half_data_new(mempool, FLOW_TYPE_S2C); ret = http_decoder_result_queue_push_res(queue, half_data); if (ret < 0) { - fprintf(stderr, "http_decoder_result_queue_push res failed."); http_decoder_half_data_free(mempool, half_data); half_data = NULL; } @@ -251,50 +239,24 @@ static void http_event_handler(enum http_event event, struct http_decoder_half_d { if (SESSION_SEEN_S2C_FLOW == flow_flag) { + http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_TRANSACTION_NEW, 1); msg = http_message_new(HTTP_TRANSACTION_START, queue, queue_idx, HTTP_RESPONSE); session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); } } break; - case HTTP_EVENT_RES_LINE: - msg = http_message_new(HTTP_MESSAGE_RES_LINE, queue, queue_idx, HTTP_RESPONSE); - session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); - if (httpd_tunnel_identify(httpd_env, FLOW_TYPE_S2C, half_data)) - { - exdata->tunnel_state = HTTP_TUN_S2C_START; - } - else - { - // connect response fail, reset tunnel_state - exdata->tunnel_state = HTTP_TUN_NON; - } - break; - case HTTP_EVENT_RES_HDR: - msg = http_message_new(HTTP_MESSAGE_RES_HEADER, queue, queue_idx, HTTP_RESPONSE); - session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); - break; + case HTTP_EVENT_RES_HDR_END: { + http_parse_headers_finally(ev_ctx, half_data); /* maybe some header in table buffer but has not pushed to plugins */ half_data = http_decoder_result_queue_peek_res(queue); - if (http_decoder_half_data_has_parsed_header(half_data)) { - msg = http_message_new(HTTP_MESSAGE_RES_HEADER, queue, queue_idx, HTTP_RESPONSE); + msg = http_message_new(HTTP_MESSAGE_RES_LINE_HEADERS, queue, queue_idx, HTTP_RESPONSE); session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); } - http_half_data_update_commit_index(half_data); - msg = http_message_new(HTTP_MESSAGE_RES_HEADER_END, queue, queue_idx, HTTP_RESPONSE); - session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); - - int tot_s2c_headers = http_half_data_get_total_parsed_header_count(half_data); + int tot_s2c_headers = http_half_get_header_count(half_data); http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_S2C_HEADERS, tot_s2c_headers); - - if (httpd_is_tunnel_session(httpd_env, exdata)) - { - exdata->tunnel_state = HTTP_TUN_INNER_STARTING; - http_half_pre_context_free(ev_ctx->ref_session, exdata); - exdata->pub_topic_id = httpd_env->topic_exdata_compose[HTTPD_TOPIC_HTTP_TUNNEL_INDEX].sub_topic_id; - } } break; case HTTP_EVENT_RES_BODY_BEGIN: @@ -303,15 +265,14 @@ static void http_event_handler(enum http_event event, struct http_decoder_half_d break; case HTTP_EVENT_RES_BODY_DATA: { - hstring raw_body = {}; - http_decoder_half_data_get_raw_body(half_data, (const char **)&raw_body.iov_base, &raw_body.iov_len); + hstring *raw_body = http_half_get_raw_body(half_data); hstring decompress_body = {}; http_half_get_lastest_decompress_buffer(half_data, &decompress_body); - msg = http_body_message_new(HTTP_MESSAGE_RES_BODY, queue, queue_idx, HTTP_RESPONSE, &raw_body, &decompress_body); + msg = http_body_message_new(HTTP_MESSAGE_RES_BODY, queue, queue_idx, HTTP_RESPONSE, raw_body, &decompress_body); session_mq_publish_message(ev_ctx->ref_session, exdata->pub_topic_id, msg); if (decompress_body.iov_base != NULL) { - http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_S2C_ZIP_BYTES, raw_body.iov_len); + http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_S2C_ZIP_BYTES, raw_body->iov_len); http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_S2C_UNZIP_BYTES, decompress_body.iov_len); } } @@ -414,23 +375,6 @@ static void http_decoder_exdata_free(struct http_decoder_exdata *ex_data) FREE(ex_data); } -static int http_protocol_identify(const char *data, size_t data_len) -{ - llhttp_t parser; - llhttp_settings_t settings; - enum llhttp_errno error; - - llhttp_settings_init(&settings); - llhttp_init(&parser, HTTP_BOTH, &settings); - - error = llhttp_execute(&parser, data, data_len); - if (error != HPE_OK) - { - return -1; - } - return 1; -} - static void _http_decoder_context_free(struct http_decoder_env *env) { if (NULL == env) @@ -457,8 +401,7 @@ static int load_http_decoder_config(const char *cfg_path, FILE *fp = fopen(cfg_path, "r"); if (NULL == fp) { - fprintf(stderr, "[%s:%d]Can't open config file:%s", - __FUNCTION__, __LINE__, cfg_path); + fprintf(stderr, "[%s]Can't open config file:%s", __FUNCTION__, cfg_path); return -1; } @@ -471,8 +414,7 @@ static int load_http_decoder_config(const char *cfg_path, toml_table_t *basic_sec_tbl = toml_table_in(root, "basic"); if (NULL == basic_sec_tbl) { - fprintf(stderr, "[%s:%d]config file:%s has no key: [basic]", - __FUNCTION__, __LINE__, cfg_path); + fprintf(stderr, "[%s]config file:%s has no key: [basic]", __FUNCTION__, cfg_path); toml_free(root); return -1; } @@ -523,89 +465,18 @@ static int load_http_decoder_config(const char *cfg_path, hd_cfg->stat_output_interval = DEFAULT_STAT_OUTPUT_INTERVAL; } - int_val = toml_int_in(basic_sec_tbl, "proxy_enable"); - if (int_val.ok != 0) - { - hd_cfg->proxy_enable = int_val.u.i; - } - else - { - hd_cfg->proxy_enable = 0; - } - toml_free(root); return ret; } -static int http_msg_get_request_header(const struct http_message *msg, const char *name, size_t name_len, - struct http_header_field *hdr_result) -{ - const struct http_decoder_half_data *req_data = - msg->ref_queue->array[msg->queue_index].req_data; - return http_decoder_half_data_get_header(req_data, name, name_len, hdr_result); -} - -static int http_msg_get_response_header(const struct http_message *msg, const char *name, size_t name_len, - struct http_header_field *hdr_result) -{ - const struct http_decoder_half_data *res_data = - msg->ref_queue->array[msg->queue_index].res_data; - return http_decoder_half_data_get_header(res_data, name, name_len, hdr_result); -} - -static int http_msg_request_header_next(const struct http_message *msg, - struct http_header_field *hdr) -{ - const struct http_decoder_half_data *req_data = - msg->ref_queue->array[msg->queue_index].req_data; - return http_decoder_half_data_iter_header((struct http_decoder_half_data *)req_data, hdr); -} - -static int http_msg_response_header_next(const struct http_message *msg, struct http_header_field *hdr) -{ - const struct http_decoder_half_data *res_data = - msg->ref_queue->array[msg->queue_index].res_data; - return http_decoder_half_data_iter_header((struct http_decoder_half_data *)res_data, hdr); -} - -#if 0 -static int http_msg_get_request_raw_body(const struct http_message *msg, hstring *body) -{ - const struct http_decoder_half_data *req_data = - msg->ref_queue->array[msg->queue_index].req_data; - return http_decoder_half_data_get_raw_body(req_data, body); -} - -static int http_msg_get_response_raw_body(const struct http_message *msg, hstring *body) -{ - const struct http_decoder_half_data *res_data = - msg->ref_queue->array[msg->queue_index].res_data; - return http_decoder_half_data_get_raw_body(res_data, body); -} - -static int http_msg_get_request_decompress_body(const struct http_message *msg, hstring *body) -{ - const struct http_decoder_half_data *req_data = - msg->ref_queue->array[msg->queue_index].req_data; - return http_decoder_half_data_get_decompress_body(req_data, body); -} - -static int http_msg_get_response_decompress_body(const struct http_message *msg, hstring *body) -{ - const struct http_decoder_half_data *res_data = - msg->ref_queue->array[msg->queue_index].res_data; - return http_decoder_half_data_get_decompress_body(res_data, body); -} -#endif - -static struct http_decoder_exdata *httpd_session_exdata_new(struct session *sess, struct http_decoder_env *httpd_env, +static struct http_decoder_exdata *httpd_session_exdata_new(struct http_decoder_env *httpd_env, long long req_start_seq, long long res_start_seq) { struct http_decoder_exdata *exdata = http_decoder_exdata_new(httpd_env->hd_cfg.mempool_size, httpd_env->hd_cfg.result_queue_len, httpd_env->hd_cfg.decompress_switch, httpd_env, req_start_seq, res_start_seq); - // exdata->sub_topic_id = sub_topic_id; + exdata->httpd_env = httpd_env; int thread_id = stellar_get_current_thread_index(); http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_SESSION_NEW, 1); return exdata; @@ -615,36 +486,17 @@ static struct http_decoder_exdata *httpd_session_exdata_new(struct session *sess extern "C" { #endif - - void httpd_ex_data_free_cb(int idx, void *ex_data, void *arg) + void httpd_ex_data_free_cb(UNUSED int idx, void *ex_data, UNUSED void *arg) { if (NULL == ex_data) { return; } struct http_decoder_exdata *exdata = (struct http_decoder_exdata *)ex_data; - http_decoder_exdata_free(exdata); - } - - void *httpd_session_ctx_new_cb(struct session *sess, void *plugin_env) - { - return (void *)HTTP_CTX_IS_HTTP; - } - - void httpd_session_ctx_free_cb(struct session *sess, void *session_ctx, void *plugin_env) - { - if (NULL == plugin_env || NULL == session_ctx) - { - return; - } - if (strncmp((const char *)session_ctx, HTTP_CTX_NOT_HTTP, strlen(HTTP_CTX_NOT_HTTP)) == 0) - { - return; - } - struct http_decoder_env *httpd_env = (struct http_decoder_env *)plugin_env; + struct http_decoder_env *httpd_env = exdata->httpd_env; int thread_id = stellar_get_current_thread_index(); unsigned char flow_flag = 0; - session_is_symmetric(sess, &flow_flag); + session_is_symmetric(exdata->sess, &flow_flag); if (SESSION_SEEN_C2S_FLOW == flow_flag) { @@ -655,17 +507,12 @@ extern "C" http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_S2C_ASYMMETRY_SESSION, 1); } http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_SESSION_FREE, 1); + + http_decoder_exdata_free(exdata); } static void http_decoder_execute(struct session *sess, struct http_decoder_env *httpd_env, struct http_decoder_exdata *exdata, const char *payload, uint16_t payload_len) { - if (httpd_in_tunnel_transmitting(httpd_env, exdata)) - { - http_decoder_push_tunnel_data(sess, exdata, httpd_tunnel_state_to_msg(exdata), payload, payload_len); - httpd_tunnel_state_update(exdata); - return; - } - int thread_id = stellar_get_current_thread_index(); struct http_decoder_half *cur_half = NULL; enum flow_type sess_dir = session_get_flow_type(sess); @@ -683,97 +530,16 @@ extern "C" } http_decoder_half_reinit(cur_half, exdata->queue, exdata->mempool, sess); - int ret = http_decoder_half_parse(httpd_env->hd_cfg.proxy_enable, cur_half, payload, payload_len); + int ret = http_decoder_half_stage_shaping(cur_half, payload, payload_len); if (ret < 0) { http_decoder_stat_update(&httpd_env->hd_stat, thread_id, HTTP_STAT_PARSE_ERR, 1); stellar_session_plugin_dettach_current_session(sess); - } - } - - void http_decoder_tunnel_msg_cb(struct session *sess, int topic_id, const void *tmsg, void *per_session_ctx, void *plugin_env) - { - struct http_decoder_env *httpd_env = (struct http_decoder_env *)plugin_env; - if (0 == httpd_env->hd_cfg.proxy_enable) - { - return; - } - hstring tunnel_payload; - http_tunnel_message_get_payload((const struct http_tunnel_message *)tmsg, &tunnel_payload); - uint16_t payload_len = tunnel_payload.iov_len; - const char *payload = (char *)tunnel_payload.iov_base; - if (NULL == payload || 0 == payload_len) - { - return; - } - - struct http_decoder_exdata *exdata = (struct http_decoder_exdata *)session_exdata_get(sess, httpd_env->topic_exdata_compose[HTTPD_TOPIC_HTTP_TUNNEL_INDEX].exdata_id); - enum http_tunnel_message_type tmsg_type = http_tunnel_message_type_get((const struct http_tunnel_message *)tmsg); - - switch (tmsg_type) - { - case HTTP_TUNNEL_OPENING: - { - if (NULL != exdata) - { - // not support nested http tunnel - session_mq_ignore_message(sess, topic_id, httpd_env->plugin_id); - return; - } - size_t http_identify_len = payload_len > HTTP_IDENTIFY_LEN ? HTTP_IDENTIFY_LEN : payload_len; - int is_http = http_protocol_identify(payload, http_identify_len); - if (is_http) - { - long long max_req_seq = 0, max_res_seq = 0; - struct http_decoder_exdata *tcp_stream_exdata = (struct http_decoder_exdata *)session_exdata_get(sess, httpd_env->topic_exdata_compose[HTTPD_TOPIC_TCP_STREAM_INDEX].exdata_id); - http_half_get_max_transaction_seq(tcp_stream_exdata, &max_req_seq, &max_res_seq); - exdata = httpd_session_exdata_new(sess, httpd_env, max_req_seq, max_res_seq); - session_exdata_set(sess, httpd_env->topic_exdata_compose[HTTPD_TOPIC_HTTP_TUNNEL_INDEX].exdata_id, exdata); - exdata->pub_topic_id = httpd_env->topic_exdata_compose[HTTPD_TOPIC_HTTP_MSG_INDEX].sub_topic_id; - exdata->in_tunnel_is_http = 1; - } - else - { - // inner tunnel is not http, do nothing, do not push this message again !!! - session_mq_ignore_message(sess, topic_id, httpd_env->plugin_id); - return; - } - } - break; - - case HTTP_TUNNEL_ACTIVE: - if (NULL == exdata) - { - session_mq_ignore_message(sess, topic_id, httpd_env->plugin_id); - http_decoder_stat_update(&httpd_env->hd_stat, stellar_get_current_thread_index(), HTTP_STAT_PARSE_ERR, 1); - return; - } - break; - - case HTTP_TUNNEL_CLOSING: - if (NULL == exdata) - { - http_decoder_stat_update(&httpd_env->hd_stat, stellar_get_current_thread_index(), HTTP_STAT_PARSE_ERR, 1); - return; - } - if (exdata->in_tunnel_is_http) - { - http_half_pre_context_free(sess, exdata); - } return; - break; - - default: - break; } - if (exdata->in_tunnel_is_http) - { - http_decoder_execute(sess, httpd_env, exdata, payload, payload_len); - } - return; } - void http_decoder_tcp_stream_msg_cb(struct session *sess, int topic_id, const void *msg, void *nouse_session_ctx, void *plugin_env) + void http_decoder_tcp_stream_msg_cb(struct session *sess, UNUSED int topic_id, const void *msg, UNUSED void *nouse_session_ctx, void *plugin_env) { struct http_decoder_env *httpd_env = (struct http_decoder_env *)plugin_env; struct http_decoder_exdata *exdata = (struct http_decoder_exdata *)session_exdata_get(sess, httpd_env->topic_exdata_compose[HTTPD_TOPIC_TCP_STREAM_INDEX].exdata_id); @@ -783,14 +549,7 @@ extern "C" if (SESSION_STATE_CLOSED == sess_state) { - if (httpd_in_tunnel_transmitting(httpd_env, exdata)) - { - http_decoder_push_tunnel_data(sess, exdata, HTTP_TUNNEL_CLOSING, NULL, 0); - } - else - { - http_half_pre_context_free(sess, exdata); - } + http_half_pre_context_free(sess, exdata); return; } assert(msg != NULL); @@ -810,7 +569,8 @@ extern "C" stellar_session_plugin_dettach_current_session(sess); return; } - exdata = httpd_session_exdata_new(sess, httpd_env, 0, 0); + exdata = httpd_session_exdata_new(httpd_env, 0, 0); + exdata->sess = sess; exdata->pub_topic_id = httpd_env->topic_exdata_compose[HTTPD_TOPIC_HTTP_MSG_INDEX].sub_topic_id; session_exdata_set(sess, httpd_env->topic_exdata_compose[HTTPD_TOPIC_TCP_STREAM_INDEX].exdata_id, exdata); } @@ -818,17 +578,16 @@ extern "C" return; } - static const struct http_topic_exdata_compose g_topic_exdata_compose[HTTPD_TOPIC_INDEX_MAX] = + static const struct http_topic_exdata_compose g_topic_exdata_compose[] = { {HTTPD_TOPIC_TCP_STREAM_INDEX, TOPIC_TCP_STREAM, http_decoder_tcp_stream_msg_cb, NULL, "HTTP_DECODER_EXDATA_BASEON_TCP_STREAM", httpd_ex_data_free_cb, -1, -1}, {HTTPD_TOPIC_HTTP_MSG_INDEX, HTTP_TOPIC, NULL, http_message_free, NULL, NULL, -1, -1}, - {HTTPD_TOPIC_HTTP_TUNNEL_INDEX, HTTP_DECODER_TUNNEL_TOPIC, http_decoder_tunnel_msg_cb, http_message_free, "HTTP_DECODER_EXDATA_BASEON_HTTP_TUNNEL", httpd_ex_data_free_cb, -1, -1}, }; static void http_decoder_topic_exdata_compose_init(struct http_decoder_env *httpd_env) { memcpy(httpd_env->topic_exdata_compose, g_topic_exdata_compose, sizeof(g_topic_exdata_compose)); - for (int i = 0; i < HTTPD_TOPIC_INDEX_MAX; i++) + for (size_t i = 0; i < sizeof(g_topic_exdata_compose) / sizeof(struct http_topic_exdata_compose); i++) { httpd_env->topic_exdata_compose[i].sub_topic_id = stellar_session_mq_get_topic_id_reliable(httpd_env->st, httpd_env->topic_exdata_compose[i].topic_name, @@ -877,8 +636,7 @@ extern "C" goto failed; } httpd_env->st = st; - httpd_env->plugin_id = stellar_session_plugin_register(st, httpd_session_ctx_new_cb, - httpd_session_ctx_free_cb, (void *)httpd_env); + httpd_env->plugin_id = stellar_session_plugin_register(st, NULL, NULL, (void *)httpd_env); if (httpd_env->plugin_id < 0) { goto failed; @@ -920,132 +678,83 @@ extern "C" return msg->type; } - void http_message_get0_request_line(const struct http_message *msg, - struct http_request_line *line) + const struct http_request_line *http_message_get0_request_line(const struct http_message *msg) { - if (unlikely(NULL == msg || msg->type != HTTP_MESSAGE_REQ_LINE)) + if (unlikely(NULL == msg || (msg->type != HTTP_MESSAGE_REQ_LINE_HEADERS))) { - if (line) - { - line->method = NULL; - line->uri = NULL; - line->version = NULL; - } - return; + return NULL; } assert(msg->ref_queue); assert(msg->queue_index < HD_RESULT_QUEUE_LEN); - struct http_decoder_half_data *req_data = - msg->ref_queue->array[msg->queue_index].req_data; + struct http_decoder_half_data *req_data = msg->ref_queue->array[msg->queue_index].req_data; - http_decoder_half_data_get_request_line(req_data, line); + return http_decoder_half_data_get_request_line(req_data); } - void http_message_get0_response_line(const struct http_message *msg, - struct http_response_line *line) + const struct http_response_line *http_message_get0_response_line(const struct http_message *msg) { - if (unlikely(NULL == msg || msg->type != HTTP_MESSAGE_RES_LINE)) + if (unlikely(NULL == msg || (msg->type != HTTP_MESSAGE_RES_LINE_HEADERS))) { - if (line) - { - line->version = NULL; - line->status = NULL; - } - return; + return NULL; } assert(msg->ref_queue); assert(msg->queue_index < HD_RESULT_QUEUE_LEN); - struct http_decoder_half_data *res_data = - msg->ref_queue->array[msg->queue_index].res_data; - - http_decoder_half_data_get_response_line(res_data, line); + struct http_decoder_half_data *res_data = msg->ref_queue->array[msg->queue_index].res_data; + return http_decoder_half_data_get_response_line(res_data); } - void http_message_get0_header(const struct http_message *msg, const char *name, size_t name_len, - struct http_header_field *hdr_result) + const struct http_header_field *http_message_get0_header(const struct http_message *msg, const char *field_name, size_t field_name_len) { - int ret = -1; - if (unlikely(NULL == msg || NULL == name || 0 == name_len)) + if (unlikely(NULL == msg || NULL == field_name || 0 == field_name_len)) { - goto fail; + return NULL; } assert(msg->ref_queue); assert(msg->queue_index < HD_RESULT_QUEUE_LEN); - if (HTTP_MESSAGE_REQ_HEADER == msg->type) - { - ret = http_msg_get_request_header(msg, name, name_len, hdr_result); - } - else if (HTTP_MESSAGE_RES_HEADER == msg->type) + const struct http_decoder_half_data *half_data = NULL; + const struct http_header_field *expect_header = NULL; + if (HTTP_MESSAGE_REQ_LINE_HEADERS == msg->type) { - ret = http_msg_get_response_header(msg, name, name_len, hdr_result); + half_data = msg->ref_queue->array[msg->queue_index].req_data; + expect_header = http_half_get_header_field(half_data, field_name, field_name_len); } - if (ret >= 0) - { - return; - } - fail: - if (hdr_result) + else if (HTTP_MESSAGE_RES_LINE_HEADERS == msg->type) { - hdr_result->name = NULL; - hdr_result->value = NULL; + half_data = msg->ref_queue->array[msg->queue_index].res_data; + expect_header = http_half_get_header_field(half_data, field_name, field_name_len); } - return; - } - int http_message_get0_next_header(const struct http_message *msg, struct http_header_field *header) - { - int ret = 1; - if (unlikely(NULL == msg)) - { - goto fail; - } - assert(msg->ref_queue); - assert(msg->queue_index < HD_RESULT_QUEUE_LEN); - if (HTTP_MESSAGE_REQ_HEADER == msg->type) - { - ret = http_msg_request_header_next(msg, header); - } - else if (HTTP_MESSAGE_RES_HEADER == msg->type) - { - ret = http_msg_response_header_next(msg, header); - } - if (ret < 0) - { - goto fail; - } - return 0; - fail: - if (header) - { - header->name = NULL; - header->value = NULL; - } - return -1; + return expect_header; } - int http_message_reset_header_iter(struct http_message *msg) + const struct http_header_field *http_message_get0_next_header(const struct http_message *msg, const struct http_header_field *cur_header) + // int http_message_get0_next_header(const struct http_message *msg, struct http_header_field *header) { if (unlikely(NULL == msg)) { - return -1; + return NULL; } assert(msg->ref_queue); assert(msg->queue_index < HD_RESULT_QUEUE_LEN); - if (HTTP_MESSAGE_REQ_HEADER == msg->type) + const struct http_decoder_half_data *half_data = NULL; + const struct http_header_field *next_header = NULL; + + if (HTTP_MESSAGE_REQ_LINE_HEADERS == msg->type) { - struct http_decoder_half_data *req_data = - msg->ref_queue->array[msg->queue_index].req_data; - return http_decoder_half_data_reset_header_iter(req_data); + half_data = msg->ref_queue->array[msg->queue_index].req_data; + // ret = http_msg_request_header_next(msg, header); + next_header = http_half_get_next_header_field(half_data, cur_header); } - else if (HTTP_MESSAGE_RES_HEADER == msg->type) + else if (HTTP_MESSAGE_RES_LINE_HEADERS == msg->type) { - struct http_decoder_half_data *res_data = - msg->ref_queue->array[msg->queue_index].res_data; - return http_decoder_half_data_reset_header_iter(res_data); + half_data = msg->ref_queue->array[msg->queue_index].res_data; + next_header = http_half_get_next_header_field(half_data, cur_header); + // ret = http_msg_response_header_next(msg, header); } - return -1; + + return next_header; } void http_message_get0_uncompressed_body(const struct http_message *msg, const char **body_ptr, size_t *body_len) @@ -1073,8 +782,6 @@ extern "C" void http_message_get0_decompressed_body(const struct http_message *msg, const char **dec_body_ptr, size_t *dec_body_len) { - enum http_content_encoding ecode = HTTP_CONTENT_ENCODING_NONE; - struct http_decoder_half_data *ref_data = NULL; if (unlikely(NULL == msg)) { goto fail; @@ -1087,31 +794,7 @@ extern "C" *dec_body_len = msg->decompress_payload.iov_len; return; } - /** - * @brief If the body hasn't been compressed, same as http_message_get0_uncompressed_body(). - * - */ - - if (HTTP_MESSAGE_REQ_BODY_START == msg->type || HTTP_MESSAGE_REQ_BODY == msg->type || HTTP_MESSAGE_REQ_BODY_END == msg->type) - { - ref_data = msg->ref_queue->array[msg->queue_index].req_data; - } - else if (HTTP_MESSAGE_RES_BODY_START == msg->type || HTTP_MESSAGE_RES_BODY == msg->type || HTTP_MESSAGE_RES_BODY_END == msg->type) - { - ref_data = msg->ref_queue->array[msg->queue_index].res_data; - } - ecode = http_half_data_get_content_encoding(ref_data); - if (ref_data != NULL && HTTP_CONTENT_ENCODING_NONE != ecode) - { - goto fail; - } - if (msg->raw_payload.iov_base != NULL && msg->raw_payload.iov_len != 0) - { - *dec_body_ptr = msg->raw_payload.iov_base; - *dec_body_len = msg->raw_payload.iov_len; - } - return; fail: if (dec_body_ptr) { @@ -1147,39 +830,7 @@ extern "C" } return; } -#if 0 - void http_message_decoded_url_get0(const struct http_message *msg, struct iovec *url) - { - if (unlikely(NULL == msg)) - { - if (url) - { - url->iov_base = NULL; - url->iov_len = 0; - } - return; - } - assert(msg->ref_queue); - assert(msg->queue_index < HD_RESULT_QUEUE_LEN); - - struct http_decoder_half_data *req_data = - msg->ref_queue->array[msg->queue_index].req_data; - - if (http_half_data_get_decode_url(req_data, url) < 0) - { - goto fail; - } - return; - fail: - if (url) - { - url->iov_base = NULL; - url->iov_len = 0; - } - return; - } -#endif int http_message_get_transaction_seq(const struct http_message *msg) { if (unlikely(NULL == msg)) diff --git a/decoders/http/http_decoder_half.c b/decoders/http/http_decoder_half.c index 70991c6..cd998fe 100644 --- a/decoders/http/http_decoder_half.c +++ b/decoders/http/http_decoder_half.c @@ -1,9 +1,11 @@ +#include "http_decoder_half.h" #include #include #include #include #include "http_decoder_private.h" #include "llhttp.h" +#include "stellar/session.h" #include "uthash/utlist.h" struct http_decompress_buffer @@ -13,30 +15,53 @@ struct http_decompress_buffer struct http_decompress_buffer *next, *prev; }; -struct http_decoder_half_data +struct http_header_field_inner { - struct http_decoder_table *table; + struct http_header_field field; + struct http_header_field_inner *next, *prev; +}; - int major_version; - int minor_version; - int status_code; +struct http_request_line_inner +{ + struct http_request_line req_line; +}; - enum http_event state; +struct http_response_line_inner +{ + struct http_response_line res_line; +}; +struct http_decoder_half_data +{ + enum flow_type flow_dir; + enum http_event state; enum http_content_encoding content_encoding; struct http_content_decompress *decompress; -#if 0 - char *ref_decompress_body; - size_t decompress_body_len; -#else + int transfer_encoding_is_chunked; // -1: not set, 0: false, 1: true + long long content_length; // -1: not set; >=0: remain length + hstring raw_body; struct http_decompress_buffer *decompress_buffer_list; -#endif - int joint_url_complete; - int url_is_encoded; // http://[:]/? hstring joint_url; - hstring decoded_url; long long transaction_index; + union + { + struct http_request_line_inner req_line_inner; + struct http_response_line_inner res_line_inner; + }; + struct http_header_field_inner *filed_list; + struct http_buffer *ref_headers_cache; /* take the ownership when headers completed, free in http_message_free() */ + const char *ref_headers_start; + const char *ref_headers_end; +}; + +struct http_flow_stage +{ + enum http_stage stage; + long long remain_content_length; + const char *headers_start; + const char *headers_end; + struct http_buffer *headers_cache; /* ownership move to struct http_decoder_half_data when headers completed */ }; struct http_decoder_half @@ -46,40 +71,77 @@ struct http_decoder_half enum llhttp_errno error; int decompress_switch; struct http_decoder_env *httpd_env; - - // uint8_t is_request_flow; enum http_event event; http_event_cb *http_ev_cb; struct http_event_context *http_ev_ctx; - - struct http_decoder_half_data *ref_data; - + struct http_decoder_half_data *ref_data; /* pointer to current half_data on_message_begin */ long long trans_counter; long long err_counter; long long transaction_seq; // accumulated - const char *data; - int data_len; + size_t data_len; + struct http_flow_stage stage_shaper; }; -// #define HTTP_DECODER_DEBUG -#ifdef HTTP_DECODER_DEBUG -static void printf_debug_info(const char *desc, const char *at, size_t length) +hstring *http_half_get_raw_body(struct http_decoder_half_data *data) +{ + return &data->raw_body; +} + +void http_half_headers_ref_free(struct http_decoder_half_data *half_data) { - if (at) + struct http_header_field_inner *el, *tmp; + DL_FOREACH_SAFE(half_data->filed_list, el, tmp) { - char *temp = http_safe_dup(at, length); - printf("HTTP PARSER STAGE: %s: %s\n", desc, temp); - FREE(temp); + DL_DELETE(half_data->filed_list, el); + FREE(el); } - else + half_data->filed_list = NULL; +} + +static void http_half_append_header_filed(struct http_decoder_half_data *half_data, const char *at, size_t length) +{ + struct http_header_field_inner *inner_field = CALLOC(struct http_header_field_inner, 1); + assert(inner_field); + inner_field->field.name = at; + inner_field->field.name_len = length; + DL_APPEND(half_data->filed_list, inner_field); +} + +static void http_half_append_header_value(struct http_decoder_half_data *half_data, const char *at, size_t length) +{ + struct http_header_field_inner *inner_field = half_data->filed_list->prev; + assert(inner_field); + inner_field->field.value = at; + inner_field->field.value_len = length; +} + +const struct http_header_field *http_half_get_next_header_field(const struct http_decoder_half_data *half_data, const struct http_header_field *current_header) +{ + if (NULL == current_header) + { // first time + return &half_data->filed_list->field; + } + const struct http_header_field_inner *inner_fidld = container_of(current_header, struct http_header_field_inner, field); + if (inner_fidld->next == half_data->filed_list) + { // the last item + return NULL; + } + return &inner_fidld->next->field; +} + +const struct http_header_field *http_half_get_header_field(const struct http_decoder_half_data *half_data, const char *field_name, size_t field_name_len) +{ + struct http_header_field_inner *el; + DL_FOREACH(half_data->filed_list, el) { - printf("HTTP PARSER STAGE: %s\n", desc); + if (http_strncasecmp_safe(el->field.name, field_name, el->field.name_len, field_name_len) == 0) + { + return &el->field; + } } + return NULL; } -#else -#define printf_debug_info(desc, at, length) -#endif void http_half_decompress_buffer_free(struct http_decoder_half_data *data, hstring *decompress_body) { @@ -125,19 +187,15 @@ void http_half_get_lastest_decompress_buffer(struct http_decoder_half_data *data static void http_decoder_half_data_decompress(struct http_decoder_half_data *data) { assert(data); - if (data->content_encoding == HTTP_CONTENT_ENCODING_NONE) { return; } - - hstring raw_body = {}; - http_decoder_table_get_body(data->table, (char **)&raw_body.iov_base, &raw_body.iov_len); - if (raw_body.iov_base == NULL || raw_body.iov_len == 0) + hstring *raw_body = &data->raw_body; + if (raw_body->iov_base == NULL || raw_body->iov_len == 0) { return; } - if (NULL == data->decompress) { data->decompress = http_content_decompress_create(data->content_encoding); @@ -146,12 +204,9 @@ static void http_decoder_half_data_decompress(struct http_decoder_half_data *dat assert(data->decompress); char *local_outdata = NULL; size_t local_outdata_len = 0; - if (http_content_decompress_write(data->decompress, (char *)raw_body.iov_base, - raw_body.iov_len, - &local_outdata, - &local_outdata_len) == -1) + if (http_content_decompress_write(data->decompress, (char *)raw_body->iov_base, + raw_body->iov_len, &local_outdata, &local_outdata_len) == -1) { - // log error http_content_decompress_destroy(data->decompress); data->decompress = NULL; return; @@ -171,8 +226,6 @@ static void http_decoder_half_data_decompress(struct http_decoder_half_data *dat /* Possible return values 0, -1, `HPE_PAUSED` */ static int on_message_begin(llhttp_t *http) { - printf_debug_info("on_message_begin", NULL, 0); - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); @@ -186,19 +239,19 @@ static int on_message_begin(llhttp_t *http) } half->ref_data = NULL; - assert(half->http_ev_cb != NULL); half->http_ev_cb(half->event, &half->ref_data, half->http_ev_ctx, half->httpd_env); // http_event_handler() half->trans_counter++; half->ref_data->transaction_index = half->transaction_seq++; + + half->ref_data->ref_headers_cache = half->stage_shaper.headers_cache; + half->stage_shaper.headers_cache = NULL; return 0; } static int on_message_complete(llhttp_t *http) { - printf_debug_info("on_message_complete", NULL, 0); - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); @@ -231,261 +284,122 @@ static int on_message_complete(llhttp_t *http) half->http_ev_cb(half->event, &half->ref_data, half->http_ev_ctx, half->httpd_env); } + half->event = __HTTP_EVENT_RESERVED; + half->stage_shaper.stage = HTTP_STAGE_INIT; return 0; } -static int on_reset(llhttp_t *http __attribute__((unused))) -{ - printf_debug_info("on_reset", NULL, 0); - - return 0; -} - -static inline int is_line_crlf(struct http_decoder_half *half) +static int on_method(llhttp_t *http, const char *at, size_t length) { - const char *chr_r = (char *)memrchr(half->data, '\r', half->data_len); - const char *chr_n = (char *)memrchr(half->data, '\n', half->data_len); - if (chr_r && chr_n && (chr_r + 1 == chr_n)) + if (0 == length) { - return 1; + return 0; } - return 0; -} - -static int on_method(llhttp_t *http, const char *at, size_t length) -{ - printf_debug_info("on_method", at, length); - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); - - http_decoder_table_refer(half->ref_data->table, HTTP_ITEM_METHOD, at, length); - return 0; -} - -/* Information-only callbacks, return value is ignored */ -static int on_method_complete(llhttp_t *http) -{ - printf_debug_info("on_method_complete", NULL, 0); - - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); - assert(half); - - if (is_line_crlf(half) == 0) - { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_METHOD); - } - - http_decoder_table_commit(half->ref_data->table, HTTP_ITEM_METHOD); - + half->ref_data->req_line_inner.req_line.method = (char *)at; + half->ref_data->req_line_inner.req_line.method_len = length; return 0; } /* Possible return values 0, -1, HPE_USER */ static int on_uri(llhttp_t *http, const char *at, size_t length) { - printf_debug_info("on_uri", at, length); - - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); - assert(half); - - http_decoder_table_refer(half->ref_data->table, HTTP_ITEM_URI, at, length); - return 0; -} - -static void http_decoder_cached_portion_url(struct http_decoder_half *half, const hstring *uri_result) -{ - struct http_decoder_half_data *ref_data = half->ref_data; - int uri_skip_len = 0; - - if ((uri_result->iov_len) > 7 && (strncasecmp("http://", (char *)uri_result->iov_base, 7) == 0)) // absolute URI - { - uri_skip_len = strlen("http://"); - ref_data->joint_url_complete = 1; - } - else + if (0 == length) { - ref_data->joint_url_complete = 0; + return 0; } - - ref_data->joint_url.iov_len = uri_result->iov_len - uri_skip_len; - ref_data->joint_url.iov_base = MEMPOOL_CALLOC(half->http_ev_ctx->ref_mempool, char, ref_data->joint_url.iov_len); - memcpy(ref_data->joint_url.iov_base, (char *)uri_result->iov_base + uri_skip_len, ref_data->joint_url.iov_len); -} - -/* Information-only callbacks, return value is ignored */ -static int on_uri_complete(llhttp_t *http) -{ - printf_debug_info("on_uri_complete", NULL, 0); - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); - if (is_line_crlf(half) == 0) - { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_URI); - } - - http_decoder_table_commit(half->ref_data->table, HTTP_ITEM_URI); - - hstring uri_result = {}; - http_decoder_table_get_uri(half->ref_data->table, (char **)&uri_result.iov_base, &uri_result.iov_len); - assert(uri_result.iov_base); - http_decoder_cached_portion_url(half, &uri_result); - + half->ref_data->req_line_inner.req_line.uri = (char *)at; + half->ref_data->req_line_inner.req_line.uri_len = length; return 0; } /* Possible return values 0, -1, HPE_USER */ static int on_version(llhttp_t *http, const char *at, size_t length) { - printf_debug_info("on_version", at, length); - + if (0 == length) + { + return 0; + } struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); - - http_decoder_table_refer(half->ref_data->table, HTTP_ITEM_VERSION, at, length); + if (half->parser.type == HTTP_REQUEST) + { + half->ref_data->req_line_inner.req_line.version = (char *)at; + half->ref_data->req_line_inner.req_line.version_len = length; + } + else + { + half->ref_data->res_line_inner.res_line.version = (char *)at; + half->ref_data->res_line_inner.res_line.version_len = length; + } return 0; } /* Information-only callbacks, return value is ignored */ static int on_version_complete(llhttp_t *http) { - printf_debug_info("on_version_complete", NULL, 0); - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); - if (is_line_crlf(half) == 0) + if (half->parser.type == HTTP_REQUEST) { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_VERSION); + half->ref_data->req_line_inner.req_line.major_version = llhttp_get_http_major(&half->parser); + half->ref_data->req_line_inner.req_line.minor_version = llhttp_get_http_minor(&half->parser); } - - http_decoder_table_commit(half->ref_data->table, HTTP_ITEM_VERSION); - - half->ref_data->major_version = llhttp_get_http_major(&half->parser); - half->ref_data->minor_version = llhttp_get_http_minor(&half->parser); - - if (half->parser.type == HTTP_REQUEST) + else { - half->event = HTTP_EVENT_REQ_LINE; - if (half->http_ev_cb) // http_event_handler() - { - half->http_ev_cb(half->event, &half->ref_data, half->http_ev_ctx, half->httpd_env); - } + half->ref_data->res_line_inner.res_line.major_version = llhttp_get_http_major(&half->parser); + half->ref_data->res_line_inner.res_line.minor_version = llhttp_get_http_minor(&half->parser); } - return 0; } /* Possible return values 0, -1, HPE_USER */ static int on_status(llhttp_t *http, const char *at, size_t length) { - printf_debug_info("on_status", at, length); - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); - - http_decoder_table_refer(half->ref_data->table, HTTP_ITEM_STATUS, at, length); + half->ref_data->res_line_inner.res_line.status = (char *)at; + half->ref_data->res_line_inner.res_line.status_len = length; return 0; } /* Information-only callbacks, return value is ignored */ static int on_status_complete(llhttp_t *http) { - printf_debug_info("on_status_complete", NULL, 0); - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); - - if (is_line_crlf(half) == 0) - { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_STATUS); - } - - http_decoder_table_commit(half->ref_data->table, HTTP_ITEM_STATUS); - half->ref_data->status_code = llhttp_get_status_code(&half->parser); - - if (half->parser.type == HTTP_RESPONSE) - { - half->event = HTTP_EVENT_RES_LINE; - if (half->http_ev_cb != NULL) // http_event_handler() - { - half->http_ev_cb(half->event, &half->ref_data, half->http_ev_ctx, half->httpd_env); - } - } - + half->ref_data->res_line_inner.res_line.status_code = llhttp_get_status_code(&half->parser); return 0; } /* Possible return values 0, -1, HPE_USER */ static int on_header_field(llhttp_t *http, const char *at, size_t length) { - printf_debug_info("on_header_field", at, length); - - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); - assert(half); - - http_decoder_table_refer(half->ref_data->table, HTTP_ITEM_HDRKEY, at, length); - return 0; -} - -/* Information-only callbacks, return value is ignored */ -static int on_header_field_complete(llhttp_t *http) -{ - printf_debug_info("on_header_field_complete", NULL, 0); - + if (0 == length) + { + return 0; + } struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); - - http_decoder_table_commit(half->ref_data->table, HTTP_ITEM_HDRKEY); - + http_half_append_header_filed(half->ref_data, at, length); return 0; } /* Possible return values 0, -1, HPE_USER */ static int on_header_value(llhttp_t *http, const char *at, size_t length) { - printf_debug_info("on_header_value", at, length); - - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); - assert(half); - - http_decoder_table_refer(half->ref_data->table, HTTP_ITEM_HDRVAL, at, length); - return 0; -} - -#define MAX_ENCODING_STR_LEN 8 -/* Information-only callbacks, return value is ignored */ -static int on_header_value_complete(llhttp_t *http) -{ - printf_debug_info("on_header_value_complete", NULL, 0); - - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); - assert(half); - - if (http_decoder_table_state(half->ref_data->table, HTTP_ITEM_HDRKEY) == - STRING_STATE_CACHE) - { - http_decoder_table_commit(half->ref_data->table, HTTP_ITEM_HDRKEY); - } - - http_decoder_table_commit(half->ref_data->table, HTTP_ITEM_HDRVAL); - - if (half->ref_data->content_encoding == HTTP_CONTENT_ENCODING_NONE) - { - struct http_header_field http_hdr = {}; - - if (http_decoder_table_get_header(half->ref_data->table, (char *)"Content-Encoding", 16, &http_hdr) == 0) - { - half->ref_data->content_encoding = http_content_encoding_str2int(http_hdr.value, http_hdr.value_len); - } - } - - if (http->type == HTTP_REQUEST) + if (0 == length) { - http_decoder_get_host_feed_url(half); + return 0; } + struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); + assert(half); + http_half_append_header_value(half->ref_data, at, length); return 0; } @@ -495,8 +409,6 @@ static int on_header_value_complete(llhttp_t *http) */ static int on_chunk_header(llhttp_t *http __attribute__((unused))) { - printf_debug_info("on_chunk_header", NULL, 0); - return 0; } @@ -506,8 +418,6 @@ static int on_chunk_header(llhttp_t *http __attribute__((unused))) */ static int on_chunk_header_complete(llhttp_t *http __attribute__((unused))) { - printf_debug_info("on_chunk_header_complete", NULL, 0); - return 0; } @@ -519,14 +429,10 @@ static int on_chunk_header_complete(llhttp_t *http __attribute__((unused))) */ static int on_headers_complete(llhttp_t *http) { - printf_debug_info("on_headers_complete", NULL, 0); - struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); assert(half->ref_data); - http_decoder_table_set_header_complete(half->ref_data->table); - if (half->parser.type == HTTP_REQUEST) { half->event = HTTP_EVENT_REQ_HDR_END; @@ -535,19 +441,25 @@ static int on_headers_complete(llhttp_t *http) { half->event = HTTP_EVENT_RES_HDR_END; } + half->ref_data->ref_headers_start = half->stage_shaper.headers_start; + half->ref_data->ref_headers_end = half->stage_shaper.headers_end; half->http_ev_cb(half->event, &half->ref_data, half->http_ev_ctx, half->httpd_env); // http_event_handler() - return 0; } /* Possible return values 0, -1, HPE_USER */ static int on_body(llhttp_t *http, const char *at, size_t length) { - printf_debug_info("on_body", at, length); - + if (0 == length) + { + return 0; + } struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); assert(half); + half->ref_data->raw_body.iov_base = (void *)NULL; + half->ref_data->raw_body.iov_len = 0; + // trigger body_begin event if (half->parser.type == HTTP_REQUEST) { @@ -566,17 +478,8 @@ static int on_body(llhttp_t *http, const char *at, size_t length) } } - if (half->ref_data != NULL) - { - if (http_decoder_table_state(half->ref_data->table, HTTP_ITEM_BODY) == - STRING_STATE_COMMIT) - { - http_decoder_table_reset(half->ref_data->table, HTTP_ITEM_BODY); - } - - http_decoder_table_refer(half->ref_data->table, HTTP_ITEM_BODY, at, length); - http_decoder_table_commit(half->ref_data->table, HTTP_ITEM_BODY); - } + half->ref_data->raw_body.iov_base = (void *)at; + half->ref_data->raw_body.iov_len = length; if (1 == half->decompress_switch && half->ref_data->content_encoding != HTTP_CONTENT_ENCODING_NONE) { @@ -602,35 +505,20 @@ static void http_decoder_half_init(struct http_decoder_half *half, http_event_cb llhttp_settings_init(&half->settings); llhttp_init(&half->parser, type, &half->settings); - // half->is_request_flow = (type == HTTP_REQUEST) ? 1 : 0; half->settings.on_message_begin = on_message_begin; half->settings.on_message_complete = on_message_complete; - half->settings.on_reset = on_reset; - half->settings.on_url = on_uri; - half->settings.on_url_complete = on_uri_complete; - half->settings.on_status = on_status; half->settings.on_status_complete = on_status_complete; - half->settings.on_method = on_method; - half->settings.on_method_complete = on_method_complete; - half->settings.on_version = on_version; half->settings.on_version_complete = on_version_complete; - half->settings.on_header_field = on_header_field; - half->settings.on_header_field_complete = on_header_field_complete; - half->settings.on_header_value = on_header_value; - half->settings.on_header_value_complete = on_header_value_complete; - half->settings.on_chunk_header = on_chunk_header; half->settings.on_chunk_complete = on_chunk_header_complete; - half->settings.on_headers_complete = on_headers_complete; half->settings.on_body = on_body; - half->error = HPE_OK; half->http_ev_cb = http_ev_cb; // http_event_handler() half->ref_data = NULL; @@ -658,13 +546,13 @@ void http_decoder_half_free(nmx_pool_t *mempool, struct http_decoder_half *half) { return; } - if (half->http_ev_ctx != NULL) { MEMPOOL_FREE(mempool, half->http_ev_ctx); half->http_ev_ctx = NULL; } - + http_buffer_free(half->stage_shaper.headers_cache); + half->stage_shaper.headers_cache = NULL; MEMPOOL_FREE(mempool, half); } @@ -673,44 +561,46 @@ void http_decoder_half_reinit(struct http_decoder_half *half, nmx_pool_t *mempool, struct session *sess) { assert(half != NULL); - if (half->ref_data != NULL) - { - http_decoder_table_reinit(half->ref_data->table); - } half->http_ev_ctx->ref_mempool = mempool; half->http_ev_ctx->ref_session = sess; half->http_ev_ctx->ref_queue = queue; } -static void publish_message_for_parsed_header(struct http_decoder_half *half) +static int http_half_cache_merge(struct http_decoder_half *half, const char *newdata, size_t newdata_len) { - if (0 == http_decoder_table_has_parsed_header(half->ref_data->table)) + struct http_flow_stage *stage_shaper = &half->stage_shaper; + if (stage_shaper->headers_cache == NULL || stage_shaper->headers_cache->buffer == NULL || stage_shaper->headers_cache->buffer_size == 0) { - return; + goto not_merged; } - if (half->parser.type == HTTP_REQUEST) + if (half->stage_shaper.stage != HTTP_STAGE_HEADER_PARTIAL) { - half->event = HTTP_EVENT_REQ_HDR; + goto not_merged; } - else + http_buffer_add(stage_shaper->headers_cache, newdata, newdata_len); + half->data = stage_shaper->headers_cache->buffer; + half->data_len = stage_shaper->headers_cache->buffer_size; + return 1; + +not_merged: + half->data = newdata; + half->data_len = newdata_len; + return 0; +} + +static void http_half_cache_headers(struct http_decoder_half *half, const char *newdata, size_t newdata_len) +{ + if (half->stage_shaper.headers_cache == NULL) { - half->event = HTTP_EVENT_RES_HDR; + half->stage_shaper.headers_cache = http_buffer_new(); } - half->http_ev_cb(half->event, &half->ref_data, half->http_ev_ctx, half->httpd_env); // http_event_handler(); - return; + http_buffer_add(half->stage_shaper.headers_cache, newdata, newdata_len); } -int http_decoder_half_parse(int proxy_enable, struct http_decoder_half *half, const char *data, size_t data_len) +int http_decoder_half_parse(struct http_decoder_half *half, const char *data, size_t data_len) { assert(half && data); - - half->data = (const char *)data; - half->data_len = data_len; half->error = llhttp_execute(&half->parser, data, data_len); - - int ret = 0; - enum llhttp_type type = HTTP_BOTH; - switch (half->error) { case HPE_OK: @@ -719,104 +609,140 @@ int http_decoder_half_parse(int proxy_enable, struct http_decoder_half *half, co llhttp_resume(&half->parser); break; case HPE_PAUSED_UPGRADE: - if (proxy_enable) - { - llhttp_resume_after_upgrade(&half->parser); - } - ret = 0; + llhttp_resume_after_upgrade(&half->parser); break; default: - type = (enum llhttp_type)half->parser.type; - llhttp_init(&half->parser, type, &half->settings); - ret = -1; + http_decoder_stat_update(&half->httpd_env->hd_stat, stellar_get_current_thread_index(), HTTP_STAT_PARSE_ERR, 1); + return half->error; break; } + return 0; +} - if (ret < 0) - { - // fprintf(stdout, - // "llhttp_execute parse error: %s err_reason:%s\n", - // llhttp_errno_name(half->error), half->parser.reason); - return half->error; - } +/* + * Cache the all headers field if not completed, + * Split the line, headers and body bulk. + */ +int http_decoder_half_stage_shaping(struct http_decoder_half *half, const char *newdata, size_t newdata_len) +{ + int ret = 0; + size_t offset = 0; + struct http_flow_stage *stage_shaper = &half->stage_shaper; + int merged = http_half_cache_merge(half, newdata, newdata_len); + const char *acc_data = half->data; + size_t acc_data_len = half->data_len; - if (half->ref_data != NULL) + while (offset < acc_data_len) { - if (http_decoder_table_state(half->ref_data->table, HTTP_ITEM_URI) == STRING_STATE_REFER) - { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_URI); - } - - if (http_decoder_table_state(half->ref_data->table, HTTP_ITEM_STATUS) == STRING_STATE_REFER) - { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_STATUS); - } - - if (http_decoder_table_state(half->ref_data->table, HTTP_ITEM_METHOD) == STRING_STATE_REFER) + switch (stage_shaper->stage) { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_METHOD); - } - - if (http_decoder_table_state(half->ref_data->table, HTTP_ITEM_VERSION) == STRING_STATE_REFER) - { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_VERSION); - } - - if (http_decoder_table_header_complete(half->ref_data->table)) - { - http_decoder_table_reset_header_complete(half->ref_data->table); - } - else - { - // if headers are not completed with EOF \r\n\r\n, push the parsed headers so far - publish_message_for_parsed_header(half); - } - - enum string_state hdr_key_state = - http_decoder_table_state(half->ref_data->table, HTTP_ITEM_HDRKEY); - enum string_state hdr_val_state = - http_decoder_table_state(half->ref_data->table, HTTP_ITEM_HDRVAL); - - /* Truncated in http header key - For example http header k-v => User-Agent: Chrome - case1: - packet1: User- hdr_key_state == STRING_STATE_REFER - packet2: Agent: Chrome - - case2: - packet1: User-Agent: hdr_key_state == STRING_STATE_COMMIT - hdr_val_state == STRING_STATE_INIT - packet2: Chrome - */ - if (hdr_key_state == STRING_STATE_REFER || - (hdr_key_state == STRING_STATE_COMMIT && hdr_val_state == STRING_STATE_INIT)) + case HTTP_STAGE_INIT: + case HTTP_STAGE_PENDING: + if (http_protocol_identify(acc_data + offset, acc_data_len - offset) == 1) + { + stage_shaper->stage = HTTP_STAGE_HEADER_PARTIAL; + } + else + { + if (half->event == HTTP_EVENT_REQ_HDR_END || half->event == HTTP_EVENT_RES_HDR_END) + { + stage_shaper->stage = HTTP_STAGE_BODY; + } + else + { + stage_shaper->stage = HTTP_STAGE_INIT; + return -1; + } + } + break; + case HTTP_STAGE_HEADER_PARTIAL: { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_HDRKEY); + size_t hdr_eof_offset = http_line_header_completed(acc_data + offset, acc_data_len - offset); + if (hdr_eof_offset == 0) + { + if (0 == merged) + { + http_half_cache_headers(half, acc_data + offset, acc_data_len - offset); + } + stage_shaper->stage = HTTP_STAGE_HEADER_PARTIAL; + offset = acc_data_len; + } + else + { + http_truncate_extract_headers(acc_data + offset, hdr_eof_offset, &stage_shaper->headers_start, &stage_shaper->headers_end); + ret = http_decoder_half_parse(half, acc_data + offset, hdr_eof_offset); + if (ret != 0) + { + return -1; + } + if (half->ref_data->content_length > 0 || half->ref_data->transfer_encoding_is_chunked) + { + half->stage_shaper.remain_content_length = half->ref_data->content_length; + stage_shaper->stage = HTTP_STAGE_BODY; + } + else + { + stage_shaper->stage = HTTP_STAGE_PENDING; + } + offset += hdr_eof_offset; + } } + break; - /* Truncated in http header value - For example http header k-v => User-Agent: Chrome - packet1: User-Agent: Ch hdr_key_state == STRING_STATE_COMMIT - hdr_val_state == STRING_STATE_REFER - - packet2: rome - */ - if (http_decoder_table_state(half->ref_data->table, HTTP_ITEM_HDRVAL) == STRING_STATE_REFER) + case HTTP_STAGE_BODY: { - /* Header key should have been committed - If it's not cached, cache it for next packet to use - */ - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_HDRKEY); - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_HDRVAL); + if (half->ref_data->transfer_encoding_is_chunked) + { + ret = http_decoder_half_parse(half, acc_data + offset, acc_data_len - offset); + if (ret != 0) + { + return -1; + } + if (half->event == HTTP_EVENT_REQ_BODY_END || half->event == HTTP_EVENT_RES_BODY_END) + { + stage_shaper->stage = HTTP_STAGE_PENDING; + } + offset = acc_data_len; + } + else if (half->ref_data->content_length > 0) + { + size_t body_size = MIN((size_t)half->stage_shaper.remain_content_length, acc_data_len - offset); + ret = http_decoder_half_parse(half, acc_data + offset, body_size); + if (ret != 0) + { + return -1; + } + half->stage_shaper.remain_content_length -= body_size; + if (0 == half->stage_shaper.remain_content_length) + { + stage_shaper->stage = HTTP_STAGE_PENDING; + } + else + { + ; // body not completed, go on... + } + offset += body_size; + } + else + { + // no content-length, and not chunked, how to do? + ret = http_decoder_half_parse(half, acc_data + offset, acc_data_len - offset); + if (ret != 0) + { + return -1; + } + offset = acc_data_len; + } } - - if (http_decoder_table_state(half->ref_data->table, HTTP_ITEM_BODY) == STRING_STATE_REFER) - { - http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_BODY); + break; + default: + assert(0); + offset = acc_data_len; + ret = -1; + break; } } - - return 0; + return ret; } long long http_decoder_half_trans_count(struct http_decoder_half *half) @@ -825,30 +751,17 @@ long long http_decoder_half_trans_count(struct http_decoder_half *half) { return 0; } - long long trans_cnt = half->trans_counter; half->trans_counter = 0; - return trans_cnt; } -struct http_decoder_half_data * -http_decoder_half_data_new(nmx_pool_t *mempool) +struct http_decoder_half_data *http_decoder_half_data_new(nmx_pool_t *mempool, enum flow_type flow_dir) { - struct http_decoder_half_data *data = - MEMPOOL_CALLOC(mempool, struct http_decoder_half_data, 1); + struct http_decoder_half_data *data = MEMPOOL_CALLOC(mempool, struct http_decoder_half_data, 1); assert(data); - - data->table = http_decoder_table_new(mempool); - assert(data->table); - - data->major_version = -1; - data->minor_version = -1; - data->status_code = -1; - + data->flow_dir = flow_dir; data->content_encoding = HTTP_CONTENT_ENCODING_NONE; - // data->ref_decompress_body = NULL; - // data->decompress_body_len = 0; data->decompress_buffer_list = NULL; return data; } @@ -878,13 +791,6 @@ void http_decoder_half_data_free(nmx_pool_t *mempool, struct http_decoder_half_d { return; } - - if (data->table != NULL) - { - http_decoder_table_free(data->table); - data->table = NULL; - } - if (data->decompress != NULL) { http_content_decompress_destroy(data->decompress); @@ -895,115 +801,30 @@ void http_decoder_half_data_free(nmx_pool_t *mempool, struct http_decoder_half_d { MEMPOOL_FREE(mempool, data->joint_url.iov_base); data->joint_url.iov_base = NULL; - data->joint_url_complete = 0; } http_decoder_half_decompress_buf_free(data); + http_buffer_free(data->ref_headers_cache); + data->ref_headers_cache = NULL; MEMPOOL_FREE(mempool, data); } -int http_decoder_half_data_get_request_line(struct http_decoder_half_data *data, - struct http_request_line *line) -{ - http_decoder_table_get_method(data->table, &line->method, &line->method_len); - http_decoder_table_get_uri(data->table, &line->uri, &line->uri_len); - http_decoder_table_get_version(data->table, &line->version, &line->version_len); - - line->major_version = data->major_version; - line->minor_version = data->minor_version; - - return 0; -} - -int http_decoder_half_data_get_response_line(struct http_decoder_half_data *data, - struct http_response_line *line) -{ - http_decoder_table_get_version(data->table, &line->version, &line->version_len); - http_decoder_table_get_status(data->table, &line->status, &line->status_len); - - line->major_version = data->major_version; - line->minor_version = data->minor_version; - line->status_code = data->status_code; - - return 0; -} - -int http_decoder_half_data_get_header(const struct http_decoder_half_data *data, - const char *name, size_t name_len, - struct http_header_field *hdr_result) -{ - return http_decoder_table_get_header(data->table, name, name_len, hdr_result); -} - -int http_decoder_half_data_iter_header(struct http_decoder_half_data *data, - struct http_header_field *header) -{ - return http_decoder_table_iter_header((struct http_decoder_table *)data->table, header); -} - -int http_decoder_half_data_reset_header_iter(struct http_decoder_half_data *req_data) +const struct http_request_line *http_decoder_half_data_get_request_line(struct http_decoder_half_data *data) { - if (NULL == req_data) - { - return -1; - } - return http_decoder_table_reset_header_iter(req_data->table); + return &data->req_line_inner.req_line; } -int http_decoder_half_data_has_parsed_header(struct http_decoder_half_data *data) +const struct http_response_line *http_decoder_half_data_get_response_line(struct http_decoder_half_data *data) { - if (NULL == data) - { - return 0; - } - return http_decoder_table_has_parsed_header(data->table); -} - -int http_decoder_half_data_get_raw_body(const struct http_decoder_half_data *data, const char **body, size_t *body_len) -{ - if (NULL == data || NULL == body) - { - return -1; - } - return http_decoder_table_get_body(data->table, (char **)body, body_len); -} -#if 0 -int http_decoder_half_data_get_decompress_body(const struct http_decoder_half_data *data, hstring *body) -{ - if (HTTP_CONTENT_ENCODING_NONE == data->content_encoding) - { - return http_decoder_table_get_body(data->table, body); - } - - body->iov_base = data->ref_decompress_body; - body->iov_len = data->decompress_body_len; - return 0; -} -#endif - -void http_decoder_half_data_dump(struct http_decoder_half *half) -{ - if (NULL == half || NULL == half->ref_data) - { - return; - } - - http_decoder_table_dump(half->ref_data->table); + return &data->res_line_inner.res_line; } -static void using_session_addr_as_host(struct session *ref_session, struct http_header_field *host_result, nmx_pool_t *mempool) +struct http_header_field *http_using_session_addr_without_host(struct session *ref_session, nmx_pool_t *mempool) { -#if 1 // in native steallar, can't get the tuple4 from the session yet!!! + struct http_header_field *host_result = MEMPOOL_CALLOC(mempool, struct http_header_field, 1); struct httpd_session_addr ssaddr = {}; httpd_session_get_addr(ref_session, &ssaddr); - if (ssaddr.ipver != 4 && ssaddr.ipver != 6) - { - host_result->value = MEMPOOL_CALLOC(mempool, char, 1); - sprintf((char *)host_result->value, "%s", ""); - host_result->value_len = strlen((char *)host_result->value); - return; - } - char ip_string_buf[INET6_ADDRSTRLEN]; + if (4 == ssaddr.ipver) { host_result->value = MEMPOOL_CALLOC(mempool, char, (INET_ADDRSTRLEN + 7) /* "ip:port" max length */); @@ -1020,23 +841,31 @@ static void using_session_addr_as_host(struct session *ref_session, struct http_ } else { - assert(0); + host_result->value = MEMPOOL_CALLOC(mempool, char, 1); + sprintf((char *)host_result->value, "%s", ""); + host_result->value_len = strlen((char *)host_result->value); + return host_result; } -#else - host_result->val.iov_base = MEMPOOL_CALLOC(mempool, char, 32); - sprintf((char *)host_result->val.iov_base, "%s", "todo:get_tuple4"); - host_result->val.iov_len = strlen((char *)host_result->val.iov_base); -#endif + return host_result; } void http_decoder_join_url(struct http_decoder_half_data *hfdata, nmx_pool_t *mempool, const struct http_header_field *host_hdr) { int append_slash_len = 0; - if ('/' != ((char *)hfdata->joint_url.iov_base)[0]) + const char *join_uri = hfdata->req_line_inner.req_line.uri; + size_t join_url_len = hfdata->req_line_inner.req_line.uri_len; + + if (join_url_len > 7 && strncasecmp(join_uri, "http://", 7) == 0) + { + join_uri += 7; + join_url_len -= 7; + } + + if ('/' != join_uri[0]) { append_slash_len = 1; } - int url_cache_str_len = host_hdr->value_len + hfdata->joint_url.iov_len + append_slash_len; + int url_cache_str_len = host_hdr->value_len + join_url_len + append_slash_len; char *url_cache_str = MEMPOOL_CALLOC(mempool, char, url_cache_str_len); char *ptr = url_cache_str; @@ -1047,91 +876,81 @@ void http_decoder_join_url(struct http_decoder_half_data *hfdata, nmx_pool_t *me *ptr = '/'; ptr++; } - memcpy(ptr, hfdata->joint_url.iov_base, hfdata->joint_url.iov_len); + memcpy(ptr, join_uri, join_url_len); - MEMPOOL_FREE(mempool, hfdata->joint_url.iov_base); // free the cached uri buffer hfdata->joint_url.iov_base = url_cache_str; hfdata->joint_url.iov_len = url_cache_str_len; - hfdata->joint_url_complete = 1; } -void http_decoder_get_url(struct http_decoder_half_data *hfdata, nmx_pool_t *mempool) +int http_parse_headers_finally(struct http_event_context *ev_ctx, struct http_decoder_half_data *hfdata) { - struct http_request_line reqline = {}; - http_decoder_half_data_get_request_line(hfdata, &reqline); - if (unlikely(http_strncasecmp_safe("CONNECT", (char *)reqline.method, 7, reqline.method_len) == 0)) + if (FLOW_TYPE_C2S == hfdata->flow_dir) { - hfdata->joint_url.iov_base = MEMPOOL_CALLOC(mempool, char, reqline.uri_len + 1); - memcpy(hfdata->joint_url.iov_base, reqline.uri, reqline.uri_len); - hfdata->joint_url.iov_len = reqline.uri_len; - hfdata->joint_url_complete = 1; + const struct http_header_field *host_filed = http_half_get_header_field(hfdata, "Host", 4); + if (NULL == host_filed) + { + host_filed = http_using_session_addr_without_host(ev_ctx->ref_session, ev_ctx->ref_mempool); + } + http_decoder_join_url(hfdata, ev_ctx->ref_mempool, host_filed); } -} -int http_decoder_join_url_finally(struct http_event_context *ev_ctx, struct http_decoder_half_data *hfdata, nmx_pool_t *mempool) -{ - if (hfdata->joint_url_complete) + const struct http_header_field *encoding_field = http_half_get_header_field(hfdata, "Content-Encoding", strlen("Content-Encoding")); + if (NULL == encoding_field) { - return 0; + hfdata->content_encoding = HTTP_CONTENT_ENCODING_NONE; + } + else + { + hfdata->content_encoding = http_content_encoding_str2int(encoding_field->value, encoding_field->value_len); } - struct http_header_field addr_as_host = {}; - using_session_addr_as_host(ev_ctx->ref_session, &addr_as_host, mempool); - http_decoder_join_url(hfdata, mempool, &addr_as_host); - MEMPOOL_FREE(mempool, addr_as_host.value); // free session addr to host buffer - return 1; -} -void http_decoder_get_host_feed_url(struct http_decoder_half *half) -{ - if (half->ref_data->joint_url_complete) + const struct http_header_field *content_len = http_half_get_header_field(hfdata, "Content-Length", strlen("Content-Length")); + if (NULL == content_len) { - return; + hfdata->content_length = -1; } - struct http_header_field host_result = {}; - int host_header_cnt = http_decoder_half_data_get_header(half->ref_data, (char *)"Host", 4, &host_result); - if (host_header_cnt < 0) + else { - return; + hfdata->content_length = http_strtoll(content_len->value, content_len->value_len); } - http_decoder_join_url(half->ref_data, half->http_ev_ctx->ref_mempool, &host_result); -} -int http_half_data_get_url(struct http_decoder_half_data *res_data, const char **url_val, size_t *url_len) -{ - if (0 == res_data->joint_url_complete) + const struct http_header_field *transf_encoding = http_half_get_header_field(hfdata, "Transfer-Encoding", strlen("Transfer-Encoding")); + if (NULL == transf_encoding) { - return -1; + hfdata->transfer_encoding_is_chunked = 0; } - *url_val = res_data->joint_url.iov_base; - *url_len = res_data->joint_url.iov_len; - return 0; -} -#if 0 -int http_half_data_get_decode_url(struct http_decoder_half_data *res_data, hstring *url) -{ - if (0 == res_data->joint_url_complete) + else { - return -1; + if (http_strncasecmp_safe(transf_encoding->value, "chunked", transf_encoding->value_len, strlen("chunked")) == 0) + { + hfdata->transfer_encoding_is_chunked = 1; + } + else + { + hfdata->transfer_encoding_is_chunked = 0; + } } - url->iov_base = res_data->decoded_url.iov_base; - url->iov_len = res_data->decoded_url.iov_len; - return 0; + return 1; } -#endif -int http_half_data_get_transaction_seq(struct http_decoder_half_data *hf_data) +int http_half_data_get_url(struct http_decoder_half_data *res_data, const char **url_val, size_t *url_len) { - return hf_data->transaction_index; + *url_val = (char *)res_data->joint_url.iov_base; + *url_len = res_data->joint_url.iov_len; + return 0; } -void http_half_data_update_commit_index(struct http_decoder_half_data *half_data) +int http_half_data_get_transaction_seq(struct http_decoder_half_data *hf_data) { - http_decoder_table_update_commit_index(half_data->table); + return hf_data->transaction_index; } -int http_half_data_get_total_parsed_header_count(struct http_decoder_half_data *half_data) +int http_half_get_header_count(struct http_decoder_half_data *half_data) { - return http_decoder_table_get_total_parsed_header(half_data->table); + int header_count = 0; + struct http_header_field_inner *el; + DL_COUNT(half_data->filed_list, el, header_count); + return header_count; } void http_half_pre_context_free(struct session *sess, struct http_decoder_exdata *exdata) @@ -1153,7 +972,6 @@ void http_half_pre_context_free(struct session *sess, struct http_decoder_exdata session_mq_publish_message(sess, exdata->pub_topic_id, msg); } } - for (size_t i = 0; i < queue->queue_size; i++) { res_data = queue->array[i].res_data; @@ -1185,4 +1003,38 @@ enum http_content_encoding http_half_data_get_content_encoding(struct http_decod return HTTP_CONTENT_ENCODING_NONE; } return hf_data->content_encoding; -} \ No newline at end of file +} + +void http_message_get0_headers_intergration(const struct http_message *msg, const char **headers, size_t *headers_len) +{ + if (unlikely(NULL == msg || NULL == headers || 0 == headers_len)) + { + return; + } + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_LEN); + const struct http_decoder_half_data *half_data = NULL; + if (HTTP_MESSAGE_REQ_LINE_HEADERS == msg->type) + { + half_data = msg->ref_queue->array[msg->queue_index].req_data; + } + else if (HTTP_MESSAGE_RES_LINE_HEADERS == msg->type) + { + half_data = msg->ref_queue->array[msg->queue_index].res_data; + } + else + { + ; + } + if (half_data == NULL) + { + *headers = NULL; + *headers_len = 0; + } + else + { + *headers = half_data->ref_headers_start; + *headers_len = half_data->ref_headers_end - half_data->ref_headers_start; + } + return; +} diff --git a/decoders/http/http_decoder_half.h b/decoders/http/http_decoder_half.h index f525f78..2d9a7d6 100644 --- a/decoders/http/http_decoder_half.h +++ b/decoders/http/http_decoder_half.h @@ -13,6 +13,7 @@ typedef struct iovec hstring; // only one http event is fired at a time enum http_event { + __HTTP_EVENT_RESERVED = 0, HTTP_EVENT_REQ_INIT = 1 << 1, HTTP_EVENT_REQ_LINE = 1 << 2, HTTP_EVENT_REQ_HDR = 1 << 3, @@ -32,6 +33,14 @@ enum http_event HTTP_EVENT_RES_END = 1 << 16, }; +enum http_stage +{ + HTTP_STAGE_INIT = 0, + HTTP_STAGE_PENDING = 1, /* body without Content-Length, no Chunk-Encoding */ + HTTP_STAGE_HEADER_PARTIAL = 2, + HTTP_STAGE_BODY = 3, +}; + struct http_event_context { struct http_decoder_exdata *ref_httpd_ctx; @@ -57,21 +66,18 @@ void http_decoder_half_reinit(struct http_decoder_half *half, struct http_decoder_result_queue *queue, nmx_pool_t *mempool, struct session *sess); -int http_decoder_half_parse(int proxy_enable, struct http_decoder_half *half, const char *data, size_t data_len); +int http_decoder_half_parse(struct http_decoder_half *half, const char *data, size_t data_len); long long http_decoder_half_trans_count(struct http_decoder_half *half); // http decoder half data API -struct http_decoder_half_data * -http_decoder_half_data_new(nmx_pool_t *mempool); +struct http_decoder_half_data *http_decoder_half_data_new(nmx_pool_t *mempool, enum flow_type flow_dir); void http_decoder_half_data_free(nmx_pool_t *mempool, struct http_decoder_half_data *data); -int http_decoder_half_data_get_request_line(struct http_decoder_half_data *data, - struct http_request_line *line); +const struct http_request_line *http_decoder_half_data_get_request_line(struct http_decoder_half_data *data); -int http_decoder_half_data_get_response_line(struct http_decoder_half_data *data, - struct http_response_line *line); +const struct http_response_line *http_decoder_half_data_get_response_line(struct http_decoder_half_data *data); int http_decoder_half_data_get_header(const struct http_decoder_half_data *data, const char *name, size_t name_len, struct http_header_field *hdr_res); @@ -86,24 +92,26 @@ int http_decoder_half_data_get_raw_body(const struct http_decoder_half_data *dat int http_decoder_half_data_get_decompress_body(const struct http_decoder_half_data *data, const char **body, size_t *body_len); void http_half_get_lastest_decompress_buffer(struct http_decoder_half_data *data, hstring *decompress_body); void http_half_decompress_buffer_free(struct http_decoder_half_data *data, hstring *decompress_body); +void http_half_flow_buffer_free(struct http_decoder_half_data *data); void http_decoder_half_data_dump(struct http_decoder_half *half); void http_decoder_get_host_feed_url(struct http_decoder_half *half); void http_decoder_get_url(struct http_decoder_half_data *hfdata, nmx_pool_t *mempool); int http_half_data_get_decode_url(struct http_decoder_half_data *res_data, hstring *url); -void http_decoder_join_url(struct http_decoder_half_data *hfdata, - nmx_pool_t *mempool, - const struct http_header_field *host_hdr); -int http_decoder_join_url_finally(struct http_event_context *ev_ctx, - struct http_decoder_half_data *hfdata, - nmx_pool_t *mempool); +void http_decoder_join_url(struct http_decoder_half_data *hfdata, nmx_pool_t *mempool, const struct http_header_field *host_hdr); +int http_parse_headers_finally(struct http_event_context *ev_ctx, struct http_decoder_half_data *hfdata); int http_half_data_get_url(struct http_decoder_half_data *res_data, const char **url_val, size_t *url_len); int http_half_data_get_transaction_seq(struct http_decoder_half_data *hf_data); void http_half_data_update_commit_index(struct http_decoder_half_data *half_data); void http_half_pre_context_free(struct session *sess, struct http_decoder_exdata *exdata); void http_half_update_state(struct http_decoder_half_data *hf_data, enum http_event state); -int http_half_data_get_total_parsed_header_count(struct http_decoder_half_data *half_data); void http_half_get_max_transaction_seq(struct http_decoder_exdata *exdata, long long *max_req_seq, long long *max_res_seq); -enum http_content_encoding http_half_data_get_content_encoding(struct http_decoder_half_data *hf_data); \ No newline at end of file +enum http_content_encoding http_half_data_get_content_encoding(struct http_decoder_half_data *hf_data); +const struct http_header_field *http_half_get_next_header_field(const struct http_decoder_half_data *half_data, const struct http_header_field *current_header); +const struct http_header_field *http_half_get_header_field(const struct http_decoder_half_data *half_data, const char *field_name, size_t field_name_len); +int http_half_get_header_count(struct http_decoder_half_data *half_data); +hstring *http_half_get_raw_body(struct http_decoder_half_data *data); +void http_half_headers_ref_free(struct http_decoder_half_data *half_data); +int http_decoder_half_stage_shaping(struct http_decoder_half *half, const char *newdata, size_t newdata_len); \ No newline at end of file diff --git a/decoders/http/http_decoder_private.h b/decoders/http/http_decoder_private.h index 04130f0..d6e4a54 100644 --- a/decoders/http/http_decoder_private.h +++ b/decoders/http/http_decoder_private.h @@ -22,11 +22,9 @@ extern "C" #include "stellar/http.h" #include "http_decoder_result_queue.h" #include "http_decoder_half.h" -#include "http_decoder_table.h" #include "http_decoder_result_queue.h" #include "http_decoder_utils.h" #include "http_decoder_stat.h" -#include "http_decoder_tunnel.h" #include "fieldstat/fieldstat_easy.h" #include "toml/toml.h" @@ -55,6 +53,10 @@ typedef struct iovec hstring; #define HD_FREE(pool, p) FREE(p) #endif +#ifndef UNUSED +#define UNUSED __attribute__((unused)) +#endif + #define HTTP_IDENTIFY_LEN 16 #define HD_RESULT_QUEUE_LEN 16 @@ -73,7 +75,6 @@ typedef struct iovec hstring; int decompress_switch; int stat_interval_pkts; // call fieldstat_incrby every stat_interval_pkts int stat_output_interval; - int proxy_enable; size_t result_queue_len; // per session result queue length size_t mempool_size; // per session mempool size }; @@ -108,12 +109,13 @@ typedef struct iovec hstring; struct http_decoder_exdata { + struct http_decoder_env *httpd_env; + struct session *sess; int sub_topic_id; // tcp_stream int pub_topic_id; // http message or http tunnel msg struct http_decoder_result_queue *queue; struct http_decoder *decoder; nmx_pool_t *mempool; - enum http_tunnel_state tunnel_state; int in_tunnel_is_http; }; diff --git a/decoders/http/http_decoder_result_queue.c b/decoders/http/http_decoder_result_queue.c index 5695138..72eb20b 100644 --- a/decoders/http/http_decoder_result_queue.c +++ b/decoders/http/http_decoder_result_queue.c @@ -1,8 +1,7 @@ #include #include "http_decoder_private.h" -struct http_decoder_result_queue * -http_decoder_result_queue_new(nmx_pool_t *mempool, size_t queue_size) +struct http_decoder_result_queue *http_decoder_result_queue_new(nmx_pool_t *mempool, size_t queue_size) { struct http_decoder_result_queue *queue = MEMPOOL_CALLOC(mempool, struct http_decoder_result_queue, 1); @@ -11,8 +10,7 @@ http_decoder_result_queue_new(nmx_pool_t *mempool, size_t queue_size) queue->req_index = 0; queue->res_index = 0; queue->queue_size = queue_size; - queue->array = MEMPOOL_CALLOC(mempool, struct http_decoder_result, - queue->queue_size); + queue->array = MEMPOOL_CALLOC(mempool, struct http_decoder_result, queue->queue_size); assert(queue->array); return queue; } @@ -104,8 +102,7 @@ int http_decoder_result_queue_push_res(struct http_decoder_result_queue *queue, return 0; } -struct http_decoder_half_data * -http_decoder_result_queue_pop_req(struct http_decoder_result_queue *queue) +struct http_decoder_half_data *http_decoder_result_queue_pop_req(struct http_decoder_result_queue *queue) { if (NULL == queue) { @@ -116,8 +113,7 @@ http_decoder_result_queue_pop_req(struct http_decoder_result_queue *queue) return req_data; } -struct http_decoder_half_data * -http_decoder_result_queue_pop_res(struct http_decoder_result_queue *queue) +struct http_decoder_half_data *http_decoder_result_queue_pop_res(struct http_decoder_result_queue *queue) { if (NULL == queue) { @@ -129,8 +125,7 @@ http_decoder_result_queue_pop_res(struct http_decoder_result_queue *queue) return res_data; } -struct http_decoder_half_data * -http_decoder_result_queue_peek_req(struct http_decoder_result_queue *queue) +struct http_decoder_half_data *http_decoder_result_queue_peek_req(struct http_decoder_result_queue *queue) { if (NULL == queue) { @@ -140,8 +135,7 @@ http_decoder_result_queue_peek_req(struct http_decoder_result_queue *queue) return queue->array[queue->req_index].req_data; } -struct http_decoder_half_data * -http_decoder_result_queue_peek_res(struct http_decoder_result_queue *queue) +struct http_decoder_half_data *http_decoder_result_queue_peek_res(struct http_decoder_result_queue *queue) { if (NULL == queue) { diff --git a/decoders/http/http_decoder_string.c b/decoders/http/http_decoder_string.c deleted file mode 100644 index 6fd5b04..0000000 --- a/decoders/http/http_decoder_string.c +++ /dev/null @@ -1,289 +0,0 @@ -#include -#include -#include -#include -#include "http_decoder_private.h" - -static const char *string_state_to_desc(enum string_state state) -{ - switch (state) - { - case STRING_STATE_INIT: - return "init"; - break; - case STRING_STATE_REFER: - return "refer"; - break; - case STRING_STATE_CACHE: - return "cache"; - break; - case STRING_STATE_COMMIT: - return "commit"; - break; - default: - return "unknown"; - break; - } -} - -void http_decoder_string_refer(struct http_decoder_string *rstr, const char *at, size_t length) -{ - if (NULL == rstr) - { - return; - } - - switch (rstr->state) - { - case STRING_STATE_INIT: - case STRING_STATE_CACHE: - rstr->refer.iov_base = (char *)at; - rstr->refer.iov_len = length; - break; - default: - abort(); - break; - } - - rstr->state = STRING_STATE_REFER; -} - -static void string_refer2cache(struct http_decoder_string *rstr) -{ - if (0 == rstr->refer.iov_len) - { - return; - } - if (rstr->cache.iov_len >= rstr->max_cache_size) - { - return; - } - - size_t length = rstr->cache.iov_len + rstr->refer.iov_len; - if (length > rstr->max_cache_size) - { - length = rstr->max_cache_size; - } - - if (NULL == rstr->cache.iov_base) - { - rstr->cache.iov_base = CALLOC(char, length + 1); - memcpy(rstr->cache.iov_base, rstr->refer.iov_base, length); - } - else - { - rstr->cache.iov_base = REALLOC(char, rstr->cache.iov_base, length + 1); - memcpy((char *)rstr->cache.iov_base + rstr->cache.iov_len, rstr->refer.iov_base, - (length - rstr->cache.iov_len)); - } - - rstr->cache.iov_len = length; - rstr->refer.iov_base = NULL; - rstr->refer.iov_len = 0; -} - -static void string_commit2cache(struct http_decoder_string *rstr) -{ - if (rstr->cache.iov_len == rstr->commit.iov_len && - rstr->cache.iov_base == rstr->commit.iov_base) - { - rstr->commit.iov_base = NULL; - rstr->commit.iov_len = 0; - return; - } - - // Only http header key need to backward to cache - size_t length = 0; - if (rstr->commit.iov_len > rstr->max_cache_size) - { - length = rstr->max_cache_size; - } - else - { - length = rstr->commit.iov_len; - } - - if (length > 0) - { - if (NULL == rstr->cache.iov_base) - { - rstr->cache.iov_base = CALLOC(char, length + 1); - } - else - { - abort(); - } - memcpy(rstr->cache.iov_base, rstr->commit.iov_base, length); - rstr->cache.iov_len = length; - - rstr->commit.iov_base = NULL; - rstr->commit.iov_len = 0; - } -} - -void http_decoder_string_cache(struct http_decoder_string *rstr) -{ - if (NULL == rstr) - { - return; - } - - switch (rstr->state) - { - case STRING_STATE_REFER: - string_refer2cache(rstr); - break; - case STRING_STATE_CACHE: - break; - case STRING_STATE_COMMIT: - // commit backward to cache - string_commit2cache(rstr); - break; - default: - abort(); - break; - } - rstr->state = STRING_STATE_CACHE; -} - -void http_decoder_string_commit(struct http_decoder_string *rstr) -{ - if (NULL == rstr) - { - return; - } - - switch (rstr->state) - { - case STRING_STATE_REFER: - if (rstr->cache.iov_len) - { - http_decoder_string_cache(rstr); - - rstr->commit.iov_base = rstr->cache.iov_base; - rstr->commit.iov_len = rstr->cache.iov_len; - // not overwrite rstr->cache.iov_base - } - else - { - rstr->commit.iov_base = rstr->refer.iov_base; - rstr->commit.iov_len = rstr->refer.iov_len; - - rstr->refer.iov_base = NULL; - rstr->refer.iov_len = 0; - } - break; - case STRING_STATE_CACHE: - rstr->commit.iov_base = rstr->cache.iov_base; - rstr->commit.iov_len = rstr->cache.iov_len; - // not overwrite rstr->cache.iov_base - break; - default: - // abort(); - break; - } - - rstr->state = STRING_STATE_COMMIT; -} - -void http_decoder_string_reset(struct http_decoder_string *rstr) -{ - assert(rstr); - - switch (rstr->state) - { - case STRING_STATE_INIT: - case STRING_STATE_REFER: - case STRING_STATE_CACHE: - case STRING_STATE_COMMIT: - FREE(rstr->cache.iov_base); - memset(rstr, 0, sizeof(struct http_decoder_string)); - break; - default: - abort(); - break; - } - - rstr->state = STRING_STATE_INIT; -} - -void http_decoder_string_init(struct http_decoder_string *rstr, size_t max_cache_size) -{ - rstr->max_cache_size = max_cache_size; -} - -void http_decoder_string_reinit(struct http_decoder_string *rstr) -{ - if (rstr->state == STRING_STATE_CACHE) - { - return; - } - - if (rstr->state == STRING_STATE_COMMIT && - rstr->cache.iov_base == rstr->commit.iov_base && - rstr->cache.iov_len == rstr->commit.iov_len) - { - return; - } - - if (rstr->cache.iov_base != NULL) - { - FREE(rstr->cache.iov_base); - rstr->cache.iov_len = 0; - } - -#if 0 - rstr->refer.iov_base = NULL; - rstr->refer.iov_len = 0; - rstr->commit.iov_base = NULL; - rstr->commit.iov_len = 0; - rstr->state = STRING_STATE_INIT; -#endif -} - -enum string_state http_decoder_string_state(const struct http_decoder_string *rstr) -{ - return rstr->state; -} - -int http_decoder_string_get(const struct http_decoder_string *rstr, char **name, size_t *name_len) -{ - if (NULL == rstr || NULL == name || 0 == name_len) - { - return -1; - } - - if (http_decoder_string_state(rstr) == STRING_STATE_COMMIT) - { - *name = rstr->commit.iov_base; - *name_len = rstr->commit.iov_len; - } - else - { - *name = NULL; - *name_len = 0; - } - return 0; -} - -void http_decoder_string_dump(struct http_decoder_string *rstr, const char *desc) -{ - if (NULL == rstr) - { - return; - } - - char *refer_str = http_safe_dup((char *)rstr->refer.iov_base, rstr->refer.iov_len); - char *cache_str = http_safe_dup((char *)rstr->cache.iov_base, rstr->cache.iov_len); - char *commit_str = http_safe_dup((char *)rstr->commit.iov_base, rstr->commit.iov_len); - - printf("%s: state: %s, refer: {len: %02zu, iov_base: %s}, cache: {len: %02zu, iov_base: %s}, commit: {len: %02zu, iov_base: %s}\n", - desc, string_state_to_desc(rstr->state), - rstr->refer.iov_len, refer_str, - rstr->cache.iov_len, cache_str, - rstr->commit.iov_len, commit_str); - - FREE(refer_str); - FREE(cache_str); - FREE(commit_str); -} \ No newline at end of file diff --git a/decoders/http/http_decoder_string.h b/decoders/http/http_decoder_string.h deleted file mode 100644 index 83721e9..0000000 --- a/decoders/http/http_decoder_string.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once - -#include "stellar/http.h" - -enum string_state { - STRING_STATE_INIT, - STRING_STATE_REFER, - STRING_STATE_CACHE, - STRING_STATE_COMMIT, -}; - -/* state transition diagram - * +----------+ - * | | - * \|/ | - * +------+ | - * | init | | - * +------+ | - * | | - * +---->| | - * | \|/ | - * | +-------+ | - * | | refer |--+ | - * | +-------+ | | - * | | | | - * | \|/ | | - * | +-------+ | | - * +--| cache | | | - * +-------+ | | - * | | | - * |<------+ | - * \|/ | - * +--------+ | - * | commit | | - * +--------+ | - * | | - * \|/ | - * +--------+ | - * | reset |----+ - * +--------+ - */ - - -//http decoder string -struct http_decoder_string { - hstring refer; // shallow copy - hstring cache; // deep copy - hstring commit; - - enum string_state state; - size_t max_cache_size; -}; - -void http_decoder_string_refer(struct http_decoder_string *rstr, - const char *at, size_t length); - -void http_decoder_string_cache(struct http_decoder_string *rstr); - -void http_decoder_string_commit(struct http_decoder_string *rstr); - -void http_decoder_string_reset(struct http_decoder_string *rstr); - -void http_decoder_string_init(struct http_decoder_string *rstr, - size_t max_cache_size); - -void http_decoder_string_reinit(struct http_decoder_string *rstr); - -enum string_state http_decoder_string_state(const struct http_decoder_string *rstr); - -int http_decoder_string_get(const struct http_decoder_string *rstr, char **name, size_t *name_len); - -void http_decoder_string_dump(struct http_decoder_string *rstr, const char *desc); - \ No newline at end of file diff --git a/decoders/http/http_decoder_table.c b/decoders/http/http_decoder_table.c deleted file mode 100644 index c85b876..0000000 --- a/decoders/http/http_decoder_table.c +++ /dev/null @@ -1,579 +0,0 @@ -#include -#include -#include -#include "http_decoder_private.h" - -#define INIT_HEADER_CNT 16 -#define MAX_URI_CACHE_SIZE 2048 -#define MAX_STATUS_CACHE_SIZE 32 -#define MAX_METHOD_CACHE_SIZE 8 -#define MAX_VERSION_CACHE_SIZE 4 -#define MAX_HEADER_KEY_CACHE_SIZE 4096 -#define MAX_HEADER_VALUE_CACHE_SIZE 4096 - -struct http_decoder_header -{ - struct http_decoder_string key; - struct http_decoder_string val; -}; - -struct http_decoder_table -{ - struct http_decoder_string uri; - struct http_decoder_string status; - struct http_decoder_string method; - struct http_decoder_string version; - struct http_decoder_string body; - - nmx_pool_t *ref_mempool; - int header_complete; // flag for all headers parsed completely - size_t header_cnt; - size_t header_index; // current parsing header - size_t header_iter; // plugins iterate cursor - size_t commit_header_index; // pushed to plugins, whether has called http_message_get0_next_header() - struct http_decoder_header *headers; -}; - -static void http_decoder_table_init(struct http_decoder_table *table) -{ - if (NULL == table) - { - return; - } - - struct http_decoder_header *header = NULL; - assert(table); - - http_decoder_string_init(&table->uri, MAX_URI_CACHE_SIZE); - http_decoder_string_init(&table->status, MAX_STATUS_CACHE_SIZE); - http_decoder_string_init(&table->method, MAX_METHOD_CACHE_SIZE); - http_decoder_string_init(&table->version, MAX_METHOD_CACHE_SIZE); - - for (size_t i = 0; i < table->header_cnt; i++) - { - header = &table->headers[i]; - http_decoder_string_init(&header->key, MAX_HEADER_KEY_CACHE_SIZE); - http_decoder_string_init(&header->val, MAX_HEADER_VALUE_CACHE_SIZE); - } - - http_decoder_string_init(&table->body, 0); -} - -struct http_decoder_table *http_decoder_table_new(nmx_pool_t *mempool) -{ - struct http_decoder_table *table = - MEMPOOL_CALLOC(mempool, struct http_decoder_table, 1); - assert(table); - - table->ref_mempool = mempool; - table->header_cnt = INIT_HEADER_CNT; - table->headers = MEMPOOL_CALLOC(mempool, struct http_decoder_header, - table->header_cnt); - table->commit_header_index = 0; - http_decoder_table_init(table); - - return table; -} - -void http_decoder_table_free(struct http_decoder_table *table) -{ - if (NULL == table) - { - return; - } - if (table->uri.cache.iov_base != NULL) - { - FREE(table->uri.cache.iov_base); - } - if (table->status.cache.iov_base != NULL) - { - FREE(table->status.cache.iov_base); - } - if (table->method.cache.iov_base != NULL) - { - FREE(table->method.cache.iov_base); - } - if (table->version.cache.iov_base != NULL) - { - FREE(table->version.cache.iov_base); - } - if (table->body.cache.iov_base != NULL) - { - FREE(table->body.cache.iov_base); - } - - if (table->headers != NULL) - { - for (size_t i = 0; i < table->header_cnt; i++) - { - if (table->headers[i].key.cache.iov_base != NULL) - { - FREE(table->headers[i].key.cache.iov_base); - } - - if (table->headers[i].val.cache.iov_base != NULL) - { - FREE(table->headers[i].val.cache.iov_base); - } - } - - MEMPOOL_FREE(table->ref_mempool, table->headers); - table->headers = NULL; - } - MEMPOOL_FREE(table->ref_mempool, table); -} - -enum string_state http_decoder_table_state(struct http_decoder_table *table, enum http_item type) -{ - if (NULL == table) - { - return STRING_STATE_INIT; - } - struct http_decoder_header *header = NULL; - enum string_state state = STRING_STATE_INIT; - assert(table); - - switch (type) - { - case HTTP_ITEM_URI: - state = http_decoder_string_state(&table->uri); - break; - case HTTP_ITEM_STATUS: - state = http_decoder_string_state(&table->status); - break; - case HTTP_ITEM_METHOD: - state = http_decoder_string_state(&table->method); - break; - case HTTP_ITEM_VERSION: - state = http_decoder_string_state(&table->version); - break; - case HTTP_ITEM_HDRKEY: - assert(table->header_index < table->header_cnt); - header = &table->headers[table->header_index]; - state = http_decoder_string_state(&header->key); - break; - case HTTP_ITEM_HDRVAL: - assert(table->header_index < table->header_cnt); - header = &table->headers[table->header_index]; - state = http_decoder_string_state(&header->val); - break; - case HTTP_ITEM_BODY: - state = http_decoder_string_state(&table->body); - break; - default: - abort(); - break; - } - - return state; -} - -void http_decoder_table_refer(struct http_decoder_table *table, enum http_item type, const char *at, size_t len) -{ - if (NULL == table) - { - return; - } - - struct http_decoder_header *header = NULL; - assert(table); - - switch (type) - { - case HTTP_ITEM_URI: - http_decoder_string_refer(&table->uri, at, len); - break; - case HTTP_ITEM_STATUS: - http_decoder_string_refer(&table->status, at, len); - break; - case HTTP_ITEM_METHOD: - http_decoder_string_refer(&table->method, at, len); - break; - case HTTP_ITEM_VERSION: - http_decoder_string_refer(&table->version, at, len); - break; - case HTTP_ITEM_HDRKEY: - assert(table->header_index < table->header_cnt); - header = &table->headers[table->header_index]; - http_decoder_string_refer(&header->key, at, len); - break; - case HTTP_ITEM_HDRVAL: - assert(table->header_index < table->header_cnt); - header = &table->headers[table->header_index]; - http_decoder_string_refer(&header->val, at, len); - break; - case HTTP_ITEM_BODY: - http_decoder_string_refer(&table->body, at, len); - break; - default: - abort(); - break; - } -} - -void http_decoder_table_cache(struct http_decoder_table *table, enum http_item type) -{ - if (NULL == table) - { - return; - } - - struct http_decoder_header *header = NULL; - assert(table); - - switch (type) - { - case HTTP_ITEM_URI: - http_decoder_string_cache(&table->uri); - break; - case HTTP_ITEM_STATUS: - http_decoder_string_cache(&table->status); - break; - case HTTP_ITEM_METHOD: - http_decoder_string_cache(&table->method); - break; - case HTTP_ITEM_VERSION: - http_decoder_string_cache(&table->version); - break; - case HTTP_ITEM_HDRKEY: - assert(table->header_index < table->header_cnt); - header = &table->headers[table->header_index]; - http_decoder_string_cache(&header->key); - break; - case HTTP_ITEM_HDRVAL: - assert(table->header_index < table->header_cnt); - header = &table->headers[table->header_index]; - http_decoder_string_cache(&header->val); - break; - case HTTP_ITEM_BODY: - http_decoder_string_cache(&table->body); - break; - default: - abort(); - break; - } -} - -void http_decoder_table_commit(struct http_decoder_table *table, enum http_item type) -{ - if (NULL == table) - { - return; - } - - size_t i = 0; - struct http_decoder_header *header = NULL; - assert(table); - - switch (type) - { - case HTTP_ITEM_URI: - http_decoder_string_commit(&table->uri); - break; - case HTTP_ITEM_STATUS: - http_decoder_string_commit(&table->status); - break; - case HTTP_ITEM_METHOD: - http_decoder_string_commit(&table->method); - break; - case HTTP_ITEM_VERSION: - http_decoder_string_commit(&table->version); - break; - case HTTP_ITEM_HDRKEY: - assert(table->header_index < table->header_cnt); - header = &table->headers[table->header_index]; - http_decoder_string_commit(&header->key); - break; - case HTTP_ITEM_HDRVAL: - header = &table->headers[table->header_index]; - http_decoder_string_commit(&header->val); - // inc index - if ((table->header_index + 1) >= table->header_cnt) - { - struct http_decoder_header *old_headers = table->headers; - table->headers = - MEMPOOL_CALLOC(table->ref_mempool, struct http_decoder_header, - table->header_cnt * 2); - table->header_cnt *= 2; - - for (i = 0; i <= table->header_index; i++) - { - table->headers[i] = old_headers[i]; - } - - MEMPOOL_FREE(table->ref_mempool, old_headers); - - for (i = table->header_index + 1; i < table->header_cnt; i++) - { - header = &table->headers[i]; - memset(header, 0, sizeof(struct http_decoder_header)); - http_decoder_string_init(&header->key, MAX_HEADER_KEY_CACHE_SIZE); - http_decoder_string_init(&header->val, MAX_HEADER_VALUE_CACHE_SIZE); - } - } - table->header_index++; - break; - case HTTP_ITEM_BODY: - http_decoder_string_commit(&table->body); - break; - default: - abort(); - break; - } -} - -void http_decoder_table_reset(struct http_decoder_table *table, enum http_item type) -{ - if (NULL == table) - { - return; - } - - struct http_decoder_header *header = NULL; - assert(table); - - switch (type) - { - case HTTP_ITEM_URI: - http_decoder_string_reset(&table->uri); - break; - case HTTP_ITEM_STATUS: - http_decoder_string_reset(&table->status); - break; - case HTTP_ITEM_METHOD: - http_decoder_string_reset(&table->method); - break; - case HTTP_ITEM_VERSION: - http_decoder_string_reset(&table->version); - break; - case HTTP_ITEM_HDRKEY: - header = &table->headers[table->header_index]; - http_decoder_string_reset(&header->key); - break; - case HTTP_ITEM_HDRVAL: - header = &table->headers[table->header_index]; - http_decoder_string_reset(&header->val); - break; - case HTTP_ITEM_BODY: - http_decoder_string_reset(&table->body); - break; - default: - abort(); - break; - } -} - -void http_decoder_table_reinit(struct http_decoder_table *table) -{ - assert(table); - struct http_decoder_header *header = NULL; - - http_decoder_string_reinit(&table->uri); - http_decoder_string_reinit(&table->status); - http_decoder_string_reinit(&table->method); - http_decoder_string_reinit(&table->version); - // for (size_t i = 0; i < table->header_iter; i++) { - for (size_t i = 0; i < table->commit_header_index; i++) - { - // todo, reset header_index, avoid realloc headers as much as possible - header = &table->headers[i]; - http_decoder_string_reinit(&header->key); - http_decoder_string_reinit(&header->val); - } - - http_decoder_string_reinit(&table->body); -} - -void http_decoder_table_dump(struct http_decoder_table *table) -{ - if (NULL == table) - { - return; - } - - http_decoder_string_dump(&table->uri, "uri"); - http_decoder_string_dump(&table->status, "status"); - http_decoder_string_dump(&table->method, "method"); - http_decoder_string_dump(&table->version, "version"); - http_decoder_string_dump(&table->body, "body"); - - for (size_t i = 0; i < table->header_cnt; i++) - { - struct http_decoder_header *header = &table->headers[i]; - if (NULL == header) - { - continue; - } - - http_decoder_string_dump(&header->key, "key"); - http_decoder_string_dump(&header->val, "val"); - } -} - -int http_decoder_table_get_uri(const struct http_decoder_table *table, char **out, size_t *out_len) -{ - if (NULL == table || NULL == out) - { - return -1; - } - return http_decoder_string_get(&table->uri, out, out_len); -} - -int http_decoder_table_get_method(const struct http_decoder_table *table, char **out, size_t *out_len) -{ - if (NULL == table || NULL == out) - { - return -1; - } - return http_decoder_string_get(&table->method, out, out_len); -} - -int http_decoder_table_get_status(const struct http_decoder_table *table, char **out, size_t *out_len) -{ - if (NULL == table || NULL == out) - { - return -1; - } - return http_decoder_string_get(&table->status, out, out_len); -} - -int http_decoder_table_get_version(const struct http_decoder_table *table, char **out, size_t *out_len) -{ - if (NULL == table || NULL == out) - { - return -1; - } - return http_decoder_string_get(&table->version, out, out_len); -} - -int http_decoder_table_get_body(const struct http_decoder_table *table, char **out, size_t *out_len) -{ - if (NULL == table || NULL == out) - { - return -1; - } - return http_decoder_string_get(&table->body, (char **)out, out_len); -} - -int http_decoder_table_get_header(const struct http_decoder_table *table, const char *name, size_t name_len, - struct http_header_field *hdr_result) -{ - for (size_t i = 0; i < table->header_cnt; i++) - { - const struct http_decoder_header *tmp_header = &table->headers[i]; - if (tmp_header->key.commit.iov_len != name_len) - { - continue; - } - - if (http_decoder_string_state(&tmp_header->key) == STRING_STATE_COMMIT && - http_decoder_string_state(&tmp_header->val) == STRING_STATE_COMMIT) - { - hstring tmp_key; - http_decoder_string_get(&tmp_header->key, (char **)&tmp_key.iov_base, &tmp_key.iov_len); - - if (tmp_key.iov_len == name_len && - (0 == strncasecmp((char *)tmp_key.iov_base, name, name_len))) - { - http_decoder_string_get(&tmp_header->key, &hdr_result->name, &hdr_result->name_len); - http_decoder_string_get(&tmp_header->val, &hdr_result->value, &hdr_result->value_len); - return 0; - } - } - } - return -1; -} - -int http_decoder_table_iter_header(struct http_decoder_table *table, struct http_header_field *hdr) -{ - if (NULL == table || NULL == hdr) - { - return -1; - } - if (table->header_iter >= table->header_cnt) - { - return -1; - } - - struct http_decoder_header *tmp_header = &table->headers[table->header_iter]; - if (tmp_header != NULL) - { - if (http_decoder_string_state(&tmp_header->key) == STRING_STATE_COMMIT && - http_decoder_string_state(&tmp_header->val) == STRING_STATE_COMMIT) - { - - http_decoder_string_get(&tmp_header->key, &hdr->name, &hdr->name_len); - http_decoder_string_get(&tmp_header->val, &hdr->value, &hdr->value_len); - table->header_iter++; - return 1; - } - } - - hdr->name = NULL; - hdr->name_len = 0; - hdr->value = NULL; - hdr->value_len = 0; - - return -1; -} - -int http_decoder_table_reset_header_iter(struct http_decoder_table *table) -{ - table->header_iter = 0; - return 0; -} - -int http_decoder_table_has_parsed_header(struct http_decoder_table *table) -{ - // if (NULL == table || (table->header_iter == table->header_index)) { - if (NULL == table || (table->commit_header_index == table->header_index)) - { - return 0; - } - - const struct http_decoder_header *tmp_header = &table->headers[table->header_iter]; - - if (http_decoder_string_state(&tmp_header->key) == STRING_STATE_COMMIT && http_decoder_string_state(&tmp_header->val) == STRING_STATE_COMMIT) - { - return 1; - } - - return 0; -} - -int http_decoder_table_header_complete(struct http_decoder_table *table) -{ - if (NULL == table) - { - return -1; - } - return table->header_complete; -} - -void http_decoder_table_set_header_complete(struct http_decoder_table *table) -{ - if (NULL == table) - { - return; - } - table->header_complete = 1; -} - -void http_decoder_table_reset_header_complete(struct http_decoder_table *table) -{ - if (NULL == table) - { - return; - } - table->header_complete = 0; -} - -void http_decoder_table_update_commit_index(struct http_decoder_table *table) -{ - table->commit_header_index = table->header_index; -} - -int http_decoder_table_get_total_parsed_header(struct http_decoder_table *table) -{ - return table->header_index; -} \ No newline at end of file diff --git a/decoders/http/http_decoder_table.h b/decoders/http/http_decoder_table.h deleted file mode 100644 index 9a8d948..0000000 --- a/decoders/http/http_decoder_table.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once -#include -#include "stellar/http.h" -#include "http_decoder_private.h" -#include "http_decoder_string.h" - -enum http_item -{ - HTTP_ITEM_URI = 0x01, - HTTP_ITEM_STATUS = 0x02, - HTTP_ITEM_METHOD = 0x03, - HTTP_ITEM_VERSION = 0x04, - HTTP_ITEM_HDRKEY = 0x05, - HTTP_ITEM_HDRVAL = 0x06, - HTTP_ITEM_BODY = 0x07, -}; - -struct http_decoder_table; -struct http_decoder_table *http_decoder_table_new(nmx_pool_t *mempool); - -void http_decoder_table_free(struct http_decoder_table *table); - -enum string_state -http_decoder_table_state(struct http_decoder_table *table, enum http_item type); - -void http_decoder_table_refer(struct http_decoder_table *table, enum http_item type, - const char *at, size_t len); - -void http_decoder_table_cache(struct http_decoder_table *table, enum http_item type); - -void http_decoder_table_commit(struct http_decoder_table *table, enum http_item type); - -void http_decoder_table_reset(struct http_decoder_table *table, enum http_item type); - -void http_decoder_table_reinit(struct http_decoder_table *table); - -void http_decoder_table_dump(struct http_decoder_table *table); - -int http_decoder_table_get_uri(const struct http_decoder_table *table, char **out, size_t *out_len); - -int http_decoder_table_get_method(const struct http_decoder_table *table, char **out, size_t *out_len); - -int http_decoder_table_get_status(const struct http_decoder_table *table, char **out, size_t *out_len); - -int http_decoder_table_get_version(const struct http_decoder_table *table, char **out, size_t *out_len); - -int http_decoder_table_get_body(const struct http_decoder_table *table, char **out, size_t *out_len); - -int http_decoder_table_get_header(const struct http_decoder_table *table, - const char *name, size_t name_len, - struct http_header_field *hdr_res); - -int http_decoder_table_iter_header(struct http_decoder_table *table, - struct http_header_field *hdr); -int http_decoder_table_reset_header_iter(struct http_decoder_table *table); -/** - * @brief Is there a parsed header - * - * @retval yes(1) no(0) - */ -int http_decoder_table_has_parsed_header(struct http_decoder_table *table); - -/** - * @brief If headers have been parsed completely - * - * @retval yes(1) no(0) - */ -int http_decoder_table_header_complete(struct http_decoder_table *table); - -/** - * @brief set flag for headers parsed completely - */ -void http_decoder_table_set_header_complete(struct http_decoder_table *table); - -void http_decoder_table_reset_header_complete(struct http_decoder_table *table); - -void http_decoder_table_update_commit_index(struct http_decoder_table *table); - -int http_decoder_table_get_total_parsed_header(struct http_decoder_table *table); diff --git a/decoders/http/http_decoder_tunnel.c b/decoders/http/http_decoder_tunnel.c deleted file mode 100644 index a6abda8..0000000 --- a/decoders/http/http_decoder_tunnel.c +++ /dev/null @@ -1,116 +0,0 @@ -#include -#include -#include -#include -#include -#include "http_decoder_private.h" -#include "llhttp.h" - -struct http_tunnel_message -{ - enum http_tunnel_message_type type; - hstring tunnel_payload; -}; - -int httpd_tunnel_identify(struct http_decoder_env *httpd_env, int curdir, struct http_decoder_half_data *hfdata) -{ - if (0 == httpd_env->hd_cfg.proxy_enable) - { - return 0; - } - - if (FLOW_TYPE_C2S == curdir) - { - struct http_request_line reqline = {}; - http_decoder_half_data_get_request_line(hfdata, &reqline); - if (0 == http_strncasecmp_safe("CONNECT", (char *)reqline.method, - 7, reqline.method_len)) - { - return 1; - } - } - else - { - struct http_response_line resline = {}; - http_decoder_half_data_get_response_line(hfdata, &resline); - if (resline.status_code == HTTP_STATUS_OK && 0 == http_strncasecmp_safe("Connection established", (char *)resline.status, - strlen("Connection established"), resline.status_len)) - { - return 1; - } - } - - return 0; -} - -int httpd_is_tunnel_session(const struct http_decoder_env *httpd_env, const struct http_decoder_exdata *ex_data) -{ - if (0 == httpd_env->hd_cfg.proxy_enable) - { - return 0; - } - return (ex_data && ex_data->tunnel_state != HTTP_TUN_NON); -} - -int httpd_in_tunnel_transmitting(const struct http_decoder_env *httpd_env, struct http_decoder_exdata *ex_data) -{ - if (0 == httpd_env->hd_cfg.proxy_enable) - { - return 0; - } - return (ex_data && ex_data->tunnel_state >= HTTP_TUN_INNER_STARTING); -} - -enum http_tunnel_message_type httpd_tunnel_state_to_msg(const struct http_decoder_exdata *ex_data) -{ - if (ex_data->tunnel_state == HTTP_TUN_INNER_STARTING) - { - return HTTP_TUNNEL_OPENING; - } - if (ex_data->tunnel_state == HTTP_TUN_INNER_TRANS) - { - return HTTP_TUNNEL_ACTIVE; - } - return HTTP_TUNNEL_MSG_MAX; -} - -void httpd_tunnel_state_update(struct http_decoder_exdata *ex_data) -{ - if (ex_data->tunnel_state == HTTP_TUN_INNER_STARTING) - { - ex_data->tunnel_state = HTTP_TUN_INNER_TRANS; - } -} - -void http_decoder_push_tunnel_data(struct session *sess, const struct http_decoder_exdata *exdata, enum http_tunnel_message_type type, const char *payload, uint16_t payload_len) -{ - struct http_tunnel_message *tmsg = (struct http_tunnel_message *)CALLOC(struct http_tunnel_message, 1); - tmsg->type = type; - tmsg->tunnel_payload.iov_base = (char *)payload; - tmsg->tunnel_payload.iov_len = payload_len; - session_mq_publish_message(sess, exdata->pub_topic_id, tmsg); -} - -#ifdef __cplusplus -extern "C" -{ -#endif - void http_tunnel_message_get_payload(const struct http_tunnel_message *tmsg, - hstring *tunnel_payload) - { - if (unlikely(NULL == tmsg || tunnel_payload == NULL)) - { - return; - } - tunnel_payload->iov_base = tmsg->tunnel_payload.iov_base; - tunnel_payload->iov_len = tmsg->tunnel_payload.iov_len; - } - - enum http_tunnel_message_type http_tunnel_message_type_get(const struct http_tunnel_message *tmsg) - { - return tmsg->type; - } - -#ifdef __cplusplus -} -#endif diff --git a/decoders/http/http_decoder_tunnel.h b/decoders/http/http_decoder_tunnel.h deleted file mode 100644 index 52882e5..0000000 --- a/decoders/http/http_decoder_tunnel.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -#include "http_decoder_private.h" -#include "http_decoder_half.h" - -enum http_tunnel_state -{ - HTTP_TUN_NON = 0, // init, or not tunnel session - HTTP_TUN_C2S_HDR_START, // CONNECT ... - HTTP_TUN_C2S_END, // CONNECT request end - HTTP_TUN_S2C_START, // HTTP 200 connet established - HTTP_TUN_INNER_STARTING, // http inner tunnel protocol starting - HTTP_TUN_INNER_TRANS, // http inner tunnel protocol transmitting -}; - -/************************************************************ - * HTTP TUNNEL WITH CONNECT METHOD. - *************************************************************/ -struct http_tunnel_message; -#define HTTP_DECODER_TUNNEL_TOPIC "HTTP_DECODER_TUNNEL_MESSAGE" - -enum http_tunnel_message_type -{ - HTTP_TUNNEL_OPENING, - HTTP_TUNNEL_ACTIVE, - HTTP_TUNNEL_CLOSING, - HTTP_TUNNEL_MSG_MAX -}; -enum http_tunnel_message_type http_tunnel_message_type_get(const struct http_tunnel_message *tmsg); -void http_tunnel_message_get_payload(const struct http_tunnel_message *tmsg, struct iovec *tunnel_payload); - -int httpd_tunnel_identify(struct http_decoder_env *httpd_env, int curdir, struct http_decoder_half_data *hfdata); -int httpd_is_tunnel_session(const struct http_decoder_env *httpd_env, const struct http_decoder_exdata *ex_data); -int httpd_in_tunnel_transmitting(const struct http_decoder_env *httpd_env, struct http_decoder_exdata *ex_data); -void httpd_tunnel_state_update(struct http_decoder_exdata *ex_data); -void http_decoder_push_tunnel_data(struct session *sess, const struct http_decoder_exdata *exdata, enum http_tunnel_message_type type, const char *payload, uint16_t payload_len); -enum http_tunnel_message_type httpd_tunnel_state_to_msg(const struct http_decoder_exdata *ex_data); \ No newline at end of file diff --git a/decoders/http/http_decoder_utils.c b/decoders/http/http_decoder_utils.c index 08c66b0..b121467 100644 --- a/decoders/http/http_decoder_utils.c +++ b/decoders/http/http_decoder_utils.c @@ -1,7 +1,9 @@ #include #include +#include #include "stellar/http.h" #include "http_decoder_private.h" +#include "llhttp.h" char *http_safe_dup(const char *str, size_t len) { @@ -33,14 +35,8 @@ const char *http_message_type_to_string(enum http_message_type type) switch (type) { - case HTTP_MESSAGE_REQ_LINE: - sname = "HTTP_MESSAGE_REQ_LINE"; - break; - case HTTP_MESSAGE_REQ_HEADER: - sname = "HTTP_MESSAGE_REQ_HEADER"; - break; - case HTTP_MESSAGE_REQ_HEADER_END: - sname = "HTTP_MESSAGE_REQ_HEADER_END"; + case HTTP_MESSAGE_REQ_LINE_HEADERS: + sname = "HTTP_MESSAGE_REQ_LINE_HEADERS"; break; case HTTP_MESSAGE_REQ_BODY_START: sname = "HTTP_MESSAGE_REQ_BODY_START"; @@ -51,14 +47,8 @@ const char *http_message_type_to_string(enum http_message_type type) case HTTP_MESSAGE_REQ_BODY_END: sname = "HTTP_MESSAGE_REQ_BODY_END"; break; - case HTTP_MESSAGE_RES_LINE: - sname = "HTTP_MESSAGE_RES_LINE"; - break; - case HTTP_MESSAGE_RES_HEADER: - sname = "HTTP_MESSAGE_RES_HEADER"; - break; - case HTTP_MESSAGE_RES_HEADER_END: - sname = "HTTP_MESSAGE_RES_HEADER_END"; + case HTTP_MESSAGE_RES_LINE_HEADERS: + sname = "HTTP_MESSAGE_RES_LINE_HEADERS"; break; case HTTP_MESSAGE_RES_BODY_START: sname = "HTTP_MESSAGE_RES_BODY_START"; @@ -89,18 +79,14 @@ int http_message_type_is_req(struct session *sess, enum http_message_type msg_ty switch (msg_type) { - case HTTP_MESSAGE_REQ_LINE: - case HTTP_MESSAGE_REQ_HEADER: - case HTTP_MESSAGE_REQ_HEADER_END: + case HTTP_MESSAGE_REQ_LINE_HEADERS: case HTTP_MESSAGE_REQ_BODY_START: case HTTP_MESSAGE_REQ_BODY: case HTTP_MESSAGE_REQ_BODY_END: is_req_msg = 1; break; - case HTTP_MESSAGE_RES_LINE: - case HTTP_MESSAGE_RES_HEADER: - case HTTP_MESSAGE_RES_HEADER_END: + case HTTP_MESSAGE_RES_LINE_HEADERS: case HTTP_MESSAGE_RES_BODY_START: case HTTP_MESSAGE_RES_BODY: case HTTP_MESSAGE_RES_BODY_END: @@ -308,4 +294,203 @@ void httpd_session_get_addr(const struct session *sess, struct httpd_session_add break; } } +} + +void http_session_addr_ntop(const struct httpd_session_addr *sesaddr, char *buf, size_t buflen) +{ + char sip_str[INET6_ADDRSTRLEN] = {0}; + char dip_str[INET6_ADDRSTRLEN] = {0}; + uint16_t sport_host, dport_host; + if (sesaddr->ipver == 4) + { + inet_ntop(AF_INET, &sesaddr->saddr4, sip_str, sizeof(sip_str)); + inet_ntop(AF_INET, &sesaddr->daddr4, dip_str, sizeof(dip_str)); + } + else if (sesaddr->ipver == 6) + { + inet_ntop(AF_INET6, &sesaddr->saddr6, sip_str, sizeof(sip_str)); + inet_ntop(AF_INET6, &sesaddr->daddr6, dip_str, sizeof(dip_str)); + } + sport_host = ntohs(sesaddr->sport); + dport_host = ntohs(sesaddr->dport); + snprintf(buf, buflen, "%s:%u-%s:%u", sip_str, sport_host, dip_str, dport_host); +} + +struct http_buffer *http_buffer_new(void) +{ + struct http_buffer *buffer = CALLOC(struct http_buffer, 1); + buffer->buffer = NULL; + buffer->buffer_size = 0; + return buffer; +} + +void http_buffer_free(struct http_buffer *buffer) +{ + if (NULL == buffer) + { + return; + } + FREE(buffer->buffer); + FREE(buffer); +} + +int http_buffer_add(struct http_buffer *buffer, const char *data, size_t data_len) +{ + if (NULL == buffer || NULL == data || 0 == data_len) + { + return -1; + } + buffer->buffer = REALLOC(char, buffer->buffer, buffer->buffer_size + data_len); + memcpy(buffer->buffer + buffer->buffer_size, data, data_len); + buffer->buffer_size += data_len; + return 0; +} + +int http_buffer_read(struct http_buffer *buffer, char **data, size_t *data_len) +{ + if (NULL == buffer) + { + if (data) + { + *data = NULL; + } + if (data_len) + { + *data_len = 0; + } + return -1; + } + *data = buffer->buffer; + *data_len = buffer->buffer_size; + return 0; +} + +char *http_string_dup(const char *str, size_t len) +{ + if (NULL == str || 0 == len) + { + return NULL; + } + char *new_str = ALLOC(char, len); + memcpy(new_str, str, len); + return new_str; +} + +enum http_method_type http_get_method(const char *method, size_t method_len) +{ + enum http_method_type type = HTTP_METHOD_UNKNOWN; + + if (NULL == method || 0 == method_len) + { + return type; + } + + if (http_strncasecmp_safe(method, "GET", method_len, 3) == 0) + { + type = HTTP_METHOD_GET; + } + else if (http_strncasecmp_safe(method, "POST", method_len, 4) == 0) + { + type = HTTP_METHOD_POST; + } + else if (http_strncasecmp_safe(method, "HEAD", method_len, 4) == 0) + { + type = HTTP_METHOD_HEAD; + } + else if (http_strncasecmp_safe(method, "PUT", method_len, 3) == 0) + { + type = HTTP_METHOD_PUT; + } + else if (http_strncasecmp_safe(method, "DELETE", method_len, 6) == 0) + { + type = HTTP_METHOD_DELETE; + } + else if (http_strncasecmp_safe(method, "CONNECT", method_len, 7) == 0) + { + type = HTTP_METHOD_CONNECT; + } + else if (http_strncasecmp_safe(method, "OPTIONS", method_len, 7) == 0) + { + type = HTTP_METHOD_OPTIONS; + } + + return type; +} + +long long http_strtoll(const char *str, size_t strlen) +{ + if (NULL == str || 0 == strlen || strlen >= 19 /* INT64_MAX */) + { + return 0; + } + char tmp_str[strlen + 1]; + memcpy(tmp_str, str, strlen); + tmp_str[strlen] = '\0'; + return strtoll(tmp_str, NULL, 10); +} + +/* + * return value: + * EOF offset of beggining. + */ +size_t http_line_header_completed(const char *data, size_t data_len) +{ + if (data_len < 4) //"\r\n\r\n" + { + return 0; + } + void *ptr = memmem(data, data_len, "\r\n\r\n", 4); + if (ptr != NULL) + { + return (char *)ptr - data + 4; + } + return 0; +} + +int http_protocol_identify(const char *data, size_t data_len) +{ + llhttp_t parser; + llhttp_settings_t settings; + enum llhttp_errno error; + + if (NULL == data || 0 == data_len) + { + return -1; + } + llhttp_settings_init(&settings); + llhttp_init(&parser, HTTP_BOTH, &settings); + + data_len = MIN(HTTP_IDENTIFY_LEN, data_len); + error = llhttp_execute(&parser, data, data_len); + if (error != HPE_OK) + { + return -1; + } + return 1; +} + +void http_truncate_extract_headers(const char *raw_data, size_t raw_data_len, const char **headers_start, const char **headers_end) +{ + const char *start = memmem(raw_data, raw_data_len, "\r\n", 2); + if (start != NULL) + { + start += 2; + *headers_start = start; + } + else + { + *headers_start = NULL; + } + const char *end = memmem(raw_data, raw_data_len, "\r\n\r\n", 4); + if (end != NULL) + { + end += 4; + *headers_end = end; + } + else + { + *headers_start = NULL; + *headers_end = NULL; + } + return; } \ No newline at end of file diff --git a/decoders/http/http_decoder_utils.h b/decoders/http/http_decoder_utils.h index 01a32b2..b6f5bff 100644 --- a/decoders/http/http_decoder_utils.h +++ b/decoders/http/http_decoder_utils.h @@ -12,6 +12,7 @@ extern "C" #include "stellar/session.h" #include "stellar/stellar_mq.h" #include "stellar/stellar_exdata.h" +#include "llhttp.h" #ifdef __cplusplus } #endif @@ -71,9 +72,32 @@ struct httpd_session_addr union { uint32_t saddr4; - uint32_t daddr4; struct in6_addr saddr6; + }; + union + { + uint32_t daddr4; struct in6_addr daddr6; }; }; +/* + why not use libevent evbuffer? + 1. evbuffer is a buffer chain, it is not suitable for http half flow cache; + 2. http_half_flow_buffer is a whole continuous buffer; + */ +struct http_buffer +{ + char *buffer; + size_t buffer_size; +}; +int http_protocol_identify(const char *data, size_t data_len); void httpd_session_get_addr(const struct session *sess, struct httpd_session_addr *addr); +void http_session_addr_ntop(const struct httpd_session_addr *sesaddr, char *buf, size_t buflen); +struct http_buffer *http_buffer_new(void); +void http_buffer_free(struct http_buffer *buffer); +int http_buffer_add(struct http_buffer *buffer, const char *data, size_t data_len); +int http_buffer_read(struct http_buffer *buffer, char **data, size_t *data_len); +char *http_string_dup(const char *str, size_t len); +long long http_strtoll(const char *str, size_t strlen); +size_t http_line_header_completed(const char *data, size_t data_len); +void http_truncate_extract_headers(const char *raw_data, size_t raw_data_len, const char **headers_start, const char **headers_end); \ No newline at end of file diff --git a/decoders/http/version.map b/decoders/http/version.map index a64b729..eacc6bc 100644 --- a/decoders/http/version.map +++ b/decoders/http/version.map @@ -6,6 +6,7 @@ global: http_decoder_exit; http_decoder_tcp_stream_msg_cb; http_url_decode; + http_get_method; }; local: *; }; \ No newline at end of file diff --git a/include/stellar/http.h b/include/stellar/http.h index 1cc5bec..5f8fe80 100644 --- a/include/stellar/http.h +++ b/include/stellar/http.h @@ -12,16 +12,12 @@ extern "C" { HTTP_TRANSACTION_START, - HTTP_MESSAGE_REQ_LINE, - HTTP_MESSAGE_REQ_HEADER, - HTTP_MESSAGE_REQ_HEADER_END, // todo, delete END, push all fileds at once + HTTP_MESSAGE_REQ_LINE_HEADERS, HTTP_MESSAGE_REQ_BODY_START, HTTP_MESSAGE_REQ_BODY, HTTP_MESSAGE_REQ_BODY_END, - HTTP_MESSAGE_RES_LINE, - HTTP_MESSAGE_RES_HEADER, - HTTP_MESSAGE_RES_HEADER_END, // todo, delete END, push all fileds at once + HTTP_MESSAGE_RES_LINE_HEADERS, HTTP_MESSAGE_RES_BODY_START, HTTP_MESSAGE_RES_BODY, HTTP_MESSAGE_RES_BODY_END, @@ -31,32 +27,44 @@ extern "C" HTTP_MESSAGE_MAX }; + enum http_method_type + { + HTTP_METHOD_DELETE = 0, + HTTP_METHOD_GET = 1, + HTTP_METHOD_HEAD = 2, + HTTP_METHOD_POST = 3, + HTTP_METHOD_PUT = 4, + HTTP_METHOD_CONNECT = 5, + HTTP_METHOD_OPTIONS = 6, + + HTTP_METHOD_UNKNOWN = 255, + }; + struct http_header_field { - char *name; + const char *name; size_t name_len; - char *value; + const char *value; size_t value_len; }; struct http_request_line { - char *method; + const char *method; size_t method_len; - char *uri; + const char *uri; size_t uri_len; - char *version; + const char *version; size_t version_len; - int major_version; int minor_version; }; struct http_response_line { - char *version; + const char *version; size_t version_len; - char *status; + const char *status; size_t status_len; int major_version; int minor_version; @@ -64,47 +72,40 @@ extern "C" }; enum http_message_type http_message_get_type(const struct http_message *msg); + enum http_method_type http_get_method(const char *method, size_t method_len); + const struct http_request_line *http_message_get0_request_line(const struct http_message *msg); + const struct http_response_line *http_message_get0_response_line(const struct http_message *msg); - void http_message_get0_request_line(const struct http_message *msg, struct http_request_line *line); - - void http_message_get0_response_line(const struct http_message *msg, struct http_response_line *line); + void http_message_get0_headers_intergration(const struct http_message *msg, const char **headers, size_t *headers_len); /* - * Pay attention: key->iov_base is case-insensitive. - */ - void http_message_get0_header(const struct http_message *msg, const char *name, size_t name_len, struct http_header_field *field_result); - - /** - * @brief loop reading all headers. - * - * @retval succeed( >= 0) failed(-1) + * Pay attention: field name is case-insensitive. */ - int http_message_get0_next_header(const struct http_message *msg, struct http_header_field *header); + const struct http_header_field *http_message_get0_header(const struct http_message *msg, const char *field_name, size_t field_name_len); /** - * @retval succeed( >= 0) failed(-1) + * The first time, set param 'header' as NULL, and the subsequent calls use return value until result is NULL. + * return value: + * not-NULL: success + * NULL: empty or EOF */ - int http_message_reset_header_iter(struct http_message *msg); // to do , obsoleted - - void http_message_get0_uncompressed_body(const struct http_message *msg, const char **body, size_t *body_len); + const struct http_header_field *http_message_get0_next_header(const struct http_message *msg, const struct http_header_field *header); - /** - * @brief If the body hasn't been compressed, same as http_message_get0_uncompressed_body(). - * - */ - void http_message_get0_decompressed_body(const struct http_message *msg, const char **body, size_t *body_len); + void http_message_get0_uncompressed_body(const struct http_message *msg, const char **uncompressed_body, size_t *uncompressed_len); + void http_message_get0_decompressed_body(const struct http_message *msg, const char **decompressed_body, size_t *decompressed_len); void http_message_get0_raw_url(const struct http_message *msg, const char **url, size_t *url_len); - /* return value: 0: failed - >1: success, length of decoded_url_buffer, not C string( no EOF with '\0' ) + >1: success, length of decoded url. Pay attention: decoded url is not C string (no EOF with '\0')! */ size_t http_url_decode(const char *raw_url, size_t raw_url_len, char *decoded_url_buffer, size_t decoded_url_buffer_len); /** - * @retval succeed( >= 0) failed(-1) + * return value: + * >= 0 : success + * -1: failed */ int http_message_get_transaction_seq(const struct http_message *msg); diff --git a/include/stellar/utils.h b/include/stellar/utils.h index 3d6ab43..826ced0 100644 --- a/include/stellar/utils.h +++ b/include/stellar/utils.h @@ -10,7 +10,7 @@ #define FREE(p) \ { \ - free(p); \ + free((void *)p); \ p = NULL; \ } diff --git a/test/decoders/http/CMakeLists.txt b/test/decoders/http/CMakeLists.txt index 5011a95..a8f0b83 100644 --- a/test/decoders/http/CMakeLists.txt +++ b/test/decoders/http/CMakeLists.txt @@ -11,8 +11,8 @@ include_directories(${CMAKE_SOURCE_DIR}/deps) include_directories(${PROJECT_SOURCE_DIR}/decoders/http) include_directories(${PROJECT_SOURCE_DIR}/include/stellar) -add_executable(gtest_http http_gtest.cpp ${PROJECT_SOURCE_DIR}/decoders/http/http_decoder_utils.c ${PROJECT_SOURCE_DIR}/decoders/http/http_content_decompress.c ${PROJECT_SOURCE_DIR}/deps/md5/md5.c) -target_link_libraries(gtest_http gtest stellar_lib llhttp-static z brotli-dec-static brotli-enc-static brotli-common-static libevent-static) +add_executable(gtest_http http_gtest.cpp ${PROJECT_SOURCE_DIR}/decoders/http/http_decoder_utils.c ${PROJECT_SOURCE_DIR}/decoders/http/http_decoder_stat.c ${PROJECT_SOURCE_DIR}/decoders/http/http_content_decompress.c ${PROJECT_SOURCE_DIR}/deps/md5/md5.c) +target_link_libraries(gtest_http nmx_pool gtest stellar_lib llhttp-static z brotli-dec-static brotli-enc-static brotli-common-static fieldstat4) add_executable(http_test_main plugin_test_main.cpp) set_target_properties(http_test_main diff --git a/test/decoders/http/benchmarks/json/http_chn_encode_url.json b/test/decoders/http/benchmarks/json/http_chn_encode_url.json index 5453415..e5be533 100644 --- a/test/decoders/http/benchmarks/json/http_chn_encode_url.json +++ b/test/decoders/http/benchmarks/json/http_chn_encode_url.json @@ -20,7 +20,8 @@ "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Cookie": "_gcl_au=1.1.240068387.1720059437; _ga_CGYVD7S4G4=GS1.1.1720059448.3.0.1720059453.0.0.0; HMF_CI=7967e38cc3874dbbefa260b8dcbee31fa827a01fc2b7073105a5e05f4a1ea361c74f6d4c37fb199bfc9470036f06fb537da2a74e96450b7949e0b686f0569f9680; HMY_JC=84f9c8a99e076ee2dda5ba48cd953f61c4dc2707823205d8171c8818eea9d60fda,; _ga=GA1.3.822493162.1711101509; _gid=GA1.3.304369429.1721120134; arialoadData=true; ariawapChangeViewPort=false; C3VK=be8842; HBB_HC=faa7f3e2477e14525534a5560ed6a307b29ae2c324e1f631a428e53fb74c9d72575c155d682554ba15cc9e52afe31218b1; mbox=check#true#1721120252|session#1721120133635-517642#1721122052; s_pers=%20s_fid%3D52863027521849CD-3A72894997C48527%7C1878886591105%3B; s_sess=%20s_cc%3Dtrue%3B", "__X_HTTP_URL": "www.airchina.com.cn/%E6%B5%8B%E8%AF%95%E4%B8%AD%E6%96%87URL%E7%BC%96%E8%A7%A3%E7%A0%81", - "__X_HTTP_DECODED_URL": "www.airchina.com.cn/测试中文URL编解码" + "__X_HTTP_DECODED_URL": "www.airchina.com.cn/测试中文URL编解码", + "__X_HTTP_HEADERS_INTERGRATION": "Host: www.airchina.com.cn\r\nConnection: keep-alive\r\nDNT: 1\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\nCookie: _gcl_au=1.1.240068387.1720059437; _ga_CGYVD7S4G4=GS1.1.1720059448.3.0.1720059453.0.0.0; HMF_CI=7967e38cc3874dbbefa260b8dcbee31fa827a01fc2b7073105a5e05f4a1ea361c74f6d4c37fb199bfc9470036f06fb537da2a74e96450b7949e0b686f0569f9680; HMY_JC=84f9c8a99e076ee2dda5ba48cd953f61c4dc2707823205d8171c8818eea9d60fda,; _ga=GA1.3.822493162.1711101509; _gid=GA1.3.304369429.1721120134; arialoadData=true; ariawapChangeViewPort=false; C3VK=be8842; HBB_HC=faa7f3e2477e14525534a5560ed6a307b29ae2c324e1f631a428e53fb74c9d72575c155d682554ba15cc9e52afe31218b1; mbox=check#true#1721120252|session#1721120133635-517642#1721122052; s_pers=%20s_fid%3D52863027521849CD-3A72894997C48527%7C1878886591105%3B; s_sess=%20s_cc%3Dtrue%3B\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -37,6 +38,7 @@ "Location": "https://www.airchina.com.cn/%E6%B5%8B%E8%AF%95%E4%B8%AD%E6%96%87URL%E7%BC%96%E8%A7%A3%E7%A0%81", "x-ws-origin-error": "-", "X-Via": "1.1 PSjsczBGPiv194:0 (Cdn Cache Server V2.0), 1.1 PStjdxpn34:6 (Cdn Cache Server V2.0)", - "X-Ws-Request-Id": "669635fc_PStjdxks32_7630-15285" + "X-Ws-Request-Id": "669635fc_PStjdxks32_7630-15285", + "__X_HTTP_HEADERS_INTERGRATION": "Date: Tue, 16 Jul 2024 08:57:32 GMT\r\nContent-Length: 0\r\nConnection: keep-alive\r\nServer: waf/4.39.0-0.el7\r\nLocation: https://www.airchina.com.cn/%E6%B5%8B%E8%AF%95%E4%B8%AD%E6%96%87URL%E7%BC%96%E8%A7%A3%E7%A0%81\r\nx-ws-origin-error: -\r\nX-Via: 1.1 PSjsczBGPiv194:0 (Cdn Cache Server V2.0), 1.1 PStjdxpn34:6 (Cdn Cache Server V2.0)\r\nX-Ws-Request-Id: 669635fc_PStjdxks32_7630-15285\r\n\r\n" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_chunked_res_gzip.json b/test/decoders/http/benchmarks/json/http_chunked_res_gzip.json index 370b4a7..eea5353 100644 --- a/test/decoders/http/benchmarks/json/http_chunked_res_gzip.json +++ b/test/decoders/http/benchmarks/json/http_chunked_res_gzip.json @@ -15,7 +15,8 @@ "Accept": "*/*", "Connection": "close", "Accept-Encoding": "chunked, gzip", - "__X_HTTP_URL": "www.wireshark.org:8080/" + "__X_HTTP_URL": "www.wireshark.org:8080/", + "__X_HTTP_HEADERS_INTERGRATION": "Host: www.wireshark.org:8080\r\nUser-Agent: curl/7.46.0\r\nAccept: */*\r\nConnection: close\r\nAccept-Encoding: chunked, gzip\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -40,7 +41,8 @@ "X-Slogan1": "Go deep.", "CF-RAY": "260a3f709d7b0761-AMS", "Content-Encoding": "gzip", - "__X_HTTP_RAW_PAYLOAD_MD5": "5387fc115327b819ba920ad6ce8f3e3a", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "855f8310be999de806e89a420a95435d" + "__X_HTTP_HEADERS_INTERGRATION": "Server: cloudflare-nginx\r\nDate: Wed, 06 Jan 2016 20:42:10 GMT\r\nContent-Type: text/html\r\nTransfer-Encoding: chunked\r\nConnection: close\r\nSet-Cookie: __cfduid=d8d37b52eaa3137bdfd7fd67a4ffc8a7a1452112929; expires=Thu, 05-Jan-17 20:42:09 GMT; path=/; domain=.wireshark.org; HttpOnly\r\nX-Frame-Options: SAMEORIGIN\r\nStrict-Transport-Security: max-age=31536000;\r\nX-Slogan: It's a great product with a great story to tell. I'm pumped!\r\nX-Mod-Pagespeed: 1.9.32.11-7550\r\nVary: Accept-Encoding\r\nCache-control: max-age=0, no-cache, no-store\r\nX-Slogan: Go deep.\r\nCF-RAY: 260a3f709d7b0761-AMS\r\nContent-Encoding: gzip\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "5387fc115327b819ba920ad6ce8f3e3a", + "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "855f8310be999de806e89a420a95435d" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_get_encoded_uri.json b/test/decoders/http/benchmarks/json/http_get_encoded_uri.json index de1419a..ee62e99 100644 --- a/test/decoders/http/benchmarks/json/http_get_encoded_uri.json +++ b/test/decoders/http/benchmarks/json/http_get_encoded_uri.json @@ -22,7 +22,8 @@ "Host": "58.16.70.122", "Content-Length": "0", "Accept-Encoding": "gzip, deflate", - "__X_HTTP_URL": "58.16.70.122/disAll/tcCertType.html" + "__X_HTTP_URL": "58.16.70.122/disAll/tcCertType.html", + "__X_HTTP_HEADERS_INTERGRATION": "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.8,en-us,en;q=0.5\r\nOrigin: http://58.16.70.122\r\nX-Requested-With: XMLHttpRequest\r\nReferer: http://58.16.70.122/register.jsp?redirect:http://58.16.70.122.r87.com/?\r\nCache-Control: no-cache\r\nX-Scanner: Netsparker\r\nCookie: JSESSIONID=385C79E211D561C0CA13D90F150F603D\r\nHost: 58.16.70.122\r\nContent-Length: 0\r\nAccept-Encoding: gzip, deflate\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -38,8 +39,8 @@ "Content-Type": "text/html;charset=UTF-8", "Transfer-Encoding": "chunked", "Date": "Sat, 18 May 2019 01:36:57 GMT", - "__X_HTTP_RAW_PAYLOAD_MD5": "d545e0faf20f7ffe90e31cfc1aef1782", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "d545e0faf20f7ffe90e31cfc1aef1782" + "__X_HTTP_HEADERS_INTERGRATION": "Server: Apache-Coyote/1.1\r\nPragma: No-cache\r\nExpires: Thu, 01 Jan 1970 00:00:00 GMT\r\nContent-Type: text/html;charset=UTF-8\r\nTransfer-Encoding: chunked\r\nDate: Sat, 18 May 2019 01:36:57 GMT\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "d545e0faf20f7ffe90e31cfc1aef1782" }, { "__X_HTTP_TRANSACTION": "request", @@ -58,7 +59,8 @@ "Host": "58.16.70.122", "Accept-Encoding": "gzip, deflate", "__X_HTTP_URL": "58.16.70.122/upload/%E6%B3%95%E5%BE%8B%E6%B3%95%E8%A7%84/%E5%B8%82%E4%BA%BA%E6%B0%91%E6%94%BF%E5%BA%9C%E5%8A%9E%E5%85%AC%E5%8E%85%E5%8D%B0%E5%8F%91%E8%B4%B5%E9%98%B3%E5%B8%82%E5%85%B3%E4%BA%8E%E6%8E%A8%E8%BF%9B%E5%B7%A5%E5%95%86%E8%90%A5%E4%B8%9A%E6%89%A7%E7%85%A7%E3%80%81%E7%BB%84%E7%BB%87%E6%9C%BA%E6%9E%84%E4%BB%A3%E7%A0%81%E8%AF%81%E5%92%8C%E7%A8%8E%E5%8A%A1%E7%99%BB%E8%AE%B0%E8%AF%81%E2%80%9C%E4%B8%89%E8%AF%81%E5%90%88%E4%B8%80%E2%80%9D%E7%99%BB%E8%AE%B0%E5%88%B6%E5%BA%A6%E6%94%B9%E9%9D%A9%E5%AE%9E%E6%96%BD%E6%96%B9%E6%A1%88%E7%9A%84%E9%80%9A%E7%9F%A5%EF%BC%88%E7%AD%91%E5%BA%9C%E5%8A%9E%E5%87%BD%E3%80%902015%E3%80%91162%E5%8F%B7%EF%BC%89.docx?nsextt=N3TSP4RKE2", - "__X_HTTP_DECODED_URL": "58.16.70.122/upload/法律法规/市人民政府办公厅印发贵阳市关于推进工商营业执照、组织机构代码证和税务登记证“三证合一”登记制度改革实施方案的通知(筑府办函【2015】162号).docx?nsextt=N3TSP4RKE2" + "__X_HTTP_DECODED_URL": "58.16.70.122/upload/法律法规/市人民政府办公厅印发贵阳市关于推进工商营业执照、组织机构代码证和税务登记证“三证合一”登记制度改革实施方案的通知(筑府办函【2015】162号).docx?nsextt=N3TSP4RKE2", + "__X_HTTP_HEADERS_INTERGRATION": "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\r\nCache-Control: no-cache\r\nAccept-Language: en-us,en;q=0.5\r\nX-Scanner: Netsparker\r\nCookie: JSESSIONID=385C79E211D561C0CA13D90F150F603D\r\nHost: 58.16.70.122\r\nAccept-Encoding: gzip, deflate\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -75,7 +77,7 @@ "Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8", "Content-Length": "1703517", "Date": "Sat, 18 May 2019 01:37:00 GMT", - "__X_HTTP_RAW_PAYLOAD_MD5": "3598c468910611a3128d068e20ae0e82", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "3598c468910611a3128d068e20ae0e82" + "__X_HTTP_HEADERS_INTERGRATION": "Server: Apache-Coyote/1.1\r\nAccept-Ranges: bytes\r\nETag: W/\"1703517-1546572172000\"\r\nLast-Modified: Fri, 04 Jan 2019 03:22:52 GMT\r\nContent-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8\r\nContent-Length: 1703517\r\nDate: Sat, 18 May 2019 01:37:00 GMT\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "3598c468910611a3128d068e20ae0e82" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_get_long_cookie.json b/test/decoders/http/benchmarks/json/http_get_long_cookie.json index 118022d..6643f36 100644 --- a/test/decoders/http/benchmarks/json/http_get_long_cookie.json +++ b/test/decoders/http/benchmarks/json/http_get_long_cookie.json @@ -18,7 +18,8 @@ "Accept-Encoding": "gzip,deflate,sdch", "Accept-Language": "zh-CN,zh;q=0.8", "__X_HTTP_URL": "livep.l.qq.com/livemsg?imagemd5=02f5efd8a349c50280f8540b2735bd54&tailroll=1&plugin=1.3.8&pf=out&si=3766845706&url=http%3A%2F%2Fsports.qq.com%2Fa%2F20160106%2F008987.htm&soid=CA7F9C5B0120568CDC2F68726300&chid=0&ping_data=dXNlcl9pbmZvPXVCWDluVDg5SFJhOUFQK0JQVGdKRUxVYi9Kdz0&t=0&iptype=0&vptag=&pid=7F993E38C0E676ACC07DE764D1F3DEF56AA8F90A&adtype=LD&oadid=6012&ev=3236&l=4020&ufc_filter=0&imagelog=1&pid2=7F993E38C0E676ACC07DE764D1F3DEF56AA8F90A&mt=15000&coverid=&reqtime=1452071981&requestl=4020&isthirdip=0&cid=0&isfloatindex=0&o=100654557&lcount=2&refluence=4020&from=0&vid=m01794rm5ej&cip=202.127.156.91&aver=0&ip_filter=0&adlength=30000&tagid=&v=TencentPlayerOutV3.2.19.346&live=0&dura=105", - "__X_HTTP_DECODED_URL": "livep.l.qq.com/livemsg?imagemd5=02f5efd8a349c50280f8540b2735bd54&tailroll=1&plugin=1.3.8&pf=out&si=3766845706&url=http://sports.qq.com/a/20160106/008987.htm&soid=CA7F9C5B0120568CDC2F68726300&chid=0&ping_data=dXNlcl9pbmZvPXVCWDluVDg5SFJhOUFQK0JQVGdKRUxVYi9Kdz0&t=0&iptype=0&vptag=&pid=7F993E38C0E676ACC07DE764D1F3DEF56AA8F90A&adtype=LD&oadid=6012&ev=3236&l=4020&ufc_filter=0&imagelog=1&pid2=7F993E38C0E676ACC07DE764D1F3DEF56AA8F90A&mt=15000&coverid=&reqtime=1452071981&requestl=4020&isthirdip=0&cid=0&isfloatindex=0&o=100654557&lcount=2&refluence=4020&from=0&vid=m01794rm5ej&cip=202.127.156.91&aver=0&ip_filter=0&adlength=30000&tagid=&v=TencentPlayerOutV3.2.19.346&live=0&dura=105", - "Cookie": "flashuser=95621BA8CB862E09; piao_city=179; lv_irt_id=3628e1bbe25a6c941da9fac02ec2df8b; cm_cookie=V1,10017&-EP5mRruXhQarsCl5LD-2YzgjVTvyr2K&AQEBh7uoLMUB9lnaB5Tz9XdYnGIWflXmsDrU&150723&150723,10035&7t-tEmfJ076VAsM9&AQEBh7uoLMUB9lnc4tpW7vbazqdrRdBYOUCi&150724&150807,110054&ucO0Z0gctNn3&AQEBh7uoLMUB9llxMNl45F3RAIsKK0iMOJAG&150716&151008,10040&ACZ1r0A70NaEFcGT&AQEBh7uoLMUB9lmVgSoTwuuXZi896zSVsXIF&150818&151014,110015&1&AQEBh7uoLMUB9lkt2LUHO6ARwODHLI_Y51rj&150928&151103,10037&1433388364186289251984&AQEBh7uoLMUB9llIBencOqTAEh2aQ2SURSSQ&150909&151110,10011&jL40Z03uUFI0&AQEBh7uoLMUB9lkfw2sJVNx9g12Fzs12rPSN&150717&151125,10016&F64E6LFZs0W&AQEBh7uoLMUB9llE4yoPFNUykSj7WKaRK5lH&150805&151127,10019&WQAO-C1K9qI5OP8W_t2pSw&AQEBh7uoLMUB9llhpZE87GmOk3XGo_MJgV6K&150826&151130,10015&820490997316506147&AQEBh7uoLMUB9llXiynsGYRhMO3XuPnkuHUt&150715&151201,10012&x3X1yY6b&AQEBh7uoLMUB9ll9mraU_LJCDBYsE0Sbk_V9&151202&151202,110065&ucO0Z0gctNn3&AQEBh7uoLMUB9lkJcK3KDBQTKF0YfZ5wB7r5&150716&151203,110066&jL40Z03uUFI0&AQEBh7uoLMUB9lnyvKSYhcJD1X_rSs_DLVWx&150916&151221,10013&ePyYB2MSKa0TCbebpxKjmU&AQEBh7uoLMUB9ln6_6nGNidqml4nFKXhtE58&151221&151221,110061&d9cfa518d82abee&AQEBh7uoLMUB9llj2NYzmCjxaLWXALTcAGIH&150818&151224,10038&CAESEPZbUhToZJ39CS9MlgXGUSQ&AQEBh7uoLMUB9lmhnrDM5lIGtl6vc1NxMD6F&151110&151224,10077&820490997316506147&AQEBh7uoLMUB9lmkUdUe2xSHGkvM0IRu9Jt9&151214&151228,10008&0yPSvk92ie1nhB8wTUlTq&AQEBh7uoLMUB9lnL5ZCYvXJNvlv53G0CKEkj&150817&151228,10045&0&AQEBh7uoLMUB9llW3v1Vh7W72lv14RlAjUXn&151023&151228,110064&jL40Z03uUFI0&AQEBh7uoLMUB9lkBYuCUDLDrOcGURJcilogv&151016&160104,110069&26d49ecc&AQEBh7uoLMUB9lmlBLTxQY9BkCmimkMFqTo5&151204&160105,10079&B8hGto5y1e3uDXwCMsIun3rjk--dVCof&AQEBh7uoLMUB9llxnFrhDtdNMjZ1hs1il5J4&151214&160105; LHTturn=24; ptisp=ctc; RK=hRWyd82Gd8; pgv_pvi=7567882240; image_md5=bd21d5fb2f401b37cf3a02724dc06545; LTPturn=27; pt2gguin=o0583115900; uin=o0583115900; skey=@Mp9aCinaO; ptcz=10d4b1b7bde835d64663338a8008fd4f81e2c6b5f0ba81a90da3627ee617c7ee; pgv_info=ssid=s4768939310; pgv_pvid=6872592818; o_cookie=583115900; lv_play_index_textAd=47; lv_play_indexl.=32; dc_vplaying=1; LKBturn=29; Lturn=29; adid=583115900; appuser=95621BA8CB862E09; o_minduid=phhdxyNLkxBWMa74VTm5zU4y5EbUv5vR; appuser_95621BA8CB862E09_0=2b7gwp=1453219199_6&2btemv=1455551999_1&2c8311=1453305599_3&2cfx4j=1453651199_3&2cfx9l=1453651199_1&2d49y9=1453823999_2&2d67kl=1454255999_2&2d69mf=1454255999_3&2dxv8l=1455465599_6&2dzhfl=1452614399_1&f_pogvwp=1452095999_1&f_pogvwv=1452095999_2&f_pogw0m=1452095999_1&fd_15bm2t7=1452095999_1&fd_1h2pbsd=1452095999_2&fd_1k6so62=1452095999_1&fd_rhmjmq=1452095999_2&m_roiw0t=1452095999_3&m_xty8wl=1452095999_1&pogree=1452095999_2; TX.boid=100655474=1452072582_1&701041365=1452072585_1; appuser_95621BA8CB862E09_effect_0=fd_1ez2rcc=1452095999_1&fd_qdh7zw=1452095999_1&fd_ul215j=1452095999_1; psessionid=ca7f9c5b_1452071982_583115900_30754; psessiontime=1452071990" + "__X_HTTP_DECODED_URL": "livep.l.qq.com/livemsg?imagemd5=02f5efd8a349c50280f8540b2735bd54&tailroll=1&plugin=1.3.8&pf=out&si=3766845706&url=http://sports.qq.com/a/20160106/008987.htm&soid=CA7F9C5B0120568CDC2F68726300&chid=0&ping_data=dXNlcl9pbmZvPXVCWDluVDg5SFJhOUFQK0JQVGdKRUxVYi9Kdz0&t=0&iptype=0&vptag=&pid=7F993E38C0E676ACC07DE764D1F3DEF56AA8F90A&adtype=LD&oadid=6012&ev=3236&l=4020&ufc_filter=0&imagelog=1&pid2=7F993E38C0E676ACC07DE764D1F3DEF56AA8F90A&mt=15000&coverid=&reqtime=1452071981&requestl=4020&isthirdip=0&cid=0&isfloatindex=0&o=100654557&lcount=2&refluence=4020&from=0&vid=m01794rm5ej&cip=202.127.156.91&aver=0&ip_filter=0&adlength=30000&tagid=&v=TencentPlayerOutV3.2.19.346&live=0&dura=105", + "Cookie": "flashuser=95621BA8CB862E09; piao_city=179; lv_irt_id=3628e1bbe25a6c941da9fac02ec2df8b; cm_cookie=V1,10017&-EP5mRruXhQarsCl5LD-2YzgjVTvyr2K&AQEBh7uoLMUB9lnaB5Tz9XdYnGIWflXmsDrU&150723&150723,10035&7t-tEmfJ076VAsM9&AQEBh7uoLMUB9lnc4tpW7vbazqdrRdBYOUCi&150724&150807,110054&ucO0Z0gctNn3&AQEBh7uoLMUB9llxMNl45F3RAIsKK0iMOJAG&150716&151008,10040&ACZ1r0A70NaEFcGT&AQEBh7uoLMUB9lmVgSoTwuuXZi896zSVsXIF&150818&151014,110015&1&AQEBh7uoLMUB9lkt2LUHO6ARwODHLI_Y51rj&150928&151103,10037&1433388364186289251984&AQEBh7uoLMUB9llIBencOqTAEh2aQ2SURSSQ&150909&151110,10011&jL40Z03uUFI0&AQEBh7uoLMUB9lkfw2sJVNx9g12Fzs12rPSN&150717&151125,10016&F64E6LFZs0W&AQEBh7uoLMUB9llE4yoPFNUykSj7WKaRK5lH&150805&151127,10019&WQAO-C1K9qI5OP8W_t2pSw&AQEBh7uoLMUB9llhpZE87GmOk3XGo_MJgV6K&150826&151130,10015&820490997316506147&AQEBh7uoLMUB9llXiynsGYRhMO3XuPnkuHUt&150715&151201,10012&x3X1yY6b&AQEBh7uoLMUB9ll9mraU_LJCDBYsE0Sbk_V9&151202&151202,110065&ucO0Z0gctNn3&AQEBh7uoLMUB9lkJcK3KDBQTKF0YfZ5wB7r5&150716&151203,110066&jL40Z03uUFI0&AQEBh7uoLMUB9lnyvKSYhcJD1X_rSs_DLVWx&150916&151221,10013&ePyYB2MSKa0TCbebpxKjmU&AQEBh7uoLMUB9ln6_6nGNidqml4nFKXhtE58&151221&151221,110061&d9cfa518d82abee&AQEBh7uoLMUB9llj2NYzmCjxaLWXALTcAGIH&150818&151224,10038&CAESEPZbUhToZJ39CS9MlgXGUSQ&AQEBh7uoLMUB9lmhnrDM5lIGtl6vc1NxMD6F&151110&151224,10077&820490997316506147&AQEBh7uoLMUB9lmkUdUe2xSHGkvM0IRu9Jt9&151214&151228,10008&0yPSvk92ie1nhB8wTUlTq&AQEBh7uoLMUB9lnL5ZCYvXJNvlv53G0CKEkj&150817&151228,10045&0&AQEBh7uoLMUB9llW3v1Vh7W72lv14RlAjUXn&151023&151228,110064&jL40Z03uUFI0&AQEBh7uoLMUB9lkBYuCUDLDrOcGURJcilogv&151016&160104,110069&26d49ecc&AQEBh7uoLMUB9lmlBLTxQY9BkCmimkMFqTo5&151204&160105,10079&B8hGto5y1e3uDXwCMsIun3rjk--dVCof&AQEBh7uoLMUB9llxnFrhDtdNMjZ1hs1il5J4&151214&160105; LHTturn=24; ptisp=ctc; RK=hRWyd82Gd8; pgv_pvi=7567882240; image_md5=bd21d5fb2f401b37cf3a02724dc06545; LTPturn=27; pt2gguin=o0583115900; uin=o0583115900; skey=@Mp9aCinaO; ptcz=10d4b1b7bde835d64663338a8008fd4f81e2c6b5f0ba81a90da3627ee617c7ee; pgv_info=ssid=s4768939310; pgv_pvid=6872592818; o_cookie=583115900; lv_play_index_textAd=47; lv_play_indexl.=32; dc_vplaying=1; LKBturn=29; Lturn=29; adid=583115900; appuser=95621BA8CB862E09; o_minduid=phhdxyNLkxBWMa74VTm5zU4y5EbUv5vR; appuser_95621BA8CB862E09_0=2b7gwp=1453219199_6&2btemv=1455551999_1&2c8311=1453305599_3&2cfx4j=1453651199_3&2cfx9l=1453651199_1&2d49y9=1453823999_2&2d67kl=1454255999_2&2d69mf=1454255999_3&2dxv8l=1455465599_6&2dzhfl=1452614399_1&f_pogvwp=1452095999_1&f_pogvwv=1452095999_2&f_pogw0m=1452095999_1&fd_15bm2t7=1452095999_1&fd_1h2pbsd=1452095999_2&fd_1k6so62=1452095999_1&fd_rhmjmq=1452095999_2&m_roiw0t=1452095999_3&m_xty8wl=1452095999_1&pogree=1452095999_2; TX.boid=100655474=1452072582_1&701041365=1452072585_1; appuser_95621BA8CB862E09_effect_0=fd_1ez2rcc=1452095999_1&fd_qdh7zw=1452095999_1&fd_ul215j=1452095999_1; psessionid=ca7f9c5b_1452071982_583115900_30754; psessiontime=1452071990", + "__X_HTTP_HEADERS_INTERGRATION": "Host: livep.l.qq.com\r\nConnection: keep-alive\r\nUser-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36\r\nAccept: */*\r\nReferer: http://imgcache.qq.com/tencentvideo_v1/player/TPout.swf?max_age=86400&v=20140714\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: zh-CN,zh;q=0.8\r\nCookie: flashuser=95621BA8CB862E09; piao_city=179; lv_irt_id=3628e1bbe25a6c941da9fac02ec2df8b; cm_cookie=V1,10017&-EP5mRruXhQarsCl5LD-2YzgjVTvyr2K&AQEBh7uoLMUB9lnaB5Tz9XdYnGIWflXmsDrU&150723&150723,10035&7t-tEmfJ076VAsM9&AQEBh7uoLMUB9lnc4tpW7vbazqdrRdBYOUCi&150724&150807,110054&ucO0Z0gctNn3&AQEBh7uoLMUB9llxMNl45F3RAIsKK0iMOJAG&150716&151008,10040&ACZ1r0A70NaEFcGT&AQEBh7uoLMUB9lmVgSoTwuuXZi896zSVsXIF&150818&151014,110015&1&AQEBh7uoLMUB9lkt2LUHO6ARwODHLI_Y51rj&150928&151103,10037&1433388364186289251984&AQEBh7uoLMUB9llIBencOqTAEh2aQ2SURSSQ&150909&151110,10011&jL40Z03uUFI0&AQEBh7uoLMUB9lkfw2sJVNx9g12Fzs12rPSN&150717&151125,10016&F64E6LFZs0W&AQEBh7uoLMUB9llE4yoPFNUykSj7WKaRK5lH&150805&151127,10019&WQAO-C1K9qI5OP8W_t2pSw&AQEBh7uoLMUB9llhpZE87GmOk3XGo_MJgV6K&150826&151130,10015&820490997316506147&AQEBh7uoLMUB9llXiynsGYRhMO3XuPnkuHUt&150715&151201,10012&x3X1yY6b&AQEBh7uoLMUB9ll9mraU_LJCDBYsE0Sbk_V9&151202&151202,110065&ucO0Z0gctNn3&AQEBh7uoLMUB9lkJcK3KDBQTKF0YfZ5wB7r5&150716&151203,110066&jL40Z03uUFI0&AQEBh7uoLMUB9lnyvKSYhcJD1X_rSs_DLVWx&150916&151221,10013&ePyYB2MSKa0TCbebpxKjmU&AQEBh7uoLMUB9ln6_6nGNidqml4nFKXhtE58&151221&151221,110061&d9cfa518d82abee&AQEBh7uoLMUB9llj2NYzmCjxaLWXALTcAGIH&150818&151224,10038&CAESEPZbUhToZJ39CS9MlgXGUSQ&AQEBh7uoLMUB9lmhnrDM5lIGtl6vc1NxMD6F&151110&151224,10077&820490997316506147&AQEBh7uoLMUB9lmkUdUe2xSHGkvM0IRu9Jt9&151214&151228,10008&0yPSvk92ie1nhB8wTUlTq&AQEBh7uoLMUB9lnL5ZCYvXJNvlv53G0CKEkj&150817&151228,10045&0&AQEBh7uoLMUB9llW3v1Vh7W72lv14RlAjUXn&151023&151228,110064&jL40Z03uUFI0&AQEBh7uoLMUB9lkBYuCUDLDrOcGURJcilogv&151016&160104,110069&26d49ecc&AQEBh7uoLMUB9lmlBLTxQY9BkCmimkMFqTo5&151204&160105,10079&B8hGto5y1e3uDXwCMsIun3rjk--dVCof&AQEBh7uoLMUB9llxnFrhDtdNMjZ1hs1il5J4&151214&160105; LHTturn=24; ptisp=ctc; RK=hRWyd82Gd8; pgv_pvi=7567882240; image_md5=bd21d5fb2f401b37cf3a02724dc06545; LTPturn=27; pt2gguin=o0583115900; uin=o0583115900; skey=@Mp9aCinaO; ptcz=10d4b1b7bde835d64663338a8008fd4f81e2c6b5f0ba81a90da3627ee617c7ee; pgv_info=ssid=s4768939310; pgv_pvid=6872592818; o_cookie=583115900; lv_play_index_textAd=47; lv_play_indexl.=32; dc_vplaying=1; LKBturn=29; Lturn=29; adid=583115900; appuser=95621BA8CB862E09; o_minduid=phhdxyNLkxBWMa74VTm5zU4y5EbUv5vR; appuser_95621BA8CB862E09_0=2b7gwp=1453219199_6&2btemv=1455551999_1&2c8311=1453305599_3&2cfx4j=1453651199_3&2cfx9l=1453651199_1&2d49y9=1453823999_2&2d67kl=1454255999_2&2d69mf=1454255999_3&2dxv8l=1455465599_6&2dzhfl=1452614399_1&f_pogvwp=1452095999_1&f_pogvwv=1452095999_2&f_pogw0m=1452095999_1&fd_15bm2t7=1452095999_1&fd_1h2pbsd=1452095999_2&fd_1k6so62=1452095999_1&fd_rhmjmq=1452095999_2&m_roiw0t=1452095999_3&m_xty8wl=1452095999_1&pogree=1452095999_2; TX.boid=100655474=1452072582_1&701041365=1452072585_1; appuser_95621BA8CB862E09_effect_0=fd_1ez2rcc=1452095999_1&fd_qdh7zw=1452095999_1&fd_ul215j=1452095999_1; psessionid=ca7f9c5b_1452071982_583115900_30754; psessiontime=1452071990\r\n\r\n" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_get_multi_trans.json b/test/decoders/http/benchmarks/json/http_get_multi_trans.json index 917b1c7..67781a4 100644 --- a/test/decoders/http/benchmarks/json/http_get_multi_trans.json +++ b/test/decoders/http/benchmarks/json/http_get_multi_trans.json @@ -18,7 +18,8 @@ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Cookie": "Hm_lvt_1b8c1194303ef64e02f003f0cb8a1906=1653898514; _gcl_au=1.1.1010551181.1653898515; _ga=GA1.2.1419569885.1653898515; _gid=GA1.2.2007113907.1653898515; authtoken_pro=tea83b3beef07488bb8571811385db42; userId_pro=1160; pid_pro=1; eid_pro=1; pname_pro=name; Hm_lpvt_1b8c1194303ef64e02f003f0cb8a1906=1653961741; JSESSIONID=531AACA879469EDAB825E28113490E10", - "__X_HTTP_URL": "test.pro.testin.cn/account/login.htm" + "__X_HTTP_URL": "test.pro.testin.cn/account/login.htm", + "__X_HTTP_HEADERS_INTERGRATION": "Host: test.pro.testin.cn\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: Hm_lvt_1b8c1194303ef64e02f003f0cb8a1906=1653898514; _gcl_au=1.1.1010551181.1653898515; _ga=GA1.2.1419569885.1653898515; _gid=GA1.2.2007113907.1653898515; authtoken_pro=tea83b3beef07488bb8571811385db42; userId_pro=1160; pid_pro=1; eid_pro=1; pname_pro=name; Hm_lpvt_1b8c1194303ef64e02f003f0cb8a1906=1653961741; JSESSIONID=531AACA879469EDAB825E28113490E10\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -35,7 +36,8 @@ "Set-Cookie1": "authtoken_pro=tea83b3beef07488bb8571811385db42; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly", "Set-Cookie2": "userId_pro=1160; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly", "Location": "http://test.pro.testin.cn/enterprise/index.htm", - "Content-Language": "zh-CN" + "Content-Language": "zh-CN", + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx/1.16.1\r\nDate: Tue, 31 May 2022 06:41:23 GMT\r\nContent-Length: 0\r\nConnection: keep-alive\r\nSet-Cookie: JSESSIONID=CFAB9C0C3F4D9D6C2837E3BA9425AFCA; Path=/; HttpOnly\r\nSet-Cookie: authtoken_pro=tea83b3beef07488bb8571811385db42; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nSet-Cookie: userId_pro=1160; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nLocation: http://test.pro.testin.cn/enterprise/index.htm\r\nContent-Language: zh-CN\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -53,7 +55,8 @@ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Cookie": "Hm_lvt_1b8c1194303ef64e02f003f0cb8a1906=1653898514; _gcl_au=1.1.1010551181.1653898515; _ga=GA1.2.1419569885.1653898515; _gid=GA1.2.2007113907.1653898515; authtoken_pro=tea83b3beef07488bb8571811385db42; userId_pro=1160; pid_pro=1; eid_pro=1; pname_pro=name; Hm_lpvt_1b8c1194303ef64e02f003f0cb8a1906=1653961741; JSESSIONID=CFAB9C0C3F4D9D6C2837E3BA9425AFCA", - "__X_HTTP_URL": "test.pro.testin.cn/enterprise/index.htm" + "__X_HTTP_URL": "test.pro.testin.cn/enterprise/index.htm", + "__X_HTTP_HEADERS_INTERGRATION": "Host: test.pro.testin.cn\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: Hm_lvt_1b8c1194303ef64e02f003f0cb8a1906=1653898514; _gcl_au=1.1.1010551181.1653898515; _ga=GA1.2.1419569885.1653898515; _gid=GA1.2.2007113907.1653898515; authtoken_pro=tea83b3beef07488bb8571811385db42; userId_pro=1160; pid_pro=1; eid_pro=1; pname_pro=name; Hm_lpvt_1b8c1194303ef64e02f003f0cb8a1906=1653961741; JSESSIONID=CFAB9C0C3F4D9D6C2837E3BA9425AFCA\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -69,7 +72,8 @@ "Set-Cookie": "authtoken_pro=tea83b3beef07488bb8571811385db42; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly", "Set-Cookie1": "userId_pro=1160; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly", "Location": "http://test.pro.testin.cn/enterprise/into.htm?eid=1", - "Content-Language": "zh-CN" + "Content-Language": "zh-CN", + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx/1.16.1\r\nDate: Tue, 31 May 2022 06:41:23 GMT\r\nContent-Length: 0\r\nConnection: keep-alive\r\nSet-Cookie: authtoken_pro=tea83b3beef07488bb8571811385db42; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nSet-Cookie: userId_pro=1160; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nLocation: http://test.pro.testin.cn/enterprise/into.htm?eid=1\r\nContent-Language: zh-CN\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -87,7 +91,8 @@ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Cookie": "Hm_lvt_1b8c1194303ef64e02f003f0cb8a1906=1653898514; _gcl_au=1.1.1010551181.1653898515; _ga=GA1.2.1419569885.1653898515; _gid=GA1.2.2007113907.1653898515; authtoken_pro=tea83b3beef07488bb8571811385db42; userId_pro=1160; pid_pro=1; eid_pro=1; pname_pro=name; Hm_lpvt_1b8c1194303ef64e02f003f0cb8a1906=1653961741; JSESSIONID=CFAB9C0C3F4D9D6C2837E3BA9425AFCA", - "__X_HTTP_URL": "test.pro.testin.cn/enterprise/into.htm?eid=1" + "__X_HTTP_URL": "test.pro.testin.cn/enterprise/into.htm?eid=1", + "__X_HTTP_HEADERS_INTERGRATION": "Host: test.pro.testin.cn\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: Hm_lvt_1b8c1194303ef64e02f003f0cb8a1906=1653898514; _gcl_au=1.1.1010551181.1653898515; _ga=GA1.2.1419569885.1653898515; _gid=GA1.2.2007113907.1653898515; authtoken_pro=tea83b3beef07488bb8571811385db42; userId_pro=1160; pid_pro=1; eid_pro=1; pname_pro=name; Hm_lpvt_1b8c1194303ef64e02f003f0cb8a1906=1653961741; JSESSIONID=CFAB9C0C3F4D9D6C2837E3BA9425AFCA\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -103,7 +108,8 @@ "Set-Cookie": "authtoken_pro=tea83b3beef07488bb8571811385db42; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly", "Set-Cookie1": "userId_pro=1160; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly", "Location": "http://test.pro.testin.cn/realmachine/index.htm", - "Content-Language": "zh-CN" + "Content-Language": "zh-CN", + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx/1.16.1\r\nDate: Tue, 31 May 2022 06:41:23 GMT\r\nContent-Length: 0\r\nConnection: keep-alive\r\nSet-Cookie: authtoken_pro=tea83b3beef07488bb8571811385db42; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nSet-Cookie: userId_pro=1160; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nLocation: http://test.pro.testin.cn/realmachine/index.htm\r\nContent-Language: zh-CN\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -121,7 +127,8 @@ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Cookie": "Hm_lvt_1b8c1194303ef64e02f003f0cb8a1906=1653898514; _gcl_au=1.1.1010551181.1653898515; _ga=GA1.2.1419569885.1653898515; _gid=GA1.2.2007113907.1653898515; authtoken_pro=tea83b3beef07488bb8571811385db42; userId_pro=1160; pid_pro=1; eid_pro=1; pname_pro=name; Hm_lpvt_1b8c1194303ef64e02f003f0cb8a1906=1653961741; JSESSIONID=CFAB9C0C3F4D9D6C2837E3BA9425AFCA", - "__X_HTTP_URL": "test.pro.testin.cn/realmachine/index.htm" + "__X_HTTP_URL": "test.pro.testin.cn/realmachine/index.htm", + "__X_HTTP_HEADERS_INTERGRATION": "Host: test.pro.testin.cn\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: Hm_lvt_1b8c1194303ef64e02f003f0cb8a1906=1653898514; _gcl_au=1.1.1010551181.1653898515; _ga=GA1.2.1419569885.1653898515; _gid=GA1.2.2007113907.1653898515; authtoken_pro=tea83b3beef07488bb8571811385db42; userId_pro=1160; pid_pro=1; eid_pro=1; pname_pro=name; Hm_lpvt_1b8c1194303ef64e02f003f0cb8a1906=1653961741; JSESSIONID=CFAB9C0C3F4D9D6C2837E3BA9425AFCA\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -143,7 +150,8 @@ "Set-Cookie4": "pname_pro=name; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly", "Content-Language": "zh-CN", "Content-Encoding": "gzip", - "__X_HTTP_RAW_PAYLOAD_MD5": "5d761720e42f13d01ba981fb19b850ca", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "39cb5f3a9cbcfbd16f66e040ec49b8c4" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx/1.16.1\r\nDate: Tue, 31 May 2022 06:41:23 GMT\r\nContent-Type: text/html;charset=UTF-8\r\nTransfer-Encoding: chunked\r\nConnection: keep-alive\r\nVary: Accept-Encoding\r\nSet-Cookie: authtoken_pro=tea83b3beef07488bb8571811385db42; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nSet-Cookie: userId_pro=1160; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nSet-Cookie: pid_pro=1; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nSet-Cookie: eid_pro=1; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nSet-Cookie: pname_pro=name; Max-Age=28800; Expires=Tue, 31-May-2022 14:41:23 GMT; Domain=testin.cn; Path=/; HttpOnly\r\nContent-Language: zh-CN\r\nContent-Encoding: gzip\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "5d761720e42f13d01ba981fb19b850ca", + "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "39cb5f3a9cbcfbd16f66e040ec49b8c4" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_get_req_pipeline.json b/test/decoders/http/benchmarks/json/http_get_req_pipeline.json index af8ff75..7ea2b37 100644 --- a/test/decoders/http/benchmarks/json/http_get_req_pipeline.json +++ b/test/decoders/http/benchmarks/json/http_get_req_pipeline.json @@ -16,7 +16,8 @@ "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.2 Safari/537.36", "Accept-Encoding": "gzip,deflate,sdch", "Accept-Language": "zh-CN,zh;q=0.8", - "__X_HTTP_URL": "113.31.27.226/aa.mp4?asf=sdaf" + "__X_HTTP_URL": "113.31.27.226/aa.mp4?asf=sdaf", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 113.31.27.226\r\nConnection: keep-alive\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.2 Safari/537.36\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: zh-CN,zh;q=0.8\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -32,7 +33,8 @@ "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.2 Safari/537.36", "Accept-Encoding": "gzip,deflate,sdch", "Accept-Language": "zh-CN,zh;q=0.8", - "__X_HTTP_URL": "ns.pb.cachecn.net/fetch_ldns.png" + "__X_HTTP_URL": "ns.pb.cachecn.net/fetch_ldns.png", + "__X_HTTP_HEADERS_INTERGRATION": "Host: ns.pb.cachecn.net\r\nConnection: keep-alive\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.2 Safari/537.36\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: zh-CN,zh;q=0.8\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -48,7 +50,8 @@ "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.2 Safari/537.36", "Accept-Encoding": "gzip,deflate,sdch", "Accept-Language": "zh-CN,zh;q=0.8", - "__X_HTTP_URL": "ns.pb.cachecn.net/40x.jpg" + "__X_HTTP_URL": "ns.pb.cachecn.net/40x.jpg", + "__X_HTTP_HEADERS_INTERGRATION": "Host: ns.pb.cachecn.net\r\nConnection: keep-alive\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.2 Safari/537.36\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: zh-CN,zh;q=0.8\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -62,7 +65,7 @@ "Date": "Wed, 25 Oct 2023 06:43:35 GMT", "Content-Type": "text/html", "Connection": "close", - "__X_HTTP_RAW_PAYLOAD_MD5": "6fb335f443cfc8a9d952d27cf3dc1059", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "6fb335f443cfc8a9d952d27cf3dc1059" + "__X_HTTP_HEADERS_INTERGRATION": "Server: SimpleHTTP/0.6 Python/2.7.5\r\nDate: Wed, 25 Oct 2023 06:43:35 GMT\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "6fb335f443cfc8a9d952d27cf3dc1059" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_get_single_trans.json b/test/decoders/http/benchmarks/json/http_get_single_trans.json index 165bb65..0d963d9 100644 --- a/test/decoders/http/benchmarks/json/http_get_single_trans.json +++ b/test/decoders/http/benchmarks/json/http_get_single_trans.json @@ -13,7 +13,8 @@ "Host": "192.168.40.137", "User-Agent": "curl/7.79.1", "Accept": "*/*", - "__X_HTTP_URL": "192.168.40.137/index.html" + "__X_HTTP_URL": "192.168.40.137/index.html", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 192.168.40.137\r\nUser-Agent: curl/7.79.1\r\nAccept: */*\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -28,7 +29,7 @@ "Content-type": "text/html", "Content-Length": "144", "Last-Modified": "Thu, 30 Nov 2023 08:38:54 GMT", - "__X_HTTP_RAW_PAYLOAD_MD5": "3e11876cd3a234541ae37d833c088a76", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "3e11876cd3a234541ae37d833c088a76" + "__X_HTTP_HEADERS_INTERGRATION": "Server: SimpleHTTP/0.6 Python/2.7.5\r\nDate: Thu, 30 Nov 2023 08:42:24 GMT\r\nContent-type: text/html\r\nContent-Length: 144\r\nLast-Modified: Thu, 30 Nov 2023 08:38:54 GMT\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "3e11876cd3a234541ae37d833c088a76" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_gzip_out_of_order.json b/test/decoders/http/benchmarks/json/http_gzip_out_of_order.json index 1952b9d..8cb17eb 100644 --- a/test/decoders/http/benchmarks/json/http_gzip_out_of_order.json +++ b/test/decoders/http/benchmarks/json/http_gzip_out_of_order.json @@ -18,7 +18,8 @@ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", - "__X_HTTP_URL": "192.168.40.139:8088/" + "__X_HTTP_URL": "192.168.40.139:8088/", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 192.168.40.139:8088\r\nConnection: keep-alive\r\nDNT: 1\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -33,7 +34,8 @@ "Content-type": "text/html; charset=utf-8", "Content-Encoding": "gzip", "Content-length": "28425", - "__X_HTTP_RAW_PAYLOAD_MD5": "873ed9c8c691a5f9f144fbf0fbfca011", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "7047cf4ae8ce6fd7bcd363e2b626f338" + "__X_HTTP_HEADERS_INTERGRATION": "Server: BaseHTTP/0.6 Python/3.6.8\r\nDate: Tue, 13 Aug 2024 14:21:42 GMT\r\nContent-type: text/html; charset=utf-8\r\nContent-Encoding: gzip\r\nContent-length: 28425\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "873ed9c8c691a5f9f144fbf0fbfca011", + "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "7047cf4ae8ce6fd7bcd363e2b626f338" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_hdrs_exceed_maximum.json b/test/decoders/http/benchmarks/json/http_hdrs_exceed_maximum.json index 9bc751b..0aa3281 100644 --- a/test/decoders/http/benchmarks/json/http_hdrs_exceed_maximum.json +++ b/test/decoders/http/benchmarks/json/http_hdrs_exceed_maximum.json @@ -1,51 +1,48 @@ -[ - { - "__X_HTTP_TUPLE4": "10.0.0.1:61462-10.0.0.2:80-6-0" - }, - { - "__X_HTTP_TRANSACTION": "request", - "__X_HTTP_TRANSACTION_SEQ": 0, - "method": "GET", - "uri": "/x/xx/xxxxxxxxxxxxxxxxxxx/x/xxxxxx/xxxxxxxxxxxxxxx?xxx=1&xxx=1&x=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&vmf=xxxxxxxxxx.xxx.xxx.xxx&ce=UTF-8&ns=xxxxxxxxxx&pageName=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&g=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.jsp&r=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&events=xxxxxxxxxxxxxxxxxxxxxxxxxxx&products=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&v1=xxxxxxxxxxxxxxx&v2=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&v17=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&c49=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&AQE=1", - "req_version": "1.1", - "major_version": 1, - "minor_version": 1, - "Host": "xxxxx.xxxxxxxx.xxxxxxxxxx.xxx", - "Connection": "keep-alive", - "Accept": "image/webp,*/*;q=0.8", - "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36", - "Referer": "http://www.xxxxxxxxxx.xxx/xx/xxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxx.jsp", - "Accept-Encoding": "gzip,deflate,sdch", - "Accept-Language": "en-US,en;q=0.8,en-GB;q=0.6", - "__X_HTTP_URL": "xxxxx.xxxxxxxx.xxxxxxxxxx.xxx/x/xx/xxxxxxxxxxxxxxxxxxx/x/xxxxxx/xxxxxxxxxxxxxxx?xxx=1&xxx=1&x=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&vmf=xxxxxxxxxx.xxx.xxx.xxx&ce=UTF-8&ns=xxxxxxxxxx&pageName=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&g=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.jsp&r=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&events=xxxxxxxxxxxxxxxxxxxxxxxxxxx&products=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&v1=xxxxxxxxxxxxxxx&v2=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&v17=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&c49=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&AQE=1", - "Cookie": "xxxxxxxxxxxxxxxxxxx=ie; xxxxxxxxxxxxxxxxxxxxxx=true; lp=xxxxxx; rememberUn=false; xxx.xxxxxxxxxx.xxxxxxxxxx=xx; xxxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; autocomplete=1; xxxx=xxxx; xxxx=xxxxv1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - }, - { - "__X_HTTP_TRANSACTION": "response", - "__X_HTTP_TRANSACTION_SEQ": 0, - "res_version": "1.1", - "res_status": "OK", - "major_version": 1, - "minor_version": 1, - "status_code": 200, - "Date": "Mon, 30 Jun 2014 13:35:21 GMT", - "Server": "xxxxxxxxxxxxxxxxx", - "Access-Control-Allow-Origin": "*", - "Set-Cookie": "xxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Expires=Wed, 29 Jun 2016 13:35:21 GMT; Domain=.xxxxxxxxxx.xxx; Path=/", - "X-C": "ms-4.9", - "Expires": "Sun, 29 Jun 2014 13:35:21 GMT", - "Last-Modified": "Tue, 01 Jul 2014 13:35:21 GMT", - "Cache-Control": "no-cache, no-store, max-age=0, no-transform, private", - "Pragma": "no-cache", - "ETag": "\"xxxxxxxxxxxxxxxxxxxxxx\"", - "Vary": "*", - "P3P": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA OUR IND COM NAV STA\"", - "xserver": "xxxxxx", - "Content-Length": "43", - "Keep-Alive": "timeout=15", - "Connection": "Keep-Alive", - "Content-Type": "image/gif", - "__X_HTTP_RAW_PAYLOAD_MD5": "ad480fd0732d0f6f1a8b06359e3a42bb", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "ad480fd0732d0f6f1a8b06359e3a42bb" - } -] \ No newline at end of file +[{ + "__X_HTTP_TUPLE4": "10.0.0.1:61462-10.0.0.2:80-6-0" + }, { + "__X_HTTP_TRANSACTION": "request", + "__X_HTTP_TRANSACTION_SEQ": 0, + "method": "GET", + "uri": "/x/xx/xxxxxxxxxxxxxxxxxxx/x/xxxxxx/xxxxxxxxxxxxxxx?xxx=1&xxx=1&x=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&vmf=xxxxxxxxxx.xxx.xxx.xxx&ce=UTF-8&ns=xxxxxxxxxx&pageName=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&g=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.jsp&r=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&events=xxxxxxxxxxxxxxxxxxxxxxxxxxx&products=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&v1=xxxxxxxxxxxxxxx&v2=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&v17=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&c49=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&AQE=1", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "xxxxx.xxxxxxxx.xxxxxxxxxx.xxx", + "Connection": "keep-alive", + "Accept": "image/webp,*/*;q=0.8", + "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36", + "Referer": "http://www.xxxxxxxxxx.xxx/xx/xxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxx.jsp", + "Accept-Encoding": "gzip,deflate,sdch", + "Accept-Language": "en-US,en;q=0.8,en-GB;q=0.6", + "Cookie": "xxxxxxxxxxxxxxxxxxx=ie; xxxxxxxxxxxxxxxxxxxxxx=true; lp=xxxxxx; rememberUn=false; xxx.xxxxxxxxxx.xxxxxxxxxx=xx; xxxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; autocomplete=1; xxxx=xxxx; xxxx=xxxxv1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "__X_HTTP_URL": "xxxxx.xxxxxxxx.xxxxxxxxxx.xxx/x/xx/xxxxxxxxxxxxxxxxxxx/x/xxxxxx/xxxxxxxxxxxxxxx?xxx=1&xxx=1&x=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&vmf=xxxxxxxxxx.xxx.xxx.xxx&ce=UTF-8&ns=xxxxxxxxxx&pageName=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&g=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.jsp&r=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&events=xxxxxxxxxxxxxxxxxxxxxxxxxxx&products=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&v1=xxxxxxxxxxxxxxx&v2=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&v17=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&c49=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&AQE=1", + "__X_HTTP_HEADERS_INTERGRATION": "Host: xxxxx.xxxxxxxx.xxxxxxxxxx.xxx\r\nConnection: keep-alive\r\nAccept: image/webp,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36\r\nReferer: http://www.xxxxxxxxxx.xxx/xx/xxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxx.jsp\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: en-US,en;q=0.8,en-GB;q=0.6\r\nCookie: xxxxxxxxxxxxxxxxxxx=ie; xxxxxxxxxxxxxxxxxxxxxx=true; lp=xxxxxx; rememberUn=false; xxx.xxxxxxxxxx.xxxxxxxxxx=xx; xxxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; autocomplete=1; xxxx=xxxx; xxxx=xxxxv1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n\r\n" + }, { + "__X_HTTP_TRANSACTION": "response", + "__X_HTTP_TRANSACTION_SEQ": 0, + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Date": "Mon, 30 Jun 2014 13:35:21 GMT", + "Server": "xxxxxxxxxxxxxxxxx", + "Access-Control-Allow-Origin": "*", + "Set-Cookie": "xxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Expires=Wed, 29 Jun 2016 13:35:21 GMT; Domain=.xxxxxxxxxx.xxx; Path=/", + "X-C": "ms-4.9", + "Expires": "Sun, 29 Jun 2014 13:35:21 GMT", + "Last-Modified": "Tue, 01 Jul 2014 13:35:21 GMT", + "Cache-Control": "no-cache, no-store, max-age=0, no-transform, private", + "Pragma": "no-cache", + "ETag": "\"xxxxxxxxxxxxxxxxxxxxxx\"", + "Vary": "*", + "P3P": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA OUR IND COM NAV STA\"", + "xserver": "xxxxxx", + "Content-Length": "43", + "Keep-Alive": "timeout=15", + "Connection": "Keep-Alive", + "Content-Type": "image/gif", + "__X_HTTP_HEADERS_INTERGRATION": "Date: Mon, 30 Jun 2014 13:35:21 GMT\r\nServer: xxxxxxxxxxxxxxxxx\r\nAccess-Control-Allow-Origin: *\r\nSet-Cookie: xxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Expires=Wed, 29 Jun 2016 13:35:21 GMT; Domain=.xxxxxxxxxx.xxx; Path=/\r\nX-C: ms-4.9\r\nExpires: Sun, 29 Jun 2014 13:35:21 GMT\r\nLast-Modified: Tue, 01 Jul 2014 13:35:21 GMT\r\nCache-Control: no-cache, no-store, max-age=0, no-transform, private\r\nPragma: no-cache\r\nETag: \"xxxxxxxxxxxxxxxxxxxxxx\"\r\nVary: *\r\nP3P: policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA OUR IND COM NAV STA\"\r\nxserver: xxxxxx\r\nContent-Length: 43\r\nKeep-Alive: timeout=15\r\nConnection: Keep-Alive\r\nContent-Type: image/gif\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "ad480fd0732d0f6f1a8b06359e3a42bb" + }] diff --git a/test/decoders/http/benchmarks/json/http_msg_type_state.json b/test/decoders/http/benchmarks/json/http_msg_type_state.json index 5dc0564..31cd5ac 100644 --- a/test/decoders/http/benchmarks/json/http_msg_type_state.json +++ b/test/decoders/http/benchmarks/json/http_msg_type_state.json @@ -1,20 +1,16 @@ [ { "msg_0": "HTTP_TRANSACTION_START_transaction_0", - "msg_1": "HTTP_MESSAGE_REQ_LINE", - "msg_2": "HTTP_MESSAGE_REQ_HEADER", - "msg_3": "HTTP_MESSAGE_REQ_HEADER_END", - "msg_4": "HTTP_MESSAGE_REQ_BODY_START", - "msg_5": "HTTP_MESSAGE_REQ_BODY", - "msg_6": "HTTP_MESSAGE_REQ_BODY_END" + "msg_1": "HTTP_MESSAGE_REQ_LINE_HEADERS", + "msg_2": "HTTP_MESSAGE_REQ_BODY_START", + "msg_3": "HTTP_MESSAGE_REQ_BODY", + "msg_4": "HTTP_MESSAGE_REQ_BODY_END" }, { - "msg_7": "HTTP_MESSAGE_RES_LINE", - "msg_8": "HTTP_MESSAGE_RES_HEADER", - "msg_9": "HTTP_MESSAGE_RES_HEADER_END", - "msg_10": "HTTP_MESSAGE_RES_BODY_START", - "msg_11": "HTTP_MESSAGE_RES_BODY", - "msg_12": "HTTP_MESSAGE_RES_BODY_END", - "msg_13": "HTTP_TRANSACTION_END_transaction_0" + "msg_5": "HTTP_MESSAGE_RES_LINE_HEADERS", + "msg_6": "HTTP_MESSAGE_RES_BODY_START", + "msg_7": "HTTP_MESSAGE_RES_BODY", + "msg_8": "HTTP_MESSAGE_RES_BODY_END", + "msg_9": "HTTP_TRANSACTION_END_transaction_0" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_msg_type_state_c2s.json b/test/decoders/http/benchmarks/json/http_msg_type_state_c2s.json index 8533bb9..15385ad 100644 --- a/test/decoders/http/benchmarks/json/http_msg_type_state_c2s.json +++ b/test/decoders/http/benchmarks/json/http_msg_type_state_c2s.json @@ -1,13 +1,11 @@ [ { "msg_0": "HTTP_TRANSACTION_START_transaction_0", - "msg_1": "HTTP_MESSAGE_REQ_LINE", - "msg_2": "HTTP_MESSAGE_REQ_HEADER", - "msg_3": "HTTP_MESSAGE_REQ_HEADER_END", - "msg_4": "HTTP_MESSAGE_REQ_BODY_START", - "msg_5": "HTTP_MESSAGE_REQ_BODY", - "msg_6": "HTTP_MESSAGE_REQ_BODY_END", - "msg_7": "HTTP_TRANSACTION_END_transaction_0" + "msg_1": "HTTP_MESSAGE_REQ_LINE_HEADERS", + "msg_2": "HTTP_MESSAGE_REQ_BODY_START", + "msg_3": "HTTP_MESSAGE_REQ_BODY", + "msg_4": "HTTP_MESSAGE_REQ_BODY_END", + "msg_5": "HTTP_TRANSACTION_END_transaction_0" }, {} ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_msg_type_state_exception_c2s.json b/test/decoders/http/benchmarks/json/http_msg_type_state_exception_c2s.json index e694238..c78cf34 100644 --- a/test/decoders/http/benchmarks/json/http_msg_type_state_exception_c2s.json +++ b/test/decoders/http/benchmarks/json/http_msg_type_state_exception_c2s.json @@ -1,13 +1,11 @@ [ { "msg_0": "HTTP_TRANSACTION_START_transaction_0", - "msg_1": "HTTP_MESSAGE_REQ_LINE", - "msg_2": "HTTP_MESSAGE_REQ_HEADER", - "msg_3": "HTTP_MESSAGE_REQ_HEADER_END", - "msg_4": "HTTP_MESSAGE_REQ_BODY_START", - "msg_5": "HTTP_MESSAGE_REQ_BODY" + "msg_1": "HTTP_MESSAGE_REQ_LINE_HEADERS", + "msg_2": "HTTP_MESSAGE_REQ_BODY_START", + "msg_3": "HTTP_MESSAGE_REQ_BODY" }, { - "msg_6": "HTTP_TRANSACTION_END_transaction_0" + "msg_4": "HTTP_TRANSACTION_END_transaction_0" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_msg_type_state_exception_s2c.json b/test/decoders/http/benchmarks/json/http_msg_type_state_exception_s2c.json index cf03270..a7c9865 100644 --- a/test/decoders/http/benchmarks/json/http_msg_type_state_exception_s2c.json +++ b/test/decoders/http/benchmarks/json/http_msg_type_state_exception_s2c.json @@ -1,16 +1,12 @@ [ { "msg_0": "HTTP_TRANSACTION_START_transaction_0", - "msg_1": "HTTP_MESSAGE_REQ_LINE", - "msg_2": "HTTP_MESSAGE_REQ_HEADER", - "msg_3": "HTTP_MESSAGE_REQ_HEADER_END" + "msg_1": "HTTP_MESSAGE_REQ_LINE_HEADERS" }, { - "msg_4": "HTTP_MESSAGE_RES_LINE", - "msg_5": "HTTP_MESSAGE_RES_HEADER", - "msg_6": "HTTP_MESSAGE_RES_HEADER_END", - "msg_7": "HTTP_MESSAGE_RES_BODY_START", - "msg_8": "HTTP_MESSAGE_RES_BODY", - "msg_9": "HTTP_TRANSACTION_END_transaction_0" + "msg_2": "HTTP_MESSAGE_RES_LINE_HEADERS", + "msg_3": "HTTP_MESSAGE_RES_BODY_START", + "msg_4": "HTTP_MESSAGE_RES_BODY", + "msg_5": "HTTP_TRANSACTION_END_transaction_0" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_msg_type_state_pipeline.json b/test/decoders/http/benchmarks/json/http_msg_type_state_pipeline.json index d50f4ac..4028c0f 100644 --- a/test/decoders/http/benchmarks/json/http_msg_type_state_pipeline.json +++ b/test/decoders/http/benchmarks/json/http_msg_type_state_pipeline.json @@ -1,61 +1,45 @@ [ { "msg_0": "HTTP_TRANSACTION_START_transaction_0", - "msg_1": "HTTP_MESSAGE_REQ_LINE", - "msg_2": "HTTP_MESSAGE_REQ_HEADER", - "msg_3": "HTTP_MESSAGE_REQ_HEADER_END", - "msg_8": "HTTP_TRANSACTION_START_transaction_1", - "msg_9": "HTTP_MESSAGE_REQ_LINE", - "msg_10": "HTTP_MESSAGE_REQ_HEADER", - "msg_11": "HTTP_MESSAGE_REQ_HEADER_END", - "msg_16": "HTTP_TRANSACTION_START_transaction_2", - "msg_17": "HTTP_MESSAGE_REQ_LINE", - "msg_18": "HTTP_MESSAGE_REQ_HEADER", - "msg_19": "HTTP_MESSAGE_REQ_HEADER_END", - "msg_24": "HTTP_TRANSACTION_START_transaction_3", - "msg_25": "HTTP_MESSAGE_REQ_LINE", - "msg_26": "HTTP_MESSAGE_REQ_HEADER", - "msg_27": "HTTP_MESSAGE_REQ_HEADER_END" + "msg_1": "HTTP_MESSAGE_REQ_LINE_HEADERS", + "msg_4": "HTTP_TRANSACTION_START_transaction_1", + "msg_5": "HTTP_MESSAGE_REQ_LINE_HEADERS", + "msg_8": "HTTP_TRANSACTION_START_transaction_2", + "msg_9": "HTTP_MESSAGE_REQ_LINE_HEADERS", + "msg_12": "HTTP_TRANSACTION_START_transaction_3", + "msg_13": "HTTP_MESSAGE_REQ_LINE_HEADERS" }, { - "msg_4": "HTTP_MESSAGE_RES_LINE", - "msg_5": "HTTP_MESSAGE_RES_HEADER", - "msg_6": "HTTP_MESSAGE_RES_HEADER_END", - "msg_7": "HTTP_TRANSACTION_END_transaction_0", - "msg_12": "HTTP_MESSAGE_RES_LINE", - "msg_13": "HTTP_MESSAGE_RES_HEADER", - "msg_14": "HTTP_MESSAGE_RES_HEADER_END", - "msg_15": "HTTP_TRANSACTION_END_transaction_1", - "msg_20": "HTTP_MESSAGE_RES_LINE", - "msg_21": "HTTP_MESSAGE_RES_HEADER", - "msg_22": "HTTP_MESSAGE_RES_HEADER_END", - "msg_23": "HTTP_TRANSACTION_END_transaction_2", - "msg_28": "HTTP_MESSAGE_RES_LINE", - "msg_29": "HTTP_MESSAGE_RES_HEADER", - "msg_30": "HTTP_MESSAGE_RES_HEADER_END", - "msg_31": "HTTP_MESSAGE_RES_BODY_START", + "msg_2": "HTTP_MESSAGE_RES_LINE_HEADERS", + "msg_3": "HTTP_TRANSACTION_END_transaction_0", + "msg_6": "HTTP_MESSAGE_RES_LINE_HEADERS", + "msg_7": "HTTP_TRANSACTION_END_transaction_1", + "msg_10": "HTTP_MESSAGE_RES_LINE_HEADERS", + "msg_11": "HTTP_TRANSACTION_END_transaction_2", + "msg_14": "HTTP_MESSAGE_RES_LINE_HEADERS", + "msg_15": "HTTP_MESSAGE_RES_BODY_START", + "msg_16": "HTTP_MESSAGE_RES_BODY", + "msg_17": "HTTP_MESSAGE_RES_BODY", + "msg_18": "HTTP_MESSAGE_RES_BODY", + "msg_19": "HTTP_MESSAGE_RES_BODY", + "msg_20": "HTTP_MESSAGE_RES_BODY", + "msg_21": "HTTP_MESSAGE_RES_BODY", + "msg_22": "HTTP_MESSAGE_RES_BODY", + "msg_23": "HTTP_MESSAGE_RES_BODY", + "msg_24": "HTTP_MESSAGE_RES_BODY", + "msg_25": "HTTP_MESSAGE_RES_BODY", + "msg_26": "HTTP_MESSAGE_RES_BODY", + "msg_27": "HTTP_MESSAGE_RES_BODY", + "msg_28": "HTTP_MESSAGE_RES_BODY", + "msg_29": "HTTP_MESSAGE_RES_BODY", + "msg_30": "HTTP_MESSAGE_RES_BODY", + "msg_31": "HTTP_MESSAGE_RES_BODY", "msg_32": "HTTP_MESSAGE_RES_BODY", "msg_33": "HTTP_MESSAGE_RES_BODY", "msg_34": "HTTP_MESSAGE_RES_BODY", "msg_35": "HTTP_MESSAGE_RES_BODY", "msg_36": "HTTP_MESSAGE_RES_BODY", - "msg_37": "HTTP_MESSAGE_RES_BODY", - "msg_38": "HTTP_MESSAGE_RES_BODY", - "msg_39": "HTTP_MESSAGE_RES_BODY", - "msg_40": "HTTP_MESSAGE_RES_BODY", - "msg_41": "HTTP_MESSAGE_RES_BODY", - "msg_42": "HTTP_MESSAGE_RES_BODY", - "msg_43": "HTTP_MESSAGE_RES_BODY", - "msg_44": "HTTP_MESSAGE_RES_BODY", - "msg_45": "HTTP_MESSAGE_RES_BODY", - "msg_46": "HTTP_MESSAGE_RES_BODY", - "msg_47": "HTTP_MESSAGE_RES_BODY", - "msg_48": "HTTP_MESSAGE_RES_BODY", - "msg_49": "HTTP_MESSAGE_RES_BODY", - "msg_50": "HTTP_MESSAGE_RES_BODY", - "msg_51": "HTTP_MESSAGE_RES_BODY", - "msg_52": "HTTP_MESSAGE_RES_BODY", - "msg_53": "HTTP_MESSAGE_RES_BODY_END", - "msg_54": "HTTP_TRANSACTION_END_transaction_3" + "msg_37": "HTTP_MESSAGE_RES_BODY_END", + "msg_38": "HTTP_TRANSACTION_END_transaction_3" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_msg_type_state_s2c.json b/test/decoders/http/benchmarks/json/http_msg_type_state_s2c.json index c59d0bb..92f9df0 100644 --- a/test/decoders/http/benchmarks/json/http_msg_type_state_s2c.json +++ b/test/decoders/http/benchmarks/json/http_msg_type_state_s2c.json @@ -2,12 +2,10 @@ {}, { "msg_0": "HTTP_TRANSACTION_START_transaction_0", - "msg_1": "HTTP_MESSAGE_RES_LINE", - "msg_2": "HTTP_MESSAGE_RES_HEADER", - "msg_3": "HTTP_MESSAGE_RES_HEADER_END", - "msg_4": "HTTP_MESSAGE_RES_BODY_START", - "msg_5": "HTTP_MESSAGE_RES_BODY", - "msg_6": "HTTP_MESSAGE_RES_BODY_END", - "msg_7": "HTTP_TRANSACTION_END_transaction_0" + "msg_1": "HTTP_MESSAGE_RES_LINE_HEADERS", + "msg_2": "HTTP_MESSAGE_RES_BODY_START", + "msg_3": "HTTP_MESSAGE_RES_BODY", + "msg_4": "HTTP_MESSAGE_RES_BODY_END", + "msg_5": "HTTP_TRANSACTION_END_transaction_0" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel.json b/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel.json index 4a66f37..ad22440 100644 --- a/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel.json +++ b/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel.json @@ -3,20 +3,16 @@ "msg_0": "HTTP_TRANSACTION_START_transaction_0", "msg_1": "HTTP_MESSAGE_REQ_LINE", "msg_2": "HTTP_MESSAGE_REQ_HEADER", - "msg_3": "HTTP_MESSAGE_REQ_HEADER_END", "msg_8": "HTTP_TRANSACTION_START_transaction_1", "msg_9": "HTTP_MESSAGE_REQ_LINE", - "msg_10": "HTTP_MESSAGE_REQ_HEADER", - "msg_11": "HTTP_MESSAGE_REQ_HEADER_END" + "msg_10": "HTTP_MESSAGE_REQ_HEADER" }, { "msg_4": "HTTP_MESSAGE_RES_LINE", "msg_5": "HTTP_MESSAGE_RES_HEADER", - "msg_6": "HTTP_MESSAGE_RES_HEADER_END", "msg_7": "HTTP_TRANSACTION_END_transaction_0", "msg_12": "HTTP_MESSAGE_RES_LINE", "msg_13": "HTTP_MESSAGE_RES_HEADER", - "msg_14": "HTTP_MESSAGE_RES_HEADER_END", "msg_15": "HTTP_MESSAGE_RES_BODY", "msg_16": "HTTP_MESSAGE_RES_BODY", "msg_17": "HTTP_MESSAGE_RES_BODY", diff --git a/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel_c2s.json b/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel_c2s.json index 5b7e588..6f8857b 100644 --- a/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel_c2s.json +++ b/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel_c2s.json @@ -3,12 +3,10 @@ "msg_0": "HTTP_TRANSACTION_START_transaction_0", "msg_1": "HTTP_MESSAGE_REQ_LINE", "msg_2": "HTTP_MESSAGE_REQ_HEADER", - "msg_3": "HTTP_MESSAGE_REQ_HEADER_END", "msg_4": "HTTP_TRANSACTION_END_transaction_0", "msg_5": "HTTP_TRANSACTION_START_transaction_1", "msg_6": "HTTP_MESSAGE_REQ_LINE", "msg_7": "HTTP_MESSAGE_REQ_HEADER", - "msg_8": "HTTP_MESSAGE_REQ_HEADER_END", "msg_9": "HTTP_TRANSACTION_END_transaction_1" }, {} diff --git a/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel_s2c.json b/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel_s2c.json index 07a1451..66704f1 100644 --- a/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel_s2c.json +++ b/test/decoders/http/benchmarks/json/http_msg_type_state_tunnel_s2c.json @@ -4,12 +4,10 @@ "msg_0": "HTTP_TRANSACTION_START_transaction_0", "msg_1": "HTTP_MESSAGE_RES_LINE", "msg_2": "HTTP_MESSAGE_RES_HEADER", - "msg_3": "HTTP_MESSAGE_RES_HEADER_END", "msg_4": "HTTP_TRANSACTION_END_transaction_0", "msg_5": "HTTP_TRANSACTION_START_transaction_1", "msg_6": "HTTP_MESSAGE_RES_LINE", "msg_7": "HTTP_MESSAGE_RES_HEADER", - "msg_8": "HTTP_MESSAGE_RES_HEADER_END", "msg_9": "HTTP_MESSAGE_RES_BODY", "msg_10": "HTTP_MESSAGE_RES_BODY", "msg_11": "HTTP_MESSAGE_RES_BODY", diff --git a/test/decoders/http/benchmarks/json/http_multi_parse_error.json b/test/decoders/http/benchmarks/json/http_multi_parse_error.json index c49d41e..a6f0d91 100644 --- a/test/decoders/http/benchmarks/json/http_multi_parse_error.json +++ b/test/decoders/http/benchmarks/json/http_multi_parse_error.json @@ -15,9 +15,9 @@ "Content-Type": "text/xml", "Date": "Sat Sep 7 10:05:13 2019", "Content-Length": "468", - "__X_HTTP_URL": ":4445/RPC2", - "__X_HTTP_RAW_PAYLOAD_MD5": "6eccbcf261f04aabfa69884aa283f4f3", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "6eccbcf261f04aabfa69884aa283f4f3" + "__X_HTTP_URL": "/:4445/RPC2", + "__X_HTTP_HEADERS_INTERGRATION": "Host: \r\nUser-Agent: ulxmlrpcpp/1.7.5\r\nConnection: Close\r\nContent-Type: text/xml\r\nDate: Sat Sep 7 10:05:13 2019\r\nContent-Length: 468\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "6eccbcf261f04aabfa69884aa283f4f3" }, { "__X_HTTP_TRANSACTION": "response", @@ -32,7 +32,7 @@ "Transfer-Encoding": "chunked", "X-Powered-By": "ulxmlrpcpp/1.7.4", "Date": "Sat Sep 7 01:09:24 2019", - "__X_HTTP_RAW_PAYLOAD_MD5": "5cf8a4aa9a54e7f2d05b55ed05bf9071", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "5cf8a4aa9a54e7f2d05b55ed05bf9071" + "__X_HTTP_HEADERS_INTERGRATION": "Connection: Close\r\nContent-Type: text/xml\r\nTransfer-Encoding: chunked\r\nX-Powered-By: ulxmlrpcpp/1.7.4\r\nServer: \r\nDate: Sat Sep 7 01:09:24 2019\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "5cf8a4aa9a54e7f2d05b55ed05bf9071" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_no_content_length.json b/test/decoders/http/benchmarks/json/http_no_content_length.json index 9310d04..faf3be4 100644 --- a/test/decoders/http/benchmarks/json/http_no_content_length.json +++ b/test/decoders/http/benchmarks/json/http_no_content_length.json @@ -20,7 +20,8 @@ "Connection": "keep-alive", "Referer": "http://www.xxxxxxxx.com/xxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxx.html", "Cookie": "trafic_ranking=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", - "__X_HTTP_URL": "xxxxxxx.xxxxxx.xx/js/xxxxxx.js" + "__X_HTTP_URL": "xxxxxxx.xxxxxx.xx/js/xxxxxx.js", + "__X_HTTP_HEADERS_INTERGRATION": "Host: xxxxxxx.xxxxxx.xx\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\nAccept: */*\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 115\r\nConnection: keep-alive\r\nReferer: http://www.xxxxxxxx.com/xxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxx.html\r\nCookie: trafic_ranking=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -40,7 +41,7 @@ "P3P": "policyref=\"/w3c/p3p.xml\", CP=\"ALL IND DSP COR ADM CONo CUR IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI\"", "Set-Cookie": "trafic_ranking=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; expires=Sun, 11-Jan-2037 14:00:00 GMT; path=/; domain=.xxxxxx.xx", "connection": "close", - "__X_HTTP_RAW_PAYLOAD_MD5": "9fb54a2726ca3cf54a82804d0e66d08a", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "9fb54a2726ca3cf54a82804d0e66d08a" + "__X_HTTP_HEADERS_INTERGRATION": "Date: Mon, 10 May 2010 08:31:02 GMT\r\nServer: Apache\r\nContent-type: application/x-javascript\r\nExpires: Thu, 11 Jan 1973 16:00:00 GMT\r\nLast-Modified: Mon, 10 May 2010 08:31:02 GMT\r\nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\nPragma: no-cache\r\nP3P: policyref=\"/w3c/p3p.xml\", CP=\"ALL IND DSP COR ADM CONo CUR IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI\"\r\nSet-Cookie: trafic_ranking=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; expires=Sun, 11-Jan-2037 14:00:00 GMT; path=/; domain=.xxxxxx.xx\r\nconnection: close\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "9fb54a2726ca3cf54a82804d0e66d08a" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_out_of_order.json b/test/decoders/http/benchmarks/json/http_out_of_order.json index 489b7c1..65124e7 100644 --- a/test/decoders/http/benchmarks/json/http_out_of_order.json +++ b/test/decoders/http/benchmarks/json/http_out_of_order.json @@ -19,7 +19,8 @@ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Cookie": "_ga=GA1.2.1223391296.1710844147; _ga_CGYVD7S4G4=GS1.1.1711101500.1.1.1711101524.0.0.0; _gcl_au=1.1.45985360.1720059434; arialoadData=true; ariawapChangeViewPort=false; JSESSIONID=ZoFJbBlIeHCsA5414j6JC-vO6jvcBw7_xphcV3qerj5Q8htV6XH8!-1677015109", - "__X_HTTP_URL": "www.airchina.com/cn/images/globesite/airchina.jpg" + "__X_HTTP_URL": "www.airchina.com/cn/images/globesite/airchina.jpg", + "__X_HTTP_HEADERS_INTERGRATION": "Host: www.airchina.com\r\nConnection: keep-alive\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36\r\nDNT: 1\r\nAccept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8\r\nReferer: http://www.airchina.com/website/ip2.jsp?v=20230128\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\nCookie: _ga=GA1.2.1223391296.1710844147; _ga_CGYVD7S4G4=GS1.1.1711101500.1.1.1711101524.0.0.0; _gcl_au=1.1.45985360.1720059434; arialoadData=true; ariawapChangeViewPort=false; JSESSIONID=ZoFJbBlIeHCsA5414j6JC-vO6jvcBw7_xphcV3qerj5Q8htV6XH8!-1677015109\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -38,7 +39,7 @@ "Keep-Alive": "timeout=120, max=1000", "Connection": "Keep-Alive", "Content-Type": "image/jpeg", - "__X_HTTP_RAW_PAYLOAD_MD5": "c4c9d459415e922f877a2af6afd9d316", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "c4c9d459415e922f877a2af6afd9d316" + "__X_HTTP_HEADERS_INTERGRATION": "Date: Tue, 13 Aug 2024 01:48:28 GMT\r\nServer: Apache\r\nX-Frame-Options: SAMEORIGIN\r\nLast-Modified: Tue, 06 Aug 2019 02:10:09 GMT\r\nAccept-Ranges: bytes\r\nContent-Length: 67424\r\nKeep-Alive: timeout=120, max=1000\r\nConnection: Keep-Alive\r\nContent-Type: image/jpeg\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "c4c9d459415e922f877a2af6afd9d316" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_over_pppoe.json b/test/decoders/http/benchmarks/json/http_over_pppoe.json index b4b4bfb..4c334ab 100644 --- a/test/decoders/http/benchmarks/json/http_over_pppoe.json +++ b/test/decoders/http/benchmarks/json/http_over_pppoe.json @@ -13,7 +13,8 @@ "User-Agent": "curl/7.34.0", "Host": "ipv6.icanhazip.com", "Accept": "*/*", - "__X_HTTP_URL": "ipv6.icanhazip.com/" + "__X_HTTP_URL": "ipv6.icanhazip.com/", + "__X_HTTP_HEADERS_INTERGRATION": "User-Agent: curl/7.34.0\r\nHost: ipv6.icanhazip.com\r\nAccept: */*\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -30,7 +31,7 @@ "X-RTFM": "Learn about this site at http://bit.ly/14DAh2o and don't abuse the service", "X-YOU-SHOULD-APPLY-FOR-A-JOB": "If you're reading this, apply here: http://rackertalent.com/", "X-ICANHAZNODE": "icanhazip1.nugget", - "__X_HTTP_RAW_PAYLOAD_MD5": "624520ac54235ac2284ed2dd2b17e1ad", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "624520ac54235ac2284ed2dd2b17e1ad" + "__X_HTTP_HEADERS_INTERGRATION": "Date: Thu, 02 Jan 2014 08:38:06 GMT\r\nServer: Apache\r\nContent-Length: 38\r\nContent-Type: text/plain; charset=UTF-8\r\nX-RTFM: Learn about this site at http://bit.ly/14DAh2o and don't abuse the service\r\nX-YOU-SHOULD-APPLY-FOR-A-JOB: If you're reading this, apply here: http://rackertalent.com/\r\nX-ICANHAZNODE: icanhazip1.nugget\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "624520ac54235ac2284ed2dd2b17e1ad" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_over_tcp_keepalive.json b/test/decoders/http/benchmarks/json/http_over_tcp_keepalive.json index 2754249..379e9ac 100644 --- a/test/decoders/http/benchmarks/json/http_over_tcp_keepalive.json +++ b/test/decoders/http/benchmarks/json/http_over_tcp_keepalive.json @@ -19,7 +19,8 @@ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Cookie": "UM_distinctid=17d37645f9c1a1-0281befa480414-b7a1a38-144000-17d37645f9d336; CNZZDATA1258295942=1778021578-1637307701-%7C1637307701; Hm_lvt_a6dc86f6e27435039966e994bd7f0792=1637311872; yumi_sid=JaMlFyTA07ikpZjTHZsRTWyGdMqFyFy%2B4hXGj%2FSoQRJYbrfBUQuOTIMZ8jUGmugDC594AYcbeRhg75xidhRxCW4zq9Y0gPwTmkhq4LQuprp4DrtDMLI3L5wLMqkG%2FuAX1aVFPfud5GRNxNFTSp%2Bos%2FKhfCFKhfN5%2BuT2xyVYSAjy2ftiSOGDi7FN13icuuyPhFCoWqOxWVu1CZ3AiYPJssv6kXqiR6paf75icdeROZY2bkFCDKkcIQcPy7o9EKpkL1Mbimeb40JMg9hUsWdmyhDkzVjSHJmC4z2ujpzSDTsjRIQOnxTy1PHZi%2FMwg3uyGLCusDwqbagpO4pcgEJ5ONDy%2BGwO7FmHXU3mFfR56c9HxxiiuLPnBt9ErpqqWKsxH6lUrlHaUp6AzyrgX7PFdksiMfPSk6%2F3%2FWOYr%2FkYuI4fopw7z8%2FLhxC9AiLr9Czz3MngFUGzkmaMVvAhZOSPzg%3D%3D; Hm_lpvt_a6dc86f6e27435039966e994bd7f0792=1637313847", - "__X_HTTP_URL": "www.yumi.com/" + "__X_HTTP_URL": "www.yumi.com/", + "__X_HTTP_HEADERS_INTERGRATION": "Host: www.yumi.com\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: UM_distinctid=17d37645f9c1a1-0281befa480414-b7a1a38-144000-17d37645f9d336; CNZZDATA1258295942=1778021578-1637307701-%7C1637307701; Hm_lvt_a6dc86f6e27435039966e994bd7f0792=1637311872; yumi_sid=JaMlFyTA07ikpZjTHZsRTWyGdMqFyFy%2B4hXGj%2FSoQRJYbrfBUQuOTIMZ8jUGmugDC594AYcbeRhg75xidhRxCW4zq9Y0gPwTmkhq4LQuprp4DrtDMLI3L5wLMqkG%2FuAX1aVFPfud5GRNxNFTSp%2Bos%2FKhfCFKhfN5%2BuT2xyVYSAjy2ftiSOGDi7FN13icuuyPhFCoWqOxWVu1CZ3AiYPJssv6kXqiR6paf75icdeROZY2bkFCDKkcIQcPy7o9EKpkL1Mbimeb40JMg9hUsWdmyhDkzVjSHJmC4z2ujpzSDTsjRIQOnxTy1PHZi%2FMwg3uyGLCusDwqbagpO4pcgEJ5ONDy%2BGwO7FmHXU3mFfR56c9HxxiiuLPnBt9ErpqqWKsxH6lUrlHaUp6AzyrgX7PFdksiMfPSk6%2F3%2FWOYr%2FkYuI4fopw7z8%2FLhxC9AiLr9Czz3MngFUGzkmaMVvAhZOSPzg%3D%3D; Hm_lpvt_a6dc86f6e27435039966e994bd7f0792=1637313847\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -39,7 +40,8 @@ "Pragma": "no-cache", "Cache-Control": "no-store", "Content-Encoding": "gzip", - "__X_HTTP_RAW_PAYLOAD_MD5": "3f80dc84438b2f2d6b5e58084e31671c", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "af9b1a0118edd2920db355f9eee4ab75" + "__X_HTTP_HEADERS_INTERGRATION": "Server: Tengine\r\nDate: Fri, 19 Nov 2021 09:57:40 GMT\r\nContent-Type: text/html\r\nTransfer-Encoding: chunked\r\nConnection: keep-alive\r\nVary: Accept-Encoding\r\nSet-Cookie: yumi_sid=V6EhlyovLp46BBzQWLVOBg%2F73RUD5E%2FfaRlkR8RLa8aKhGrPVdVHvHfFWRKKd9wZ%2BfFF4Tb2wnVOOn%2F9iXbBpyHsbxjmUqnbFSoAX7QIJjt%2BEEjAL3M7O7VSpAyMnrFKt7qu46oXV%2B6teyyTUY7Ucy285v6otvZcu8bN%2B5YxKZ1gYh56iJ0bHxnrnQ0vvAx3l%2BLwfw2y0c5IaF2tjrL%2Fn83nrHsPoYYRWAR2zLIXD%2FEMKRtyerwsM5LKhZZteFGWD2w%2B15alKF5T65i0lPvPcAdaqpceL5xz23twQULhs1tIJsOfJZ8JudLlRy6x3DvxQYqRe2xTCex5c77zJqfq%2FdryNbBycIq9gf6C2hXDRwDqRqVgXDMadwGnooKFkv%2ByCbohjHyBCZJypBcYFmglYhin23UC9i%2B%2BOA%2FxhlxcnU8kT8udpTNCktSmF950SQLOmvdvYuXGydKs8v05cxe5fg%3D%3D; expires=Fri, 19-Nov-2021 11:57:38 GMT; Max-Age=7200; path=/; domain=.yumi.com\r\nPragma: no-cache\r\nCache-Control: no-store\r\nContent-Encoding: gzip\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "3f80dc84438b2f2d6b5e58084e31671c", + "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "af9b1a0118edd2920db355f9eee4ab75" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_pipeline_header_splitting.json b/test/decoders/http/benchmarks/json/http_pipeline_header_splitting.json index bebfa94..099e13a 100644 --- a/test/decoders/http/benchmarks/json/http_pipeline_header_splitting.json +++ b/test/decoders/http/benchmarks/json/http_pipeline_header_splitting.json @@ -18,7 +18,8 @@ "-X-header3": "value333", "-X-header4": "value444", "-X-header5": "value5555", - "__X_HTTP_URL": "127.0.0.1:8080 /111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.html" + "__X_HTTP_URL": "127.0.0.1:8080 /111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.html", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 127.0.0.1:8080 \r\nUser-Agent: curl/7.61.111\r\nAccept: */*\r\n-X-header1: value111\r\n-X-header2: value222\r\n-X-header3: value333\r\n-X-header4: value444\r\n-X-header5: value5555\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -31,8 +32,8 @@ "Server": "BaseHTTP/0.6 Python/3.6.88", "Date": "Sun, 01 Sep 2024 07:31:09 GMTT", "Content-length": "88", - "__X_HTTP_RAW_PAYLOAD_MD5": "c396b63d897591e928fae959915e9ebc", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "c396b63d897591e928fae959915e9ebc" + "__X_HTTP_HEADERS_INTERGRATION": "Server: BaseHTTP/0.6 Python/3.6.88\r\nDate: Sun, 01 Sep 2024 07:31:09 GMTT\r\nContent-length:88\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "c396b63d897591e928fae959915e9ebc" }, { "__X_HTTP_TRANSACTION": "request", @@ -50,7 +51,8 @@ "-X-header3": "value3333", "-X-header4": "value4444", "-X-header5": "value55555", - "__X_HTTP_URL": "127.0.0.1:8080/2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222.html" + "__X_HTTP_URL": "127.0.0.1:8080/2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222.html", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 127.0.0.1:8080\r\nUser-Agent: curl/7.61.1\r\nAccept: */*\r\n-X-header1: value111\r\n-X-header2: value2222\r\n-X-header3: value3333\r\n-X-header4: value4444\r\n-X-header5: value55555\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -63,7 +65,7 @@ "Server": "BaseHTTP/0.6 Python/3.6.88", "Date": "Sun, 01 Sep 2024 07:31:09 GMTT", "Content-length": "89", - "__X_HTTP_RAW_PAYLOAD_MD5": "5e3c5a7de2696e52ef42d9ccfd8ce831", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "5e3c5a7de2696e52ef42d9ccfd8ce831" + "__X_HTTP_HEADERS_INTERGRATION": "Server: BaseHTTP/0.6 Python/3.6.88\r\nDate: Sun, 01 Sep 2024 07:31:09 GMTT\r\nContent-length:89\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "5e3c5a7de2696e52ef42d9ccfd8ce831" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_post_multipart_form_data.json b/test/decoders/http/benchmarks/json/http_post_multipart_form_data.json index ac524f6..4b29571 100644 --- a/test/decoders/http/benchmarks/json/http_post_multipart_form_data.json +++ b/test/decoders/http/benchmarks/json/http_post_multipart_form_data.json @@ -17,7 +17,8 @@ "Accept-Encoding": "gzip,deflate,sdch", "Accept-Language": "zh-CN,zh;q=0.8", "Cookie": "JSESSIONID=969AC5FBD069EE6218EB10513726B244; JSESSIONID=400CC78DF5784F303702CC7F02C6122C", - "__X_HTTP_URL": "192.168.57.14:8080/fileupload/" + "__X_HTTP_URL": "192.168.57.14:8080/fileupload/", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 192.168.57.14:8080\r\nConnection: keep-alive\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: zh-CN,zh;q=0.8\r\nCookie: JSESSIONID=969AC5FBD069EE6218EB10513726B244; JSESSIONID=400CC78DF5784F303702CC7F02C6122C\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -31,8 +32,8 @@ "Content-Type": "text/html;charset=UTF-8", "Content-Length": "468", "Date": "Thu, 28 Mar 2019 08:13:33 GMT", - "__X_HTTP_RAW_PAYLOAD_MD5": "2b8cd757ab5ffba85acac26c008a1ffc", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "2b8cd757ab5ffba85acac26c008a1ffc" + "__X_HTTP_HEADERS_INTERGRATION": "Server: Apache-Coyote/1.1\r\nContent-Type: text/html;charset=UTF-8\r\nContent-Length: 468\r\nDate: Thu, 28 Mar 2019 08:13:33 GMT\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "2b8cd757ab5ffba85acac26c008a1ffc" }, { "__X_HTTP_TRANSACTION": "request", @@ -49,7 +50,8 @@ "Accept-Encoding": "gzip,deflate,sdch", "Accept-Language": "zh-CN,zh;q=0.8", "Cookie": "JSESSIONID=969AC5FBD069EE6218EB10513726B244; JSESSIONID=400CC78DF5784F303702CC7F02C6122C", - "__X_HTTP_URL": "192.168.57.14:8080/fileupload/" + "__X_HTTP_URL": "192.168.57.14:8080/fileupload/", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 192.168.57.14:8080\r\nConnection: keep-alive\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: zh-CN,zh;q=0.8\r\nCookie: JSESSIONID=969AC5FBD069EE6218EB10513726B244; JSESSIONID=400CC78DF5784F303702CC7F02C6122C\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -63,8 +65,8 @@ "Content-Type": "text/html;charset=UTF-8", "Content-Length": "468", "Date": "Thu, 28 Mar 2019 08:13:33 GMT", - "__X_HTTP_RAW_PAYLOAD_MD5": "2b8cd757ab5ffba85acac26c008a1ffc", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "2b8cd757ab5ffba85acac26c008a1ffc" + "__X_HTTP_HEADERS_INTERGRATION": "Server: Apache-Coyote/1.1\r\nContent-Type: text/html;charset=UTF-8\r\nContent-Length: 468\r\nDate: Thu, 28 Mar 2019 08:13:33 GMT\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "2b8cd757ab5ffba85acac26c008a1ffc" }, { "__X_HTTP_TRANSACTION": "request", @@ -87,8 +89,8 @@ "Accept-Language": "zh-CN,zh;q=0.8", "Cookie": "JSESSIONID=969AC5FBD069EE6218EB10513726B244; JSESSIONID=400CC78DF5784F303702CC7F02C6122C", "__X_HTTP_URL": "192.168.57.14:8080/fileupload/servlet/UploadHandleServlet", - "__X_HTTP_RAW_PAYLOAD_MD5": "550be33bf0ac01b6f7ac175bb8f4522a", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "550be33bf0ac01b6f7ac175bb8f4522a" + "__X_HTTP_HEADERS_INTERGRATION": "Host: 192.168.57.14:8080\r\nConnection: keep-alive\r\nContent-Length: 449\r\nCache-Control: max-age=0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nOrigin: http://192.168.57.14:8080\r\nUser-Agent: Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36\r\nContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryAe47vGj7ybAe6RwO\r\nReferer: http://192.168.57.14:8080/fileupload/\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: zh-CN,zh;q=0.8\r\nCookie: JSESSIONID=969AC5FBD069EE6218EB10513726B244; JSESSIONID=400CC78DF5784F303702CC7F02C6122C\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "550be33bf0ac01b6f7ac175bb8f4522a" }, { "__X_HTTP_TRANSACTION": "response", @@ -102,7 +104,7 @@ "Content-Type": "text/html;charset=UTF-8", "Content-Length": "144", "Date": "Thu, 28 Mar 2019 08:13:37 GMT", - "__X_HTTP_RAW_PAYLOAD_MD5": "3fa07f3ec9f9fefed96e9886f80760bb", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "3fa07f3ec9f9fefed96e9886f80760bb" + "__X_HTTP_HEADERS_INTERGRATION": "Server: Apache-Coyote/1.1\r\nContent-Type: text/html;charset=UTF-8\r\nContent-Length: 144\r\nDate: Thu, 28 Mar 2019 08:13:37 GMT\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "3fa07f3ec9f9fefed96e9886f80760bb" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_req_1byte_sliding_window.json b/test/decoders/http/benchmarks/json/http_req_1byte_sliding_window.json index 13b360d..7cd3e21 100644 --- a/test/decoders/http/benchmarks/json/http_req_1byte_sliding_window.json +++ b/test/decoders/http/benchmarks/json/http_req_1byte_sliding_window.json @@ -13,8 +13,9 @@ "User-Agent": "Wget/1.14 (linux-gnu)", "Accept": "*/*", "Host": "192.168.42.40", + "Connection": "Keep-Alive", "__X_HTTP_URL": "192.168.42.40/index.html", - "Connection": "Keep-Alive" + "__X_HTTP_HEADERS_INTERGRATION": "User-Agent: Wget/1.14 (linux-gnu)\r\nAccept: */*\r\nHost: 192.168.42.40\r\nConnection: Keep-Alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -29,7 +30,7 @@ "Content-type": "text/html", "Content-Length": "144", "Last-Modified": "Fri, 29 Dec 2023 08:50:53 GMT", - "__X_HTTP_RAW_PAYLOAD_MD5": "3e11876cd3a234541ae37d833c088a76", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "3e11876cd3a234541ae37d833c088a76" + "__X_HTTP_HEADERS_INTERGRATION": "Server: SimpleHTTP/0.6 Python/2.7.5\r\nDate: Fri, 29 Dec 2023 09:11:12 GMT\r\nContent-type: text/html\r\nContent-Length: 144\r\nLast-Modified: Fri, 29 Dec 2023 08:50:53 GMT\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "3e11876cd3a234541ae37d833c088a76" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_res_1byte_sliding_window.json b/test/decoders/http/benchmarks/json/http_res_1byte_sliding_window.json index f527839..65e1836 100644 --- a/test/decoders/http/benchmarks/json/http_res_1byte_sliding_window.json +++ b/test/decoders/http/benchmarks/json/http_res_1byte_sliding_window.json @@ -14,7 +14,8 @@ "Accept": "*/*", "Host": "192.168.40.137", "Connection": "Keep-Alive", - "__X_HTTP_URL": "192.168.40.137/index.html" + "__X_HTTP_URL": "192.168.40.137/index.html", + "__X_HTTP_HEADERS_INTERGRATION": "User-Agent: Wget/1.14 (linux-gnu)\r\nAccept: */*\r\nHost: 192.168.40.137\r\nConnection: Keep-Alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -29,7 +30,7 @@ "Content-type": "text/html", "Content-Length": "144", "Last-Modified": "Fri, 29 Dec 2023 08:50:53 GMT", - "__X_HTTP_RAW_PAYLOAD_MD5": "3e11876cd3a234541ae37d833c088a76", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "3e11876cd3a234541ae37d833c088a76" + "__X_HTTP_HEADERS_INTERGRATION": "Server: SimpleHTTP/0.6 Python/2.7.5\r\nDate: Fri, 29 Dec 2023 09:32:21 GMT\r\nContent-type: text/html\r\nContent-Length: 144\r\nLast-Modified: Fri, 29 Dec 2023 08:50:53 GMT\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "3e11876cd3a234541ae37d833c088a76" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_res_gzip.json b/test/decoders/http/benchmarks/json/http_res_gzip.json index 9d3e9c7..2b00fdb 100644 --- a/test/decoders/http/benchmarks/json/http_res_gzip.json +++ b/test/decoders/http/benchmarks/json/http_res_gzip.json @@ -19,7 +19,8 @@ "Keep-Alive": "300", "Connection": "keep-alive", "Cookie": "FGNCLIID=05c04axp1yaqynldtcdiwis0ag1", - "__X_HTTP_URL": "cerberus/test/ethereal.html" + "__X_HTTP_URL": "cerberus/test/ethereal.html", + "__X_HTTP_HEADERS_INTERGRATION": "Host: cerberus\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux ppc; rv:1.7.3) Gecko/20041004 Firefox/0.10.1\r\nAccept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\nCookie: FGNCLIID=05c04axp1yaqynldtcdiwis0ag1\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -39,7 +40,8 @@ "Content-Length": "92", "Connection": "close", "Content-Type": "text/html; charset=UTF-8", - "__X_HTTP_RAW_PAYLOAD_MD5": "dc2c0aff94148ca24acb516113a4d018", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "61b9e97f96045587bb55db781f7543ad" + "__X_HTTP_HEADERS_INTERGRATION": "Date: Fri, 29 Oct 2004 05:21:00 GMT\r\nServer: Apache/2.0.50 (Fedora)\r\nLast-Modified: Fri, 29 Oct 2004 05:20:21 GMT\r\nETag: \"126e1f-6d-371b2f40\"\r\nAccept-Ranges: bytes\r\nVary: Accept-Encoding\r\nContent-Encoding: gzip\r\nContent-Length: 92\r\nConnection: close\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "dc2c0aff94148ca24acb516113a4d018", + "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "61b9e97f96045587bb55db781f7543ad" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_trans_pipeline.json b/test/decoders/http/benchmarks/json/http_trans_pipeline.json index 4bd0879..1ca1197 100644 --- a/test/decoders/http/benchmarks/json/http_trans_pipeline.json +++ b/test/decoders/http/benchmarks/json/http_trans_pipeline.json @@ -13,7 +13,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/postinfo.html" + "__X_HTTP_URL": "116.181.2.152/postinfo.html", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -26,7 +27,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_aut/author.dll" + "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_aut/author.dll", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -39,7 +41,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_aut/author.exe" + "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_aut/author.exe", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -52,7 +55,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_aut/dvwssr.dll" + "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_aut/dvwssr.dll", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -65,7 +69,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_adm/admin.dll" + "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_adm/admin.dll", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -78,20 +83,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_adm/admin.exe" - }, - { - "__X_HTTP_TRANSACTION": "request", - "__X_HTTP_TRANSACTION_SEQ": 6, - "method": "GET", - "uri": "/_vti_bin/fpcount.exe?Page=default.asp|Image=3", - "req_version": "1.1", - "major_version": 1, - "minor_version": 1, - "Host": "116.181.2.152", - "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", - "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_bin/fpcount.exe?Page=default.asp|Image=3" + "__X_HTTP_URL": "116.181.2.152/_vti_bin/_vti_adm/admin.exe", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -106,8 +99,8 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "32dc0b2772bd73a952abba009291a399", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "32dc0b2772bd73a952abba009291a399" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:01 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "32dc0b2772bd73a952abba009291a399" }, { "__X_HTTP_TRANSACTION": "response", @@ -122,8 +115,8 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "db2ff8008149d8e70d8a2929acbb0f56", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "db2ff8008149d8e70d8a2929acbb0f56" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:02 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "db2ff8008149d8e70d8a2929acbb0f56" }, { "__X_HTTP_TRANSACTION": "response", @@ -138,8 +131,8 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "f5df152f7d8f34c630f298d2fcb46ed3", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "f5df152f7d8f34c630f298d2fcb46ed3" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:03 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "f5df152f7d8f34c630f298d2fcb46ed3" }, { "__X_HTTP_TRANSACTION": "response", @@ -154,8 +147,8 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "73e98ca7b62764869357b3e3c40dcd68", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "73e98ca7b62764869357b3e3c40dcd68" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:04 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "73e98ca7b62764869357b3e3c40dcd68" }, { "__X_HTTP_TRANSACTION": "response", @@ -170,8 +163,22 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "a5733c8989bde7f08506fa68c20f0c62", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "a5733c8989bde7f08506fa68c20f0c62" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:05 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "a5733c8989bde7f08506fa68c20f0c62" + }, + { + "__X_HTTP_TRANSACTION": "request", + "__X_HTTP_TRANSACTION_SEQ": 6, + "method": "GET", + "uri": "/_vti_bin/fpcount.exe?Page=default.asp|Image=3", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "116.181.2.152", + "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", + "Connection": "keep-alive", + "__X_HTTP_URL": "116.181.2.152/_vti_bin/fpcount.exe?Page=default.asp|Image=3", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -183,8 +190,9 @@ "minor_version": 1, "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", + "Connection": "keep-alive", "__X_HTTP_URL": "116.181.2.152/_vti_bin/shtml.dll", - "Connection": "keep-alive" + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -197,7 +205,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_bin/shtml.exe" + "__X_HTTP_URL": "116.181.2.152/_vti_bin/shtml.exe", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -210,7 +219,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_pvt/_x_todo.htm" + "__X_HTTP_URL": "116.181.2.152/_vti_pvt/_x_todo.htm", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -223,7 +233,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_pvt/_x_todoh.htm" + "__X_HTTP_URL": "116.181.2.152/_vti_pvt/_x_todoh.htm", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -236,7 +247,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_pvt/access.cnf" + "__X_HTTP_URL": "116.181.2.152/_vti_pvt/access.cnf", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -249,7 +261,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_pvt/administrator.pwd" + "__X_HTTP_URL": "116.181.2.152/_vti_pvt/administrator.pwd", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -262,7 +275,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_pvt/administrators.pwd" + "__X_HTTP_URL": "116.181.2.152/_vti_pvt/administrators.pwd", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "request", @@ -275,7 +289,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_pvt/authors.pwd" + "__X_HTTP_URL": "116.181.2.152/_vti_pvt/authors.pwd", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -290,8 +305,8 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "4bc0dde3722f76d60fef6f1d878cbb14", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "4bc0dde3722f76d60fef6f1d878cbb14" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:06 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "4bc0dde3722f76d60fef6f1d878cbb14" }, { "__X_HTTP_TRANSACTION": "response", @@ -306,8 +321,8 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "728dc2eafd49c9be8149add7c6aff207", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "728dc2eafd49c9be8149add7c6aff207" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:07 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "728dc2eafd49c9be8149add7c6aff207" }, { "__X_HTTP_TRANSACTION": "response", @@ -322,8 +337,8 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "0cde98e33181ee0ded49e8d0a3178d55", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "0cde98e33181ee0ded49e8d0a3178d55" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:08 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "0cde98e33181ee0ded49e8d0a3178d55" }, { "__X_HTTP_TRANSACTION": "response", @@ -338,8 +353,8 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "d627268e0aba817d818b6e2b7e41aa11", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "d627268e0aba817d818b6e2b7e41aa11" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:09 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "d627268e0aba817d818b6e2b7e41aa11" }, { "__X_HTTP_TRANSACTION": "response", @@ -354,8 +369,8 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "e99d9829d50bd94b3497b91011f6e349", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "e99d9829d50bd94b3497b91011f6e349" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:10 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "e99d9829d50bd94b3497b91011f6e349" }, { "__X_HTTP_TRANSACTION": "request", @@ -368,7 +383,8 @@ "Host": "116.181.2.152", "User-Agent": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)", "Connection": "keep-alive", - "__X_HTTP_URL": "116.181.2.152/_vti_pvt/bots.cnf" + "__X_HTTP_URL": "116.181.2.152/_vti_pvt/bots.cnf", + "__X_HTTP_HEADERS_INTERGRATION": "Host: 116.181.2.152\r\nUser-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)\r\nConnection: keep-alive\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -383,7 +399,7 @@ "Content-Type": "text/html", "Content-Length": "146", "Connection": "keep-alive", - "__X_HTTP_RAW_PAYLOAD_MD5": "99a813d29c5da4e6f7269be4c1a31c8e", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "99a813d29c5da4e6f7269be4c1a31c8e" + "__X_HTTP_HEADERS_INTERGRATION": "Server: nginx\r\nDate: Thu, 29 Oct 2020 09:59:11 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: keep-alive\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "99a813d29c5da4e6f7269be4c1a31c8e" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_upgrade_websocket.json b/test/decoders/http/benchmarks/json/http_upgrade_websocket.json index 6a7dfc3..05ae445 100644 --- a/test/decoders/http/benchmarks/json/http_upgrade_websocket.json +++ b/test/decoders/http/benchmarks/json/http_upgrade_websocket.json @@ -23,7 +23,8 @@ "Cookie": "s_cc=true; s_sq=%5B%5BB%5D%5D; iwe_user_noticecount_urn%3amace%3aucla.edu%3appid%3aperson%3a1223EF7211FC4EC1965579D0B8D85FBA=2; __utma=125574670.1759122974.1407127284.1407127284.1415755402.2; __utmc=125574670; __utma=126236063.2139843507.1390525421.1433785187.1435706244.46; __utmc=126236063; __utmz=126236063.1427934389.33.5.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); _ucla_sso=2015-07-02T11%3A34%3A30-07%3A00; _ga=GA1.2.1759122974.1407127284", "Sec-WebSocket-Key": "sgD1adxQ3mk6BbBqab7owA==", "Sec-WebSocket-Extensions": "permessage-deflate; client_max_window_bits", - "__X_HTTP_URL": "spurs.cs.ucla.edu:9696/" + "__X_HTTP_URL": "spurs.cs.ucla.edu:9696/", + "__X_HTTP_HEADERS_INTERGRATION": "Host: spurs.cs.ucla.edu:9696\r\nConnection: Upgrade\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nUpgrade: websocket\r\nOrigin: null\r\nSec-WebSocket-Version: 13\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36\r\nAccept-Encoding: gzip, deflate, sdch\r\nAccept-Language: en-US,en;q=0.8,lv;q=0.6,ru;q=0.4\r\nCookie: s_cc=true; s_sq=%5B%5BB%5D%5D; iwe_user_noticecount_urn%3amace%3aucla.edu%3appid%3aperson%3a1223EF7211FC4EC1965579D0B8D85FBA=2; __utma=125574670.1759122974.1407127284.1407127284.1415755402.2; __utmc=125574670; __utma=126236063.2139843507.1390525421.1433785187.1435706244.46; __utmc=126236063; __utmz=126236063.1427934389.33.5.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); _ucla_sso=2015-07-02T11%3A34%3A30-07%3A00; _ga=GA1.2.1759122974.1407127284\r\nSec-WebSocket-Key: sgD1adxQ3mk6BbBqab7owA==\r\nSec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -36,6 +37,7 @@ "Connection": "upgrade", "Sec-WebSocket-Accept": "FRh9fmH0UaoLdY5BSFO4hP2Pcjw=", "Server": "WebSocket++/0.5.1", - "Upgrade": "websocket" + "Upgrade": "websocket", + "__X_HTTP_HEADERS_INTERGRATION": "Connection: upgrade\r\nSec-WebSocket-Accept: FRh9fmH0UaoLdY5BSFO4hP2Pcjw=\r\nServer: WebSocket++/0.5.1\r\nUpgrade: websocket\r\n\r\n" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_url_test_without_host.json b/test/decoders/http/benchmarks/json/http_url_test_without_host.json index 09427a7..86592c7 100644 --- a/test/decoders/http/benchmarks/json/http_url_test_without_host.json +++ b/test/decoders/http/benchmarks/json/http_url_test_without_host.json @@ -11,7 +11,8 @@ "major_version": 1, "minor_version": 1, "User-Agent": "no h", - "__X_HTTP_URL": "192.168.244.128:8080/urltest/ttt" + "__X_HTTP_URL": "192.168.244.128:8080/urltest/ttt", + "__X_HTTP_HEADERS_INTERGRATION": "User-Agent: no h\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -24,7 +25,7 @@ "Server": "BaseHTTP/0.6 Python/3.6.8", "Date": "Thu, 14 Mar 2024 06:15:20 GMT", "Content-type": "application/json", - "__X_HTTP_RAW_PAYLOAD_MD5": "49dfdd54b01cbcd2d2ab5e9e5ee6b9b9", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "49dfdd54b01cbcd2d2ab5e9e5ee6b9b9" + "__X_HTTP_HEADERS_INTERGRATION": "Server: BaseHTTP/0.6 Python/3.6.8\r\nDate: Thu, 14 Mar 2024 06:15:20 GMT\r\nContent-type: application/json\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "49dfdd54b01cbcd2d2ab5e9e5ee6b9b9" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_url_test_without_host_v6.json b/test/decoders/http/benchmarks/json/http_url_test_without_host_v6.json index 2bc3934..7af1493 100644 --- a/test/decoders/http/benchmarks/json/http_url_test_without_host_v6.json +++ b/test/decoders/http/benchmarks/json/http_url_test_without_host_v6.json @@ -19,7 +19,8 @@ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "If-Modified-Since": "Mon, 05 Aug 2024 00:26:26 GMT", - "__X_HTTP_URL": "2408:8722:840:f8::83:80/dist/aria.js?appid=1cea560ed256bea7ae52761bd9042164" + "__X_HTTP_URL": "2408:8722:840:f8::83:80/dist/aria.js?appid=1cea560ed256bea7ae52761bd9042164", + "__X_HTTP_HEADERS_INTERGRATION": "_HOT: ent.govwza.cn\r\nConnection: keep-alive\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36\r\nDNT: 1\r\nAccept: */*\r\nReferer: http://www.airchina.com/\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\nIf-Modified-Since: Mon, 05 Aug 2024 00:26:26 GMT\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -37,6 +38,7 @@ "Connection": "close", "X-Cache-Lookup": "Cache Hit", "Access-Control-Allow-Origin": "*", - "Cache-Control": "max-age=86400" + "Cache-Control": "max-age=86400", + "__X_HTTP_HEADERS_INTERGRATION": "Date: Mon, 05 Aug 2024 07:51:04 GMT\r\nContent-Type: application/javascript;charset=UTF-8\r\nVary: origin,access-control-request-method,access-control-request-headers,accept-encoding\r\nServer: SLT-MID\r\nX-NWS-LOG-UUID: 1242198743243161630\r\nConnection: close\r\nX-Cache-Lookup: Cache Hit\r\nAccess-Control-Allow-Origin: *\r\nCache-Control: max-age=86400\r\n\r\n" } ] \ No newline at end of file diff --git a/test/decoders/http/benchmarks/json/http_zlib_deadlock.json b/test/decoders/http/benchmarks/json/http_zlib_deadlock.json index 0ea9b7f..7b4ac9a 100644 --- a/test/decoders/http/benchmarks/json/http_zlib_deadlock.json +++ b/test/decoders/http/benchmarks/json/http_zlib_deadlock.json @@ -17,7 +17,8 @@ "Host": "xmc.ximalaya.com", "Connection": "Keep-Alive", "Accept-Encoding": "gzip", - "__X_HTTP_URL": "xmc.ximalaya.com/xmlymain-login-web/login/ts-1657244122966?appId=mainApp&appStatus=2&clientType=android&isFirstReq=false&lastSuccessIp=180.153.250.247:3814&userId=175776850" + "__X_HTTP_URL": "xmc.ximalaya.com/xmlymain-login-web/login/ts-1657244122966?appId=mainApp&appStatus=2&clientType=android&isFirstReq=false&lastSuccessIp=180.153.250.247:3814&userId=175776850", + "__X_HTTP_HEADERS_INTERGRATION": "Cookie2: $version=1\r\nAccept: */*\r\nuser-agent: ting_xmim1.0(Mi+10,Android29)\r\nxmTraceId: f30c74a5-c62d-46a0-80bd-d51dbf139976163\r\nHost: xmc.ximalaya.com\r\nConnection: Keep-Alive\r\nAccept-Encoding: gzip\r\n\r\n" }, { "__X_HTTP_TRANSACTION": "response", @@ -37,7 +38,8 @@ "X-NWS-LOG-UUID": "12197298277844186084", "Connection": "keep-alive", "X-Cache-Lookup": "Cache Miss", - "__X_HTTP_RAW_PAYLOAD_MD5": "3979c98326c16f482f364ee94be3c382", - "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "d383effc464d797b5fdb4d98f4ab0111" + "__X_HTTP_HEADERS_INTERGRATION": "Server: Tengine\r\nDate: Fri, 08 Jul 2022 01:35:24 GMT\r\nContent-Type: application/json;charset=UTF-8\r\nVary: Accept-Encoding\r\nx-idc-gw: 0\r\nContent-Encoding: gzip\r\nTransfer-Encoding: chunked\r\nX-NWS-LOG-UUID: 12197298277844186084\r\nConnection: keep-alive\r\nX-Cache-Lookup: Cache Miss\r\n\r\n", + "__X_HTTP_RAW_PAYLOAD_MD5": "3979c98326c16f482f364ee94be3c382", + "__X_HTTP_DECOMPRESS_PAYLOAD_MD5": "d383effc464d797b5fdb4d98f4ab0111" } ] \ No newline at end of file diff --git a/test/decoders/http/http_gtest.cpp b/test/decoders/http/http_gtest.cpp index 4f99fb6..305b6ed 100644 --- a/test/decoders/http/http_gtest.cpp +++ b/test/decoders/http/http_gtest.cpp @@ -3,11 +3,18 @@ #include #include "zlib.h" #include "md5/md5.h" -#include "http.h" #include "http_decoder_private.h" +#ifdef __cplusplus +extern "C" +{ +#endif +#include "http.h" +#include "llhttp.h" #include "brotli/decode.h" #include "brotli/encode.h" -#include "event2/buffer.h" +#ifdef __cplusplus +} +#endif #define ZIP_UNZIP_TEST_DATA_LEN (1024 * 1024) void httpd_url_decode(const char *string, size_t length, char *ostring, size_t *olen); @@ -60,27 +67,55 @@ TEST(http_url_decoder, chinese2) EXPECT_EQ(decoded_url_len, strlen("http://www.baidu.com/\xE7\xBC\x96\xE8\xA7\xA3\xE7\xA0\x81\xE6\xB5\x8B\xE8\xAF\x95\xE5\x93\x88\xE5\x93\x88")); } -TEST(http, event_buffer) +TEST(http, buffer) { - struct evbuffer *evbuf = evbuffer_new(); + struct http_buffer *hbuf = http_buffer_new(); - evbuffer_add(evbuf, "hello", 5); + http_buffer_add(hbuf, "hello", 5); + + char *data; + size_t len; + http_buffer_read(hbuf, &data, &len); - size_t len = evbuffer_get_length(evbuf); - EXPECT_EQ(len, 5); - char outbuf[16]; - len = evbuffer_copyout(evbuf, outbuf, sizeof(outbuf)); EXPECT_EQ(len, 5); - EXPECT_EQ(0, memcmp(outbuf, "hello", 5)); + EXPECT_EQ(0, memcmp(data, "hello", 5)); - evbuffer_add(evbuf, ",", 1); - evbuffer_add(evbuf, "world", 5); + http_buffer_add(hbuf, ",", 1); + http_buffer_add(hbuf, "world", 5); - len = evbuffer_copyout(evbuf, outbuf, sizeof(outbuf)); + http_buffer_read(hbuf, &data, &len); EXPECT_EQ(len, 11); - EXPECT_EQ(0, memcmp(outbuf, "hello,world", 11)); + EXPECT_EQ(0, memcmp(data, "hello,world", 11)); - evbuffer_free(evbuf); + http_buffer_free(hbuf); +} + +TEST(http, strtoll) +{ + ASSERT_EQ(0, http_strtoll(NULL, 0)); + ASSERT_EQ(0, http_strtoll("", 1)); + ASSERT_EQ(0, http_strtoll("abcd", 4)); + ASSERT_EQ(123, http_strtoll("123", 3)); + ASSERT_EQ(123, http_strtoll(" 123", 4)); + ASSERT_EQ(123, http_strtoll(" 123\r\n", 6)); + ASSERT_EQ(123456789, http_strtoll("123456789", 9)); +} + +TEST(http, line_header_is_completed) +{ + ASSERT_EQ(0, http_line_header_completed(NULL, 0)); + ASSERT_EQ(0, http_line_header_completed("GET ", 4)); + ASSERT_EQ(0, http_line_header_completed("GET / HTTP/1.1\r\n", strlen("GET / HTTP/1.1\r\n"))); + ASSERT_EQ(strlen("GET / HTTP/1.1\r\n\r\n"), http_line_header_completed("GET / HTTP/1.1\r\n\r\n", strlen("GET / HTTP/1.1\r\n\r\n"))); +} + +TEST(http, identify) +{ + ASSERT_EQ(-1, http_protocol_identify(NULL, 0)); + ASSERT_EQ(-1, http_protocol_identify("123", 3)); + ASSERT_EQ(1, http_protocol_identify("GET / HTTP/1.1\r\n", strlen("GET / HTTP/1.1\r\n"))); + ASSERT_EQ(1, http_protocol_identify("POST / HTTP/1.1\r\n", strlen("POST / HTTP/1.1\r\n"))); + ASSERT_EQ(1, http_protocol_identify("HTTP/1.1 200 OK\r\n", strlen("HTTP/1.1 200 OK\r\n"))); } static int http_compress_use_deflate(unsigned char *indata, size_t indata_len, unsigned char *zip_data, size_t *zip_data_len) @@ -351,6 +386,226 @@ TEST(http, DISABLED_brotli_ascii) free(raw_data); } +#include "http_decoder_half.c" +struct gtest_llhttp_callback_flag +{ + uint8_t on_message_begin; + uint8_t on_message_complete; + uint8_t on_uri; + uint8_t on_uri_complete; + uint8_t on_status; + uint8_t on_status_complete; + uint8_t on_method; + uint8_t on_method_complete; + uint8_t on_version; + uint8_t on_version_complete; + uint8_t on_header_field; + uint8_t on_header_field_complete; + uint8_t on_header_value; + uint8_t on_header_value_complete; + uint8_t on_chunk_header; + uint8_t on_chunk_header_complete; + uint8_t on_headers_complete; + uint8_t on_body; +}; +static struct gtest_llhttp_callback_flag gtest_llhttp_cb_flags; +static struct http_decoder_half_data gtest_half_data; + +static int gtest_llhttp_on_message_begin(UNUSED llhttp_t *http) +{ + struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); + half->ref_data->state = HTTP_EVENT_REQ_INIT; + gtest_llhttp_cb_flags.on_message_begin++; + return 0; +} +static int gtest_llhttp_on_message_complete(llhttp_t *http) +{ + struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); + http_buffer_free(half->stage_shaper.headers_cache); + half->ref_data->state = __HTTP_EVENT_RESERVED; + half->stage_shaper.headers_cache = NULL; + gtest_llhttp_cb_flags.on_message_complete++; + return 0; +} +static int gtest_llhttp_on_headers_complete(llhttp_t *http) +{ + struct http_decoder_half *half = container_of(http, struct http_decoder_half, parser); + half->ref_data->state = HTTP_EVENT_REQ_HDR_END; + gtest_llhttp_cb_flags.on_headers_complete++; + return 0; +} +static int gtest_llhttp_on_uri(UNUSED llhttp_t *http, UNUSED const char *at, UNUSED size_t length) +{ + gtest_llhttp_cb_flags.on_uri++; + return 0; +} +static int gtest_llhttp_on_method(UNUSED llhttp_t *http, UNUSED const char *at, UNUSED size_t length) +{ + gtest_llhttp_cb_flags.on_method++; + return 0; +} +static int gtest_llhttp_on_version(UNUSED llhttp_t *http, UNUSED const char *at, UNUSED size_t length) +{ + gtest_llhttp_cb_flags.on_version++; + return 0; +} +static int gtest_llhttp_on_body(UNUSED llhttp_t *http, UNUSED const char *at, UNUSED size_t length) +{ + gtest_llhttp_cb_flags.on_body++; + return 0; +} + +static void gtest_llhttp_init(struct http_decoder_half *half) +{ + memset(>est_half_data, 0, sizeof(gtest_half_data)); + half->ref_data = >est_half_data; + llhttp_settings_init(&half->settings); + memset(>est_llhttp_cb_flags, 0, sizeof(gtest_llhttp_cb_flags)); + half->settings.on_message_begin = gtest_llhttp_on_message_begin; + half->settings.on_message_complete = gtest_llhttp_on_message_complete; + half->settings.on_url = gtest_llhttp_on_uri; + half->settings.on_method = gtest_llhttp_on_method; + half->settings.on_version = gtest_llhttp_on_version; + half->settings.on_body = gtest_llhttp_on_body; + half->settings.on_headers_complete = gtest_llhttp_on_headers_complete; + + llhttp_init(&half->parser, HTTP_BOTH, &half->settings); +} + +TEST(http, stage_request_completed) +{ + const char *newdata = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: keep-alive\r\n\r\n"; + size_t new_datalen = strlen(newdata); + struct http_decoder_half half = {}; + gtest_llhttp_init(&half); + + http_decoder_half_stage_shaping(&half, newdata, new_datalen); + + llhttp_finish(&half.parser); + http_buffer_free(half.stage_shaper.headers_cache); + + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_message_begin); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_method); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_uri); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_version); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_message_complete); +} + +TEST(http, headers_extract) +{ + const char *raw_data = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: keep-alive\r\n\r\n"; + const char *headers_start, *headers_end; + http_truncate_extract_headers(raw_data, strlen(raw_data), &headers_start, &headers_end); + ASSERT_TRUE(headers_start != NULL); + ASSERT_TRUE(headers_end != NULL); + ASSERT_EQ(0, memcmp(headers_start, "Host: www.example.com\r\nConnection: keep-alive\r\n\r\n", headers_end - headers_start)); +} + +TEST(http, stage_request_with_body) +{ + const char *newdata = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: keep-alive\r\nContent-Length: 11\r\n\r\nhello,world"; + size_t new_datalen = strlen(newdata); + struct http_decoder_half half = {}; + gtest_llhttp_init(&half); + + gtest_half_data.content_length = 11; + http_decoder_half_stage_shaping(&half, newdata, new_datalen); + + llhttp_finish(&half.parser); + http_buffer_free(half.stage_shaper.headers_cache); + + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_message_begin); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_method); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_uri); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_version); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_body); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_message_complete); +} + +TEST(http, stage_request_with_body_pipeline_many) +{ + const char *newdata = "GET / HTTP/1.1\r\nHost: www.example1.com\r\nConnection: keep-alive\r\nContent-Length: 11\r\n\r\nhello,worldGET / HTTP/1.1\r\nHost: www.example2.com\r\nConnection: keep-alive\r\nContent-Length: 11\r\n\r\nhello,secndGET / HTTP/1.1\r\nHost: www.example3.com\r\nConnection: keep-alive\r\nContent-Length: 11\r\n\r\nhello,third"; + size_t new_datalen = strlen(newdata); + struct http_decoder_half half = {}; + gtest_llhttp_init(&half); + + gtest_half_data.content_length = 11; + http_decoder_half_stage_shaping(&half, newdata, new_datalen); + + llhttp_finish(&half.parser); + http_buffer_free(half.stage_shaper.headers_cache); + + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_message_begin); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_method); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_uri); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_version); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_body); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_message_complete); +} + +TEST(http, stage_request_with_body_pipeline_many_uncompleted) +{ + const char *newdata = "GET / HTTP/1.1\r\nHost: www.example1.com\r\nConnection: keep-alive\r\nContent-Length: 11\r\n\r\nhello,worldGET / HTTP/1.1\r\nHost: www.example2.com\r\nConnection: keep-alive\r\nContent-Length: 11\r\n\r\nhello,secndGET / HTTP/1.1\r\nHost: www.example3.com\r\nConnection: keep-alive\r\nContent-Length: 11\r\n\r\nhello,third"; + size_t new_datalen = strlen(newdata); + struct http_decoder_half half = {}; + gtest_llhttp_init(&half); + + gtest_half_data.content_length = 11; + + for (size_t i = 0; i < new_datalen; i++) + { + http_decoder_half_stage_shaping(&half, newdata + i, 1); + } + + llhttp_finish(&half.parser); + http_buffer_free(half.stage_shaper.headers_cache); + + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_message_begin); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_method); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_uri); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_version); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_message_complete); +} + +TEST(http, stage_request_completed_pipeline) +{ + const char *newdata = "GET / HTTP/1.1\r\nHost: www.example1.com\r\nConnection: keep-alive\r\n\r\nGET / HTTP/1.1\r\nHost: www.example2.com\r\nConnection: keep-alive\r\n\r\nGET / HTTP/1.1\r\nHost: www.example3.com\r\nConnection: keep-alive\r\n\r\n"; + size_t new_datalen = strlen(newdata); + struct http_decoder_half half = {}; + gtest_llhttp_init(&half); + + http_decoder_half_stage_shaping(&half, newdata, new_datalen); + llhttp_finish(&half.parser); + http_buffer_free(half.stage_shaper.headers_cache); + + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_message_begin); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_method); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_uri); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_version); + ASSERT_EQ(3, gtest_llhttp_cb_flags.on_message_complete); +} + +TEST(http, stage_request_uncompleted) +{ + const char *newdata = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: keep-alive\r\n\r\n"; + size_t new_datalen = strlen(newdata); + struct http_decoder_half half = {}; + gtest_llhttp_init(&half); + + for (size_t i = 0; i < new_datalen; i++) + { + http_decoder_half_stage_shaping(&half, newdata + i, 1); + } + llhttp_finish(&half.parser); + http_buffer_free(half.stage_shaper.headers_cache); + + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_message_begin); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_method); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_uri); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_version); + ASSERT_EQ(1, gtest_llhttp_cb_flags.on_message_complete); +} + int main(int argc, char const *argv[]) { ::testing::InitGoogleTest(&argc, (char **)argv); diff --git a/test/decoders/http/http_test_plug.cpp b/test/decoders/http/http_test_plug.cpp index d91b552..1b2dedb 100644 --- a/test/decoders/http/http_test_plug.cpp +++ b/test/decoders/http/http_test_plug.cpp @@ -18,7 +18,6 @@ extern "C" int commit_test_result_json(cJSON *node, const char *name); extern void http_decoder_test_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env); extern void http_decoder_test_state_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env); - extern void http_decoder_tunnel_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env); static on_session_msg_cb_func *g_entry_fun = http_decoder_test_entry; } #endif @@ -35,7 +34,6 @@ struct plug_entry_t static struct plug_entry_t g_entry_tbl[] = { {"http_decoder_test_entry", http_decoder_test_entry}, {"http_decoder_test_state_entry", http_decoder_test_state_entry}, - {"http_decoder_tunnel_entry", http_decoder_tunnel_entry}, {NULL, NULL}}; enum http_transaction_type @@ -166,7 +164,7 @@ void transaction_index_to_json(cJSON *ctx, int transaction_index) cJSON_AddNumberToObject(ctx, GTEST_HTTP_TRANS_SEQ_NAME, transaction_index); } -void req_line_to_json(cJSON *ctx, struct http_request_line *req_line) +void req_line_to_json(cJSON *ctx, const struct http_request_line *req_line) { http_field_to_json(ctx, "method", (char *)req_line->method, req_line->method_len); http_field_to_json(ctx, "uri", (char *)req_line->uri, req_line->uri_len); @@ -176,7 +174,7 @@ void req_line_to_json(cJSON *ctx, struct http_request_line *req_line) cJSON_AddNumberToObject(ctx, "minor_version", req_line->minor_version); } -void res_line_to_json(cJSON *ctx, struct http_response_line *res_line) +void res_line_to_json(cJSON *ctx, const struct http_response_line *res_line) { http_field_to_json(ctx, "res_version", (char *)res_line->version, res_line->version_len); http_field_to_json(ctx, "res_status", (char *)res_line->status, res_line->status_len); @@ -186,7 +184,7 @@ void res_line_to_json(cJSON *ctx, struct http_response_line *res_line) cJSON_AddNumberToObject(ctx, "status_code", res_line->status_code); } -void http_header_to_json(cJSON *ctx, struct http_header_field *header) +void http_header_to_json(cJSON *ctx, const struct http_header_field *header) { char key[MAX_KEY_STR_LEN] = {0}; if ((header->name == NULL) || (header->value == NULL)) @@ -218,7 +216,7 @@ void http_url_add_to_json(cJSON *ctx, struct http_message *msg) return; } - http_message_get0_raw_url(msg, (const char **)&raw_url_result, &raw_url_result.iov_len); + http_message_get0_raw_url(msg, (const char **)&raw_url_result.iov_base, &raw_url_result.iov_len); if (raw_url_result.iov_base == NULL) { return; @@ -247,6 +245,18 @@ void http_url_add_to_json(cJSON *ctx, struct http_message *msg) } } +void headers_intergration_add_to_json(struct http_message *msg, cJSON *ctx) +{ + const char *headers = NULL; + size_t headers_len = 0; + http_message_get0_headers_intergration(msg, &headers, &headers_len); + // fprintf(stderr, "-------------------------------\n"); + // fprintf(stderr, "headers:%.*s\n", (int)headers_len, headers); + // fprintf(stderr, "-------------------------------\n"); + + http_field_to_json(ctx, "__X_HTTP_HEADERS_INTERGRATION", (char *)headers, headers_len); +} + static void commit_payload_md5sum(cJSON *last_jnode, struct gtest_plug_exdata_t *gtest_plug_exdata, enum http_transaction_type type) { // finish md5 streming hash @@ -311,6 +321,18 @@ static void commit_last_half_flow_data(struct gtest_plug_exdata_t *gtest_plug_ex static void http_decoder_test_update_session_tuple4(struct session *sess, struct gtest_plug_exdata_t *gtest_plug_exdata) { + char sess_addr_string[256] = {}; + + enum session_state state = session_get_current_state(sess); + if (state == SESSION_STATE_CLOSED) + { + return; + } + + struct httpd_session_addr sesaddr = {}; + httpd_session_get_addr(sess, &sesaddr); + http_session_addr_ntop(&sesaddr, sess_addr_string, sizeof(sess_addr_string)); + if (gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_SESSION] == NULL) { const char *human_addr_cstr = session_get0_readable_addr(sess); @@ -319,6 +341,7 @@ static void http_decoder_test_update_session_tuple4(struct session *sess, struct fprintf(stderr, "can't get readable_addr, to use session_get0_readable_addr() the sapp_log.conf level must <= INFO\n"); return; } + assert(0 == strncasecmp(human_addr_cstr, sess_addr_string, strlen(sess_addr_string))); char result_name[MAX_KEY_STR_LEN] = {0}; gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_SESSION] = cJSON_CreateObject(); cJSON_AddStringToObject(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_SESSION], GTEST_HTTP_TUPLE4_NAME, human_addr_cstr); @@ -392,9 +415,6 @@ extern "C" void http_decoder_test_entry(struct session *sess, int topic_id, cons (void)topic_id; (void)no_use_ctx; (void)plugin_env; - struct http_request_line req_line = {}; - struct http_response_line res_line = {}; - struct http_header_field header = {}; hstring body = {}; struct http_message *msg = (struct http_message *)raw_msg; enum http_message_type msg_type = http_message_get_type(msg); @@ -406,34 +426,28 @@ extern "C" void http_decoder_test_entry(struct session *sess, int topic_id, cons session_exdata_set(sess, g_exdata_idx, gtest_plug_exdata); } - // if (http_message_type_is_req(sess, msg_type)) - // { - // cJSON *json = gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ]; - // } - // else - // { - // cJSON *json = gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES]; - // } - http_decoder_test_update_session_tuple4(sess, gtest_plug_exdata); switch (msg_type) { - case HTTP_MESSAGE_REQ_LINE: + case HTTP_MESSAGE_REQ_LINE_HEADERS: + { commit_last_half_flow_data(gtest_plug_exdata, msg, HTTP_TRANSACTION_REQ, 0); - http_message_get0_request_line(msg, &req_line); - req_line_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], &req_line); - break; - case HTTP_MESSAGE_REQ_HEADER: - while (http_message_get0_next_header(msg, &header) >= 0) + const struct http_request_line *req_line = NULL; + req_line = http_message_get0_request_line(msg); + req_line_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], req_line); + + const struct http_header_field *current_header = NULL; + while ((current_header = http_message_get0_next_header(msg, current_header)) != NULL) { - http_header_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], &header); + http_header_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], current_header); } g_header_count = 1; - break; - case HTTP_MESSAGE_REQ_HEADER_END: http_url_add_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], msg); - break; + + headers_intergration_add_to_json(msg, gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ]); + } + break; case HTTP_MESSAGE_REQ_BODY_START: case HTTP_MESSAGE_REQ_BODY: memset(&body, 0, sizeof(hstring)); @@ -450,18 +464,21 @@ extern "C" void http_decoder_test_entry(struct session *sess, int topic_id, cons append_http_payload(sess, gtest_plug_exdata, PAYLOAD_DECOMPRESS, &body, HTTP_TRANSACTION_REQ); } break; - case HTTP_MESSAGE_RES_LINE: + case HTTP_MESSAGE_RES_LINE_HEADERS: + { commit_last_half_flow_data(gtest_plug_exdata, msg, HTTP_TRANSACTION_RES, 0); - http_message_get0_response_line(msg, &res_line); - res_line_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], &res_line); - break; - case HTTP_MESSAGE_RES_HEADER: - while (http_message_get0_next_header(msg, &header) >= 0) + const struct http_response_line *res_line = NULL; + res_line = http_message_get0_response_line(msg); + res_line_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], res_line); + const struct http_header_field *current_header = NULL; + while ((current_header = http_message_get0_next_header(msg, current_header)) != NULL) { - http_header_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], &header); + http_header_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], current_header); } g_header_count = 1; - break; + headers_intergration_add_to_json(msg, gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES]); + } + break; case HTTP_MESSAGE_RES_BODY_START: case HTTP_MESSAGE_RES_BODY: memset(&body, 0, sizeof(hstring)); @@ -480,7 +497,12 @@ extern "C" void http_decoder_test_entry(struct session *sess, int topic_id, cons } break; - // to do: check payload + // case HTTP_TRANSACTION_END: + + // commit_last_half_flow_data(gtest_plug_exdata, msg, HTTP_TRANSACTION_REQ, 0); + // commit_last_half_flow_data(gtest_plug_exdata, msg, HTTP_TRANSACTION_RES, 0); + // break; + default: break; } @@ -507,14 +529,6 @@ void http_decoder_test_exdata_free(int idx, void *ex_ptr, void *arg) } } -// static int update_config_file(const char *filename, const char *key, const char *value) -// { -// char cmd_buf[1024] = {}; -// snprintf(cmd_buf, 1024, "sed 's/^[ \t]*%s=.*/%s=%s/g' -i %s", key, key, value, filename); -// int ret = system(cmd_buf); -// return ret; -// } - extern "C" void http_decoder_test_state_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env) { (void)topic_id; @@ -576,68 +590,6 @@ extern "C" void http_decoder_test_state_entry(struct session *sess, int topic_id return; } -extern "C" void http_decoder_tunnel_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env) -{ - (void)topic_id; - (void)no_use_ctx; - (void)plugin_env; - struct gtest_plug_exdata_t *gtest_plug_exdata; - enum http_tunnel_message_type tmsg_type = http_tunnel_message_type_get((const struct http_tunnel_message *)raw_msg); - static size_t req_payload_block = 0, req_payload_size = 0; - static size_t res_payload_block = 0, res_payload_size = 0; - gtest_plug_exdata = (struct gtest_plug_exdata_t *)session_exdata_get(sess, g_exdata_idx); - - switch (tmsg_type) - { - case HTTP_TUNNEL_OPENING: - { - if (NULL == gtest_plug_exdata) - { - gtest_plug_exdata = (struct gtest_plug_exdata_t *)calloc(1, sizeof(struct gtest_plug_exdata_t)); - session_exdata_set(sess, g_exdata_idx, gtest_plug_exdata); - } - const char *human_addr_cstr = session_get0_readable_addr(sess); - gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ] = cJSON_CreateObject(); - gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES] = cJSON_CreateObject(); - gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_SESSION] = cJSON_CreateObject(); - cJSON_AddStringToObject(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_SESSION], GTEST_HTTP_TUPLE4_NAME, human_addr_cstr); - commit_test_result_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_SESSION], "TUNNEL_NEW"); - } - break; - - case HTTP_TUNNEL_ACTIVE: - { - enum flow_type curdir = session_get_flow_type(sess); - hstring tunnel_payload = {}; - http_tunnel_message_get_payload((const struct http_tunnel_message *)raw_msg, &tunnel_payload); - if (FLOW_TYPE_C2S == curdir) - { - req_payload_block++; - req_payload_size += tunnel_payload.iov_len; - } - else - { - res_payload_block++; - res_payload_size += tunnel_payload.iov_len; - } - } - break; - case HTTP_TUNNEL_CLOSING: - { - cJSON_AddStringToObject(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], "flow", "C2S"); - cJSON_AddStringToObject(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], "flow", "S2C"); - cJSON_AddNumberToObject(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], "payload_block", req_payload_block); - cJSON_AddNumberToObject(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], "payload_size", req_payload_size); - cJSON_AddNumberToObject(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], "payload_block", res_payload_block); - cJSON_AddNumberToObject(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], "payload_size", res_payload_size); - } - break; - default: - assert(0); - break; - } -} - extern "C" void *http_decoder_test_init(struct stellar *st) { g_http_gtest_plugin_id = stellar_session_plugin_register(st, NULL, NULL, NULL); diff --git a/test/decoders/http/test_based_on_stellar/CMakeLists.txt b/test/decoders/http/test_based_on_stellar/CMakeLists.txt index bc08289..7265d5d 100644 --- a/test/decoders/http/test_based_on_stellar/CMakeLists.txt +++ b/test/decoders/http/test_based_on_stellar/CMakeLists.txt @@ -71,6 +71,8 @@ add_test(NAME HTTP_ZLIB_DEADLOCK COMMAND sh -c "ln -sf ${TEST_PCAP_DIR}/http_zl add_test(NAME HTTP_OUT_OF_ORDER COMMAND sh -c "ln -sf ${TEST_PCAP_DIR}/http_out_of_order.pcap ${TEST_RUN_DIR}/pcap/test.pcap; ./${TEST_MAIN} ${TEST_JSON_DIR}/http_out_of_order.json" WORKING_DIRECTORY ${TEST_RUN_DIR}) add_test(NAME HTTP_GZIP_OUT_OF_ORDER COMMAND sh -c "ln -sf ${TEST_PCAP_DIR}/http_gzip_out_of_order.pcap ${TEST_RUN_DIR}/pcap/test.pcap; ./${TEST_MAIN} ${TEST_JSON_DIR}/http_gzip_out_of_order.json" WORKING_DIRECTORY ${TEST_RUN_DIR}) add_test(NAME HTTP_HEADER_SPLITTING COMMAND sh -c "ln -sf ${TEST_PCAP_DIR}/http_pipeline_header_splitting.pcap ${TEST_RUN_DIR}/pcap/test.pcap; ./${TEST_MAIN} ${TEST_JSON_DIR}/http_pipeline_header_splitting.json" WORKING_DIRECTORY ${TEST_RUN_DIR}) +add_test(NAME HTTP_INCOMPLETE_HEADER COMMAND sh -c "ln -sf ${TEST_PCAP_DIR}/http_incomplete_header.pcap ${TEST_RUN_DIR}/pcap/test.pcap; ./${TEST_MAIN} ${TEST_JSON_DIR}/non_http.json" WORKING_DIRECTORY ${TEST_RUN_DIR}) +# add_test(NAME DISABLED_HTTP_NO_CR_LINE_EOF COMMAND sh -c "ln -sf ${TEST_PCAP_DIR}/http_no_cr_line_eof.pcap ${TEST_RUN_DIR}/pcap/test.pcap; ./${TEST_MAIN} ${TEST_JSON_DIR}/http_no_cr_line_eof.json" WORKING_DIRECTORY ${TEST_RUN_DIR}) set_tests_properties(HTTP_GET_SINGLE_TRANS_TEST HTTP_GET_MULTI_TRANS_TEST @@ -100,6 +102,8 @@ set_tests_properties(HTTP_GET_SINGLE_TRANS_TEST HTTP_OUT_OF_ORDER HTTP_GZIP_OUT_OF_ORDER HTTP_HEADER_SPLITTING + HTTP_INCOMPLETE_HEADER + # DISABLED_HTTP_NO_CR_LINE_EOF PROPERTIES FIXTURES_REQUIRED HTTP_GTEST) add_test(NAME HTTP_UPDATE_STATE_PLUG_ENTRY COMMAND bash -c "sed -i 's/name=.*/name=\\x22http_decoder_test_state_entry\\x22/' ${TEST_RUN_DIR}/etc/http/gtest_entry.toml") diff --git a/test/decoders/http/test_based_on_stellar/env/http_decoder.toml b/test/decoders/http/test_based_on_stellar/env/http_decoder.toml index a2bb060..c8ba91d 100644 --- a/test/decoders/http/test_based_on_stellar/env/http_decoder.toml +++ b/test/decoders/http/test_based_on_stellar/env/http_decoder.toml @@ -13,6 +13,3 @@ stat_interval_pkts=1000 # fieldstat output interval stat_output_interval=1 - -# connect tunnel -proxy_enable=0 \ No newline at end of file -- cgit v1.2.3