diff options
| author | liuwentan <[email protected]> | 2024-02-02 10:47:22 +0800 |
|---|---|---|
| committer | liuwentan <[email protected]> | 2024-02-02 10:47:22 +0800 |
| commit | c530e0bbf18e595eb074a99b1f10f58ce993a4b9 (patch) | |
| tree | 98cbe6f2cd0b583a3dbe038ee425636048af8ff2 | |
| parent | 06af77fb35a55754768f91fbf1363e2dd7906683 (diff) | |
[HTTP_DECODER]bugfix for http header truncated
19 files changed, 1391 insertions, 83 deletions
diff --git a/src/http_decoder/http_decoder.c b/src/http_decoder/http_decoder.c index 1ce4b86..8a663ab 100644 --- a/src/http_decoder/http_decoder.c +++ b/src/http_decoder/http_decoder.c @@ -35,7 +35,8 @@ const char *fs_file_name = "http_decoder.fs"; */ struct http_message { enum http_message_type type; - struct http_decoder_half_data *data; + struct http_decoder_result_queue *ref_queue; + size_t queue_index; }; struct http_decoder { @@ -61,12 +62,15 @@ struct http_decoder_context { }; struct http_message * -http_message_new(enum http_message_type type, void *data) +http_message_new(enum http_message_type type, + struct http_decoder_result_queue *queue, + int queue_index) { struct http_message *msg = CALLOC(struct http_message, 1); msg->type = type; - msg->data = data; + msg->ref_queue = queue; + msg->queue_index = queue_index; return msg; } @@ -86,6 +90,7 @@ static void http_event_handler(enum http_event event, { assert(ev_ctx); + size_t queue_idx = 0; struct http_decoder_result_queue *queue = ev_ctx->ref_queue; struct http_message *msg = NULL; struct http_decoder_half_data *half_data = NULL; @@ -115,17 +120,25 @@ static void http_event_handler(enum http_event event, *data = half_data; break; case HTTP_EVENT_REQ_LINE: - msg = http_message_new(HTTP_MESSAGE_REQ_LINE, *data); + queue_idx = http_decoder_result_queue_req_index(queue); + msg = http_message_new(HTTP_MESSAGE_REQ_LINE, queue, queue_idx); session_mq_publish_message(ev_ctx->ref_session, ev_ctx->topic_id, msg); break; case HTTP_EVENT_REQ_HDR_END: - msg = http_message_new(HTTP_MESSAGE_REQ_HEADER, *data); + ret = http_decoder_half_data_has_parsed_header(*data); + if (0 == ret) { + break; + } + + queue_idx = http_decoder_result_queue_req_index(queue); + msg = http_message_new(HTTP_MESSAGE_REQ_HEADER, queue, queue_idx); session_mq_publish_message(ev_ctx->ref_session, ev_ctx->topic_id, msg); break; case HTTP_EVENT_REQ_BODY_BEGIN: break; case HTTP_EVENT_REQ_BODY_DATA: - msg = http_message_new(HTTP_MESSAGE_REQ_BODY, *data); + queue_idx = http_decoder_result_queue_req_index(queue); + msg = http_message_new(HTTP_MESSAGE_REQ_BODY, queue, queue_idx); session_mq_publish_message(ev_ctx->ref_session, ev_ctx->topic_id, msg); break; case HTTP_EVENT_REQ_BODY_END: @@ -161,19 +174,27 @@ static void http_event_handler(enum http_event event, *data = half_data; break; case HTTP_EVENT_RES_LINE: - msg = http_message_new(HTTP_MESSAGE_RES_LINE, *data); + queue_idx = http_decoder_result_queue_res_index(queue); + msg = http_message_new(HTTP_MESSAGE_RES_LINE, queue, queue_idx); session_mq_publish_message(ev_ctx->ref_session, ev_ctx->topic_id, msg); break; case HTTP_EVENT_RES_HDR: break; case HTTP_EVENT_RES_HDR_END: - msg = http_message_new(HTTP_MESSAGE_RES_HEADER, *data); + ret = http_decoder_half_data_has_parsed_header(*data); + if (0 == ret) { + break; + } + + queue_idx = http_decoder_result_queue_res_index(queue); + msg = http_message_new(HTTP_MESSAGE_RES_HEADER, queue, queue_idx); session_mq_publish_message(ev_ctx->ref_session, ev_ctx->topic_id, msg); break; case HTTP_EVENT_RES_BODY_BEGIN: break; case HTTP_EVENT_RES_BODY_DATA: - msg = http_message_new(HTTP_MESSAGE_RES_BODY, *data); + queue_idx = http_decoder_result_queue_res_index(queue); + msg = http_message_new(HTTP_MESSAGE_RES_BODY, queue, queue_idx); session_mq_publish_message(ev_ctx->ref_session, ev_ctx->topic_id, msg); break; case HTTP_EVENT_RES_BODY_END: @@ -338,7 +359,13 @@ int http_decoder_entry(struct session *sess, int events, cur_half = ex_data->decoder->s2c_half; } - http_decoder_half_reinit(cur_half, decoder_ctx->topic_id, ex_data->queue, sess); + // printf("<before parse> queue:%p req_index:%zu req:%p res_index:%zu, res:%p\n", + // ex_data->queue, ex_data->queue->req_index, + // ex_data->queue->array[ex_data->queue->req_index].req_data, + // ex_data->queue->res_index, + // ex_data->queue->array[ex_data->queue->res_index].res_data); + http_decoder_half_reinit(cur_half, decoder_ctx->topic_id, ex_data->queue, + sess); ret = http_decoder_half_parse(cur_half, payload, payload_len); if (ret < 0) { // fieldstat_easy_counter_incrby(decoder_ctx->fse, thread_id, @@ -359,6 +386,12 @@ int http_decoder_entry(struct session *sess, int events, // decoder_ctx->fs_incoming_trans_id, // NULL, 0, trans_cnt); + // printf("<after parse> queue:%p req_index:%zu req:%p res_index:%zu, res:%p, counter:%d\n", + // ex_data->queue, ex_data->queue->req_index, + // ex_data->queue->array[ex_data->queue->req_index].req_data, + // ex_data->queue->res_index, + // ex_data->queue->array[ex_data->queue->res_index].res_data, + // decoder_ctx->counter); return 0; } @@ -510,7 +543,13 @@ int http_message_get_request_line(struct http_message *msg, return -1; } - return http_decoder_half_data_get_request_line(msg->data, line); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + struct http_decoder_half_data *req_data = + msg->ref_queue->array[msg->queue_index].req_data; + + return http_decoder_half_data_get_request_line(req_data, line); } int http_message_get_response_line(struct http_message *msg, @@ -521,7 +560,13 @@ int http_message_get_response_line(struct http_message *msg, return -1; } - return http_decoder_half_data_get_response_line(msg->data, line); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + 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, line); } int http_message_get_request_header(struct http_message *msg, struct hstring *key, @@ -532,7 +577,13 @@ int http_message_get_request_header(struct http_message *msg, struct hstring *ke return -1; } - return http_decoder_half_data_get_header(msg->data, key, hdr_array, array_size); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + 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, key, hdr_array, array_size); } int http_message_get_response_header(struct http_message *msg, struct hstring *key, @@ -543,7 +594,13 @@ int http_message_get_response_header(struct http_message *msg, struct hstring *k return -1; } - return http_decoder_half_data_get_header(msg->data, key, hdr_array, array_size); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + 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, key, hdr_array, array_size); } int http_message_request_header_next(struct http_message *msg, @@ -554,7 +611,13 @@ int http_message_request_header_next(struct http_message *msg, return -1; } - return http_decoder_half_data_iter_header(msg->data, hdr); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + struct http_decoder_half_data *req_data = + msg->ref_queue->array[msg->queue_index].req_data; + + return http_decoder_half_data_iter_header(req_data, hdr); } int http_message_response_header_next(struct http_message *msg, @@ -565,7 +628,13 @@ int http_message_response_header_next(struct http_message *msg, return -1; } - return http_decoder_half_data_iter_header(msg->data, hdr); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + struct http_decoder_half_data *res_data = + msg->ref_queue->array[msg->queue_index].res_data; + + return http_decoder_half_data_iter_header(res_data, hdr); } int http_message_get_request_raw_body(struct http_message *msg, @@ -576,7 +645,13 @@ int http_message_get_request_raw_body(struct http_message *msg, return -1; } - return http_decoder_half_data_get_raw_body(msg->data, body); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + 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); } int http_message_get_response_raw_body(struct http_message *msg, @@ -587,7 +662,13 @@ int http_message_get_response_raw_body(struct http_message *msg, return -1; } - return http_decoder_half_data_get_raw_body(msg->data, body); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + 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); } int http_message_get_request_decompress_body(struct http_message *msg, @@ -598,7 +679,13 @@ int http_message_get_request_decompress_body(struct http_message *msg, return -1; } - return http_decoder_half_data_get_decompress_body(msg->data, body); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + 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); } int http_message_get_response_decompress_body(struct http_message *msg, @@ -609,5 +696,11 @@ int http_message_get_response_decompress_body(struct http_message *msg, return -1; } - return http_decoder_half_data_get_decompress_body(msg->data, body); + assert(msg->ref_queue); + assert(msg->queue_index < HD_RESULT_QUEUE_SIZE); + + 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); }
\ No newline at end of file diff --git a/src/http_decoder/http_decoder_half.c b/src/http_decoder/http_decoder_half.c index cc13d8e..2a8126f 100644 --- a/src/http_decoder/http_decoder_half.c +++ b/src/http_decoder/http_decoder_half.c @@ -364,6 +364,7 @@ static int on_header_value(llhttp_t *http, const char *at, size_t 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) { @@ -386,8 +387,12 @@ static int on_header_value_complete(llhttp_t *http) if (http_decoder_table_get_header(half->ref_data->table, &key, &http_hdr, 1) == 1) { - char encoding_str[16] = {0}; - memcpy(encoding_str, http_hdr.val.str, http_hdr.val.str_len); + char encoding_str[MAX_ENCODING_STR_LEN + 1] = {0}; + size_t str_len = http_hdr.val.str_len; + if (str_len > MAX_ENCODING_STR_LEN) { + str_len = MAX_ENCODING_STR_LEN; + } + memcpy(encoding_str, http_hdr.val.str, str_len); half->ref_data->content_encoding = http_content_encoding_str2int(encoding_str); } } @@ -430,6 +435,9 @@ static int on_headers_complete(llhttp_t *http) 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; @@ -595,19 +603,28 @@ void http_decoder_half_reinit(struct http_decoder_half *half, int topic_id, static void publish_message_for_parsed_header(struct http_decoder_half *half) { - if (http_decoder_table_has_parsed_header(half->ref_data->table) <= 0) { + if (0 == http_decoder_table_has_parsed_header(half->ref_data->table)) { return; } // publish complete kv-header message struct http_message *msg = NULL; + size_t queue_idx = 0; + struct http_decoder_result_queue *queue = half->http_ev_ctx->ref_queue; + if (half->parser.type == HTTP_REQUEST) { - msg = http_message_new(HTTP_MESSAGE_REQ_HEADER, half->ref_data); + queue_idx = http_decoder_result_queue_req_index(queue); + + msg = http_message_new(HTTP_MESSAGE_REQ_HEADER, queue, queue_idx); + session_mq_publish_message(half->http_ev_ctx->ref_session, half->http_ev_ctx->topic_id, msg); } else { // http response - msg = http_message_new(HTTP_MESSAGE_RES_HEADER, half->ref_data); + queue_idx = http_decoder_result_queue_res_index(queue); + + msg = http_message_new(HTTP_MESSAGE_RES_HEADER, queue, queue_idx); + session_mq_publish_message(half->http_ev_ctx->ref_session, half->http_ev_ctx->topic_id, msg); } @@ -671,16 +688,42 @@ int http_decoder_half_parse(struct http_decoder_half *half, http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_VERSION); } - if (http_decoder_table_state(half->ref_data->table, HTTP_ITEM_HDRKEY) - == STRING_STATE_REFER) { + if (http_decoder_table_header_complete(half->ref_data->table)) { + http_decoder_table_reset_header_complete(half->ref_data->table); + } else { 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)) { http_decoder_table_cache(half->ref_data->table, HTTP_ITEM_HDRKEY); } + /* 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) { - publish_message_for_parsed_header(half); - /* Header key should have been committed If it's not cached, cache it for next packet to use */ @@ -783,10 +826,12 @@ int http_decoder_half_data_get_response_line(struct http_decoder_half_data *data } int http_decoder_half_data_get_header(struct http_decoder_half_data *data, - struct hstring *key, struct http_header *hdr_array, + struct hstring *key, + struct http_header *hdr_array, size_t array_size) { - if (NULL == data) { + if (NULL == data || NULL == key || + NULL == hdr_array || 0 == array_size) { return -1; } @@ -803,6 +848,15 @@ int http_decoder_half_data_iter_header(struct http_decoder_half_data *data, return http_decoder_table_iter_header(data->table, header); } +int http_decoder_half_data_has_parsed_header(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(struct http_decoder_half_data *data, struct hstring *body) { diff --git a/src/http_decoder/http_decoder_half.h b/src/http_decoder/http_decoder_half.h index 99cc260..f77cbd1 100644 --- a/src/http_decoder/http_decoder_half.h +++ b/src/http_decoder/http_decoder_half.h @@ -89,6 +89,8 @@ int http_decoder_half_data_get_header(struct http_decoder_half_data *data, int http_decoder_half_data_iter_header(struct http_decoder_half_data *data, struct http_header *header); +int http_decoder_half_data_has_parsed_header(struct http_decoder_half_data *data); + int http_decoder_half_data_get_raw_body(struct http_decoder_half_data *data, struct hstring *body); diff --git a/src/http_decoder/http_decoder_inc.h b/src/http_decoder/http_decoder_inc.h index fd39d6e..21688da 100644 --- a/src/http_decoder/http_decoder_inc.h +++ b/src/http_decoder/http_decoder_inc.h @@ -16,8 +16,15 @@ extern "C" { #endif +#include "http_decoder.h" +#include "http_decoder_result_queue.h" + struct http_message; -struct http_message *http_message_new(enum http_message_type type, void *data); + +struct http_message * +http_message_new(enum http_message_type type, + struct http_decoder_result_queue *queue, + int queue_index); #ifdef __cplusplus } diff --git a/src/http_decoder/http_decoder_result_queue.c b/src/http_decoder/http_decoder_result_queue.c index eb7b2d1..dd2a13a 100644 --- a/src/http_decoder/http_decoder_result_queue.c +++ b/src/http_decoder/http_decoder_result_queue.c @@ -72,6 +72,20 @@ void http_decoder_result_queue_inc_res_index(struct http_decoder_result_queue *q queue->res_index = queue->res_index % queue->queue_size; } +size_t http_decoder_result_queue_req_index(struct http_decoder_result_queue *queue) +{ + assert(queue); + + return queue->req_index; +} + +size_t http_decoder_result_queue_res_index(struct http_decoder_result_queue *queue) +{ + assert(queue); + + return queue->res_index; +} + int http_decoder_result_queue_push_req(struct http_decoder_result_queue *queue, struct http_decoder_half_data *req_data) { diff --git a/src/http_decoder/http_decoder_result_queue.h b/src/http_decoder/http_decoder_result_queue.h index eef68ba..7aa4790 100644 --- a/src/http_decoder/http_decoder_result_queue.h +++ b/src/http_decoder/http_decoder_result_queue.h @@ -42,6 +42,10 @@ void http_decoder_result_queue_inc_req_index(struct http_decoder_result_queue *q void http_decoder_result_queue_inc_res_index(struct http_decoder_result_queue *queue); +size_t http_decoder_result_queue_req_index(struct http_decoder_result_queue *queue); + +size_t http_decoder_result_queue_res_index(struct http_decoder_result_queue *queue); + struct http_decoder_half_data * http_decoder_result_queue_pop_req(struct http_decoder_result_queue *queue); diff --git a/src/http_decoder/http_decoder_table.c b/src/http_decoder/http_decoder_table.c index ac12296..ca077d5 100644 --- a/src/http_decoder/http_decoder_table.c +++ b/src/http_decoder/http_decoder_table.c @@ -18,13 +18,13 @@ #include "http_decoder_string.h" #include "stellar/utils.h" -#define MAX_HEADER_SIZE 16 -#define MAX_URI_CACHE_SIZE 1024 +#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 128 -#define MAX_HEADER_VALUE_CACHE_SIZE 1024 +#define MAX_HEADER_KEY_CACHE_SIZE 4096 +#define MAX_HEADER_VALUE_CACHE_SIZE 4096 struct http_decoder_header { struct http_decoder_string key; @@ -38,7 +38,8 @@ struct http_decoder_table { struct http_decoder_string version; struct http_decoder_string body; - size_t header_size; + int header_complete; //flag for all headers parsed completely + size_t header_cnt; size_t header_index; size_t header_iter; struct http_decoder_header *headers; @@ -58,7 +59,7 @@ static void http_decoder_table_init(struct http_decoder_table *table) 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_size; i++) { + 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); @@ -72,8 +73,8 @@ struct http_decoder_table *http_decoder_table_new() struct http_decoder_table *table = CALLOC(struct http_decoder_table, 1); assert(table); - table->header_size = MAX_HEADER_SIZE; - table->headers = CALLOC(struct http_decoder_header, table->header_size); + table->header_cnt = INIT_HEADER_CNT; + table->headers = CALLOC(struct http_decoder_header, table->header_cnt); http_decoder_table_init(table); @@ -107,7 +108,7 @@ void http_decoder_table_free(struct http_decoder_table *table) } if (table->headers != NULL) { - for (size_t i = 0; i < table->header_size; i++) { + for (size_t i = 0; i < table->header_cnt; i++) { if (table->headers[i].key.cache.str != NULL) { FREE(table->headers[i].key.cache.str); } @@ -148,12 +149,12 @@ http_decoder_table_state(struct http_decoder_table *table, enum http_item type) state = http_decoder_string_state(&table->version); break; case HTTP_ITEM_HDRKEY: - assert(table->header_index < table->header_size); + 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_size); + assert(table->header_index < table->header_cnt); header = &table->headers[table->header_index]; state = http_decoder_string_state(&header->val); break; @@ -192,12 +193,12 @@ void http_decoder_table_refer(struct http_decoder_table *table, enum http_item t http_decoder_string_refer(&table->version, at, len); break; case HTTP_ITEM_HDRKEY: - assert(table->header_index < table->header_size); + 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_size); + assert(table->header_index < table->header_cnt); header = &table->headers[table->header_index]; http_decoder_string_refer(&header->val, at, len); break; @@ -233,12 +234,12 @@ void http_decoder_table_cache(struct http_decoder_table *table, enum http_item t http_decoder_string_cache(&table->version); break; case HTTP_ITEM_HDRKEY: - assert(table->header_index < table->header_size); + 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_size); + assert(table->header_index < table->header_cnt); header = &table->headers[table->header_index]; http_decoder_string_cache(&header->val); break; @@ -274,7 +275,7 @@ void http_decoder_table_commit(struct http_decoder_table *table, enum http_item http_decoder_string_commit(&table->version); break; case HTTP_ITEM_HDRKEY: - assert(table->header_index < table->header_size); + assert(table->header_index < table->header_cnt); header = &table->headers[table->header_index]; http_decoder_string_commit(&header->key); break; @@ -282,13 +283,15 @@ void http_decoder_table_commit(struct http_decoder_table *table, enum http_item header = &table->headers[table->header_index]; http_decoder_string_commit(&header->val); // inc index - if ((table->header_index + 1) >= table->header_size) { + if ((table->header_index + 1) >= table->header_cnt) { table->headers = REALLOC(struct http_decoder_header, table->headers, - table->header_size * 2); - table->header_size *= 2; - for (size_t i = table->header_index + 1; i < table->header_size; i++) { + table->header_cnt * 2); + table->header_cnt *= 2; + for (size_t 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++; @@ -375,7 +378,7 @@ void http_decoder_table_dump(struct http_decoder_table *table) http_decoder_string_dump(&table->version, "version"); http_decoder_string_dump(&table->body, "body"); - for (size_t i = 0; i < table->header_size; i++) { + for (size_t i = 0; i < table->header_cnt; i++) { struct http_decoder_header *header = &table->headers[i]; if (NULL == header) { continue; @@ -431,21 +434,6 @@ int http_decoder_table_get_body(struct http_decoder_table *table, struct hstring return http_decoder_string_get(&table->body, out); } -int http_decoder_table_has_parsed_header(struct http_decoder_table *table) -{ - if (NULL == table) { - return 0; - } - - 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_get_header(struct http_decoder_table *table, struct hstring *key, struct http_header *hdr_array, size_t array_size) { @@ -454,7 +442,7 @@ int http_decoder_table_get_header(struct http_decoder_table *table, struct hstri } int header_cnt = 0; - for (int i = 0; i < table->header_size && header_cnt < array_size; i++) { + for (size_t i = 0; i < table->header_cnt && header_cnt < array_size; i++) { struct http_decoder_header *tmp_header = &table->headers[i]; if (tmp_header->key.commit.str_len != key->str_len) { continue; @@ -465,8 +453,8 @@ int http_decoder_table_get_header(struct http_decoder_table *table, struct hstri struct hstring tmp_key; http_decoder_string_get(&tmp_header->key, &tmp_key); - if (tmp_key.str_len == key->str_len - && (0 == strncasecmp(tmp_key.str, key->str, key->str_len))) { + if (tmp_key.str_len == key->str_len && + (0 == strncasecmp(tmp_key.str, key->str, key->str_len))) { http_decoder_string_get(&tmp_header->key, &hdr_array[header_cnt].key); http_decoder_string_get(&tmp_header->val, &hdr_array[header_cnt].val); header_cnt++; @@ -484,7 +472,7 @@ int http_decoder_table_iter_header(struct http_decoder_table *table, return -1; } - if (table->header_iter >= table->header_size) { + if (table->header_iter >= table->header_cnt) { return 0; } @@ -508,4 +496,46 @@ int http_decoder_table_iter_header(struct http_decoder_table *table, hdr->val.str_len = 0; return 0; +} + +int http_decoder_table_has_parsed_header(struct http_decoder_table *table) +{ + if (NULL == table || (table->header_iter == table->header_index)) { + return 0; + } + + 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; }
\ No newline at end of file diff --git a/src/http_decoder/http_decoder_table.h b/src/http_decoder/http_decoder_table.h index a600110..f3ed2d4 100644 --- a/src/http_decoder/http_decoder_table.h +++ b/src/http_decoder/http_decoder_table.h @@ -62,8 +62,6 @@ int http_decoder_table_get_version(struct http_decoder_table *table, struct hstr int http_decoder_table_get_body(struct http_decoder_table *table, struct hstring *out); -int http_decoder_table_has_parsed_header(struct http_decoder_table *table); - int http_decoder_table_get_header(struct http_decoder_table *table, struct hstring *key, struct http_header *hdr_array, @@ -72,6 +70,27 @@ int http_decoder_table_get_header(struct http_decoder_table *table, int http_decoder_table_iter_header(struct http_decoder_table *table, struct http_header *hdr); +/** + * @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); + #ifdef __cplusplus } #endif diff --git a/test/http_decoder/CMakeLists.txt b/test/http_decoder/CMakeLists.txt index 8135961..b119876 100644 --- a/test/http_decoder/CMakeLists.txt +++ b/test/http_decoder/CMakeLists.txt @@ -79,8 +79,8 @@ add_test(NAME HTTP_NO_CONTENT_LENGTH_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_S add_test(NAME HTTP_POST_MULTIPART_FORM_DATA_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_post_multipart_form_data.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_post_multipart_form_data.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) -add_test(NAME HTTP_HEADERS_EXCEED_MAXIMUM_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_headers_exceed_maximum.json - -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_headers_exceed_maximum.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) +add_test(NAME HTTP_HEADERS_EXCEED_MAXIMUM_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_hdrs_exceed_maximum.json + -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_hdrs_exceed_maximum.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) add_test(NAME HTTP_CONNECT_FLOOD_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_connect_flood.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_connect_flood.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) @@ -88,8 +88,8 @@ add_test(NAME HTTP_CONNECT_FLOOD_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURC add_test(NAME HTTP_GET_MALFORMED_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_malformed.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_get_malformed.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) -add_test(NAME HTTP_HEADER_VALUE_EMPTY_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_header_value_empty.json - -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_header_value_empty.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) +add_test(NAME HTTP_HEADER_VALUE_EMPTY_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_hdr_value_empty.json + -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_hdr_value_empty.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) add_test(NAME HTTP_UPGRADE_WEBSOCKET_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_upgrade_websocket.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_upgrade_websocket.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) @@ -106,10 +106,12 @@ add_test(NAME HTTP_GET_REQ_PIPELINE_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SO add_test(NAME HTTP_TRANS_PIPELINE_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_trans_pipeline.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_trans_pipeline.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) -# add_test(NAME COREDUMP_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/coredump.json -# -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name coredump.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) +add_test(NAME HTTP_HEADER_TRUNCATED_IN_KV_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_hdr_truncated_in_kv.json + -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_hdr_truncated_in_kv.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) + +add_test(NAME HTTP_HEADER_TRUNCATED_AFTER_KV_TEST COMMAND ${TEST_MAIN} ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_hdr_truncated_after_kv.json + -f "find ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/ -name http_hdr_truncated_after_kv.pcap|sort -V" WORKING_DIRECTORY ${TEST_RUN_DIR}) -# set_tests_properties(COREDUMP_TEST PROPERTIES FIXTURES_REQUIRED TestFixture) set_tests_properties(HTTP_GET_SINGLE_TRANS_TEST HTTP_GET_MULTI_TRANS_TEST HTTP_GET_LONG_COOKIE_TEST @@ -134,4 +136,6 @@ set_tests_properties(HTTP_GET_SINGLE_TRANS_TEST HTTP_UPGRADE_HTTP2_TEST HTTP_GET_REQ_PIPELINE_TEST HTTP_TRANS_PIPELINE_TEST + HTTP_HEADER_TRUNCATED_IN_KV_TEST + HTTP_HEADER_TRUNCATED_AFTER_KV_TEST PROPERTIES FIXTURES_REQUIRED TestFixture)
\ No newline at end of file diff --git a/test/http_decoder/http_decoder_gtest.cpp b/test/http_decoder/http_decoder_gtest.cpp index 554f109..21446ea 100644 --- a/test/http_decoder/http_decoder_gtest.cpp +++ b/test/http_decoder/http_decoder_gtest.cpp @@ -71,6 +71,7 @@ void output_http_header(struct http_header *header) { char tmp_key[MAX_KEY_STR_LEN] = {0}; char tmp_val[MAX_KEY_STR_LEN] = {0}; + memcpy(tmp_key, header->key.str, header->key.str_len); memcpy(tmp_val, header->val.str, header->val.str_len); printf("<%s:%s>\n", tmp_key, tmp_val); diff --git a/test/http_decoder/http_pcap/http_hdr_truncated_after_kv.pcap b/test/http_decoder/http_pcap/http_hdr_truncated_after_kv.pcap Binary files differnew file mode 100644 index 0000000..de9f018 --- /dev/null +++ b/test/http_decoder/http_pcap/http_hdr_truncated_after_kv.pcap diff --git a/test/http_decoder/http_pcap/http_hdr_truncated_in_kv.pcap b/test/http_decoder/http_pcap/http_hdr_truncated_in_kv.pcap Binary files differnew file mode 100644 index 0000000..06eaae2 --- /dev/null +++ b/test/http_decoder/http_pcap/http_hdr_truncated_in_kv.pcap diff --git a/test/http_decoder/http_pcap/http_header_value_empty.pcap b/test/http_decoder/http_pcap/http_hdr_value_empty.pcap Binary files differindex 138f905..138f905 100644 --- a/test/http_decoder/http_pcap/http_header_value_empty.pcap +++ b/test/http_decoder/http_pcap/http_hdr_value_empty.pcap diff --git a/test/http_decoder/http_pcap/http_headers_exceed_maximum.pcap b/test/http_decoder/http_pcap/http_hdrs_exceed_maximum.pcap Binary files differindex 537bffa..537bffa 100644 --- a/test/http_decoder/http_pcap/http_headers_exceed_maximum.pcap +++ b/test/http_decoder/http_pcap/http_hdrs_exceed_maximum.pcap diff --git a/test/http_decoder/test_result_json/http_get_long_cookie.json b/test/http_decoder/test_result_json/http_get_long_cookie.json index 535aeef..e3daa11 100644 --- a/test/http_decoder/test_result_json/http_get_long_cookie.json +++ b/test/http_decoder/test_result_json/http_get_long_cookie.json @@ -17,7 +17,7 @@ }, { "Tuple4": "202.127.156.91.27282>14.17.32.203.80", - "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&AQEBh7uoLMUB9lnyvKSYhcJ", + "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", "name": "HTTP_DECODER_RESULT_2" } ]
\ No newline at end of file diff --git a/test/http_decoder/test_result_json/http_hdr_truncated_after_kv.json b/test/http_decoder/test_result_json/http_hdr_truncated_after_kv.json new file mode 100644 index 0000000..b09aa3b --- /dev/null +++ b/test/http_decoder/test_result_json/http_hdr_truncated_after_kv.json @@ -0,0 +1,331 @@ +[ + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "method": "GET", + "uri": "/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABQSwLpJi-yDFZ7k9eqarY3x3-b99vNxxOt5xDeIOapZB6Y5QXPSa54b7cbWYTXYdFimDKCeJ4s7ngqpqByvtt0aLh85nSucLTcR3-OKleuNwVltHUscQhSgVfHc.jpg?r=392", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Accept": "image/*", + "Accept-Encoding": "deflate, gzip", + "Connection": "Keep-Alive", + "Host": "occ-0-778-360.1.nflxso.net", + "Language": "en-ET,en", + "Referer": "https://secure.netflix.com/us/tvui/ql/patch/20211109_18752/2/release/darwinBootstrap.js?getMainUrlFromCodex=true&taskDefaultTimeoutV2=120000&bootloader_trace=apiusernotnull__false&nq=true&nq_control_tag=tvui-main&startup_key=e38d3c70814421931b0189d91d872546326f05d8f470150d07340df9e9d72275&device_type=TCL-TVS88L&e=TCL-TVS88L0000000000000000342914&env=prod&fromNM=true&nm_prefetch=true&nrdapp_version=2015.1.1&plain=true&dh=720&dw=1280&dar=16_9®=undefined&authType=login&authclid=845becf0-992c-46f7-a938-1bc22b097c58&q=source_type%3D1%26additionalDataUrl%3Dhttp%253A%252F%252Flocalhost%253A56789%252Fapps%252FNetflix%252Fdial_data%26source_type_payload%3D", + "User-Agent": "Gibbon/2015.1.1/2015.1.1: Netflix/2015.1.1 (DEVTYPE=TCL-TVS88L; CERTVER=1)", + "name": "HTTP_DECODER_RESULT_1" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "X-Gibbon-Cache-Control": "max-age=2592000, priority=4, key=/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABQSwLpJi-yDFZ7k9eqarY3x3-b99vNxxOt5xDeIOapZB6Y5QXPSa54b7cbWYTXYdFimDKCeJ4s7ngqpqByvtt0aLh85nSucLTcR3-OKleuNwVltHUscQhSgVfHc.jpg?r=392", + "name": "HTTP_DECODER_RESULT_2" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "method": "GET", + "uri": "/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABUWN8S1k3yM2coX2bwxbP699Jdr0BUqBRzIfiAJXKC5Ywt7DXqJOCjrBSYs36Tny8277IXm2BF_cgTmY18NJlocglKjhaoJhFeGoIg1cwntFduyxyRPP2EJQL5Y.jpg?r=e0e", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Accept": "image/*", + "Accept-Encoding": "deflate, gzip", + "Connection": "Keep-Alive", + "Host": "occ-0-778-360.1.nflxso.net", + "Language": "en-ET,en", + "Referer": "https://secure.netflix.com/us/tvui/ql/patch/20211109_18752/2/release/darwinBootstrap.js?getMainUrlFromCodex=true&taskDefaultTimeoutV2=120000&bootloader_trace=apiusernotnull__false&nq=true&nq_control_tag=tvui-main&startup_key=e38d3c70814421931b0189d91d872546326f05d8f470150d07340df9e9d72275&device_type=TCL-TVS88L&e=TCL-TVS88L0000000000000000342914&env=prod&fromNM=true&nm_prefetch=true&nrdapp_version=2015.1.1&plain=true&dh=720&dw=1280&dar=16_9®=undefined&authType=login&authclid=845becf0-992c-46f7-a938-1bc22b097c58&q=source_type%3D1%26additionalDataUrl%3Dhttp%253A%252F%252Flocalhost%253A56789%252Fapps%252FNetflix%252Fdial_data%26source_type_payload%3D", + "User-Agent": "Gibbon/2015.1.1/2015.1.1: Netflix/2015.1.1 (DEVTYPE=TCL-TVS88L; CERTVER=1)", + "name": "HTTP_DECODER_RESULT_3" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 14:15:58 GMT", + "Content-Type": "image/jpeg", + "Content-Length": "18377", + "Connection": "keep-alive", + "Cache-Control": "max-age=2592000", + "Last-Modified": "Wed, 10 Nov 2021 08:00:14 GMT", + "ETag": "\"c289a42885b30107ad119e2a6e405e4d\"", + "name": "HTTP_DECODER_RESULT_4" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "X-Gibbon-Cache-Control": "max-age=2592000, priority=4, key=/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABUWN8S1k3yM2coX2bwxbP699Jdr0BUqBRzIfiAJXKC5Ywt7DXqJOCjrBSYs36Tny8277IXm2BF_cgTmY18NJlocglKjhaoJhFeGoIg1cwntFduyxyRPP2EJQL5Y.jpg?r=e0e", + "name": "HTTP_DECODER_RESULT_5" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "method": "GET", + "uri": "/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABR1YQS01SaHGzoxgWBJF1Gas0Gv9_DPebb4irdCTRjcQ_FUaVbXFTTrJ68_bvJds1sb28VMq22Qn3oSSKKJ7DdLN8ybgkJooYlCD3gAntrqgIFugqv5Z3kV8rRE.jpg?r=ec7", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Accept": "image/*", + "Accept-Encoding": "deflate, gzip", + "Connection": "Keep-Alive", + "Host": "occ-0-778-360.1.nflxso.net", + "Language": "en-ET,en", + "Referer": "https://secure.netflix.com/us/tvui/ql/patch/20211109_18752/2/release/darwinBootstrap.js?getMainUrlFromCodex=true&taskDefaultTimeoutV2=120000&bootloader_trace=apiusernotnull__false&nq=true&nq_control_tag=tvui-main&startup_key=e38d3c70814421931b0189d91d872546326f05d8f470150d07340df9e9d72275&device_type=TCL-TVS88L&e=TCL-TVS88L0000000000000000342914&env=prod&fromNM=true&nm_prefetch=true&nrdapp_version=2015.1.1&plain=true&dh=720&dw=1280&dar=16_9®=undefined&authType=login&authclid=845becf0-992c-46f7-a938-1bc22b097c58&q=source_type%3D1%26additionalDataUrl%3Dhttp%253A%252F%252Flocalhost%253A56789%252Fapps%252FNetflix%252Fdial_data%26source_type_payload%3D", + "name": "HTTP_DECODER_RESULT_6" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "User-Agent": "Gibbon/2015.1.1/2015.1.1: Netflix/2015.1.1 (DEVTYPE=TCL-TVS88L; CERTVER=1)", + "X-Gibbon-Cache-Control": "max-age=2592000, priority=4, key=/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABR1YQS01SaHGzoxgWBJF1Gas0Gv9_DPebb4irdCTRjcQ_FUaVbXFTTrJ68_bvJds1sb28VMq22Qn3oSSKKJ7DdLN8ybgkJooYlCD3gAntrqgIFugqv5Z3kV8rRE.jpg?r=ec7", + "name": "HTTP_DECODER_RESULT_7" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "method": "GET", + "uri": "/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABYo5IGwDn1LaWbeaa7amS0JhH3bU5MEVlcBsC4OK0mGbea97_xoi8EbqJt8_Zp0bMuuKPE80qUUjb4wq5po_lBtulA.jpg?r=c83", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Accept": "image/*", + "Accept-Encoding": "deflate, gzip", + "Connection": "Keep-Alive", + "Host": "occ-0-778-360.1.nflxso.net", + "Language": "en-ET,en", + "name": "HTTP_DECODER_RESULT_8" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 14:15:58 GMT", + "Content-Type": "image/jpeg", + "Content-Length": "13488", + "Connection": "keep-alive", + "Cache-Control": "max-age=2592000", + "Last-Modified": "Mon, 08 Nov 2021 19:50:54 GMT", + "ETag": "\"35d56b6a0ef3b5857013f44620bd8888\"", + "name": "HTTP_DECODER_RESULT_9" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "Referer": "https://secure.netflix.com/us/tvui/ql/patch/20211109_18752/2/release/darwinBootstrap.js?getMainUrlFromCodex=true&taskDefaultTimeoutV2=120000&bootloader_trace=apiusernotnull__false&nq=true&nq_control_tag=tvui-main&startup_key=e38d3c70814421931b0189d91d872546326f05d8f470150d07340df9e9d72275&device_type=TCL-TVS88L&e=TCL-TVS88L0000000000000000342914&env=prod&fromNM=true&nm_prefetch=true&nrdapp_version=2015.1.1&plain=true&dh=720&dw=1280&dar=16_9®=undefined&authType=login&authclid=845becf0-992c-46f7-a938-1bc22b097c58&q=source_type%3D1%26additionalDataUrl%3Dhttp%253A%252F%252Flocalhost%253A56789%252Fapps%252FNetflix%252Fdial_data%26source_type_payload%3D", + "User-Agent": "Gibbon/2015.1.1/2015.1.1: Netflix/2015.1.1 (DEVTYPE=TCL-TVS88L; CERTVER=1)", + "X-Gibbon-Cache-Control": "max-age=2592000, priority=4, key=/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABYo5IGwDn1LaWbeaa7amS0JhH3bU5MEVlcBsC4OK0mGbea97_xoi8EbqJt8_Zp0bMuuKPE80qUUjb4wq5po_lBtulA.jpg?r=c83", + "name": "HTTP_DECODER_RESULT_10" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "method": "GET", + "uri": "/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABaYF3Rmi954cg6Afu9jOtirnvF3iIMHPZCCnP34eDeYQXfRGG9Vg0qgn7hHpMVV4jOr8OZmcD2Nb7MhQv6gl-fNmVQ.jpg?r=257", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Accept": "image/*", + "Accept-Encoding": "deflate, gzip", + "Connection": "Keep-Alive", + "Host": "occ-0-778-360.1.nflxso.net", + "Language": "en-ET,en", + "name": "HTTP_DECODER_RESULT_11" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "Referer": "https://secure.netflix.com/us/tvui/ql/patch/20211109_18752/2/release/darwinBootstrap.js?getMainUrlFromCodex=true&taskDefaultTimeoutV2=120000&bootloader_trace=apiusernotnull__false&nq=true&nq_control_tag=tvui-main&startup_key=e38d3c70814421931b0189d91d872546326f05d8f470150d07340df9e9d72275&device_type=TCL-TVS88L&e=TCL-TVS88L0000000000000000342914&env=prod&fromNM=true&nm_prefetch=true&nrdapp_version=2015.1.1&plain=true&dh=720&dw=1280&dar=16_9®=undefined&authType=login&authclid=845becf0-992c-46f7-a938-1bc22b097c58&q=source_type%3D1%26additionalDataUrl%3Dhttp%253A%252F%252Flocalhost%253A56789%252Fapps%252FNetflix%252Fdial_data%26source_type_payload%3D", + "User-Agent": "Gibbon/2015.1.1/2015.1.1: Netflix/2015.1.1 (DEVTYPE=TCL-TVS88L; CERTVER=1)", + "X-Gibbon-Cache-Control": "max-age=2592000, priority=4, key=/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABaYF3Rmi954cg6Afu9jOtirnvF3iIMHPZCCnP34eDeYQXfRGG9Vg0qgn7hHpMVV4jOr8OZmcD2Nb7MhQv6gl-fNmVQ.jpg?r=257", + "name": "HTTP_DECODER_RESULT_12" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "method": "GET", + "uri": "/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABfC-ByjFJSfWZf7MFtjVl3ONnaQ69824xWP1l-cpAFGgAfaNFk4XR9uoHNWwnbG8N2UVDctVKz0a4Uyv0mEnC2kI9Q.jpg?r=532", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Accept": "image/*", + "Accept-Encoding": "deflate, gzip", + "Connection": "Keep-Alive", + "Host": "occ-0-778-360.1.nflxso.net", + "Language": "en-ET,en", + "name": "HTTP_DECODER_RESULT_13" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "Referer": "https://secure.netflix.com/us/tvui/ql/patch/20211109_18752/2/release/darwinBootstrap.js?getMainUrlFromCodex=true&taskDefaultTimeoutV2=120000&bootloader_trace=apiusernotnull__false&nq=true&nq_control_tag=tvui-main&startup_key=e38d3c70814421931b0189d91d872546326f05d8f470150d07340df9e9d72275&device_type=TCL-TVS88L&e=TCL-TVS88L0000000000000000342914&env=prod&fromNM=true&nm_prefetch=true&nrdapp_version=2015.1.1&plain=true&dh=720&dw=1280&dar=16_9®=undefined&authType=login&authclid=845becf0-992c-46f7-a938-1bc22b097c58&q=source_type%3D1%26additionalDataUrl%3Dhttp%253A%252F%252Flocalhost%253A56789%252Fapps%252FNetflix%252Fdial_data%26source_type_payload%3D", + "User-Agent": "Gibbon/2015.1.1/2015.1.1: Netflix/2015.1.1 (DEVTYPE=TCL-TVS88L; CERTVER=1)", + "X-Gibbon-Cache-Control": "max-age=2592000, priority=4, key=/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABfC-ByjFJSfWZf7MFtjVl3ONnaQ69824xWP1l-cpAFGgAfaNFk4XR9uoHNWwnbG8N2UVDctVKz0a4Uyv0mEnC2kI9Q.jpg?r=532", + "name": "HTTP_DECODER_RESULT_14" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "method": "GET", + "uri": "/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABSyGFXaB0IqQ6VR92uKMi38mNtoz7eeWxDziAf9VYKfauhh5Qo7FnnCRb31ff6Ez9yTXsqRszsGuz0GA9FVDf_NLn-9F60IcUHm59J73eYX6BD0h4wLLK0Da6YM.jpg?r=aaa", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Accept": "image/*", + "Accept-Encoding": "deflate, gzip", + "Connection": "Keep-Alive", + "Host": "occ-0-778-360.1.nflxso.net", + "Language": "en-ET,en", + "name": "HTTP_DECODER_RESULT_15" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "Referer": "https://secure.netflix.com/us/tvui/ql/patch/20211109_18752/2/release/darwinBootstrap.js?getMainUrlFromCodex=true&taskDefaultTimeoutV2=120000&bootloader_trace=apiusernotnull__false&nq=true&nq_control_tag=tvui-main&startup_key=e38d3c70814421931b0189d91d872546326f05d8f470150d07340df9e9d72275&device_type=TCL-TVS88L&e=TCL-TVS88L0000000000000000342914&env=prod&fromNM=true&nm_prefetch=true&nrdapp_version=2015.1.1&plain=true&dh=720&dw=1280&dar=16_9®=undefined&authType=login&authclid=845becf0-992c-46f7-a938-1bc22b097c58&q=source_type%3D1%26additionalDataUrl%3Dhttp%253A%252F%252Flocalhost%253A56789%252Fapps%252FNetflix%252Fdial_data%26source_type_payload%3D", + "User-Agent": "Gibbon/2015.1.1/2015.1.1: Netflix/2015.1.1 (DEVTYPE=TCL-TVS88L; CERTVER=1)", + "X-Gibbon-Cache-Control": "max-age=2592000, priority=4, key=/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABSyGFXaB0IqQ6VR92uKMi38mNtoz7eeWxDziAf9VYKfauhh5Qo7FnnCRb31ff6Ez9yTXsqRszsGuz0GA9FVDf_NLn-9F60IcUHm59J73eYX6BD0h4wLLK0Da6YM.jpg?r=aaa", + "name": "HTTP_DECODER_RESULT_16" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "method": "GET", + "uri": "/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABZbHXQr7bRUpSQ2vQe8F8p3xODTJjUbSjEcLgQrFVyGsPgQT1GVhqGWFetJhebcGrVeZGOTmQ3qvHTe9eBRJdjFsVg.jpg?r=723", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Accept": "image/*", + "Accept-Encoding": "deflate, gzip", + "Connection": "Keep-Alive", + "Host": "occ-0-778-360.1.nflxso.net", + "Language": "en-ET,en", + "name": "HTTP_DECODER_RESULT_17" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "Referer": "https://secure.netflix.com/us/tvui/ql/patch/20211109_18752/2/release/darwinBootstrap.js?getMainUrlFromCodex=true&taskDefaultTimeoutV2=120000&bootloader_trace=apiusernotnull__false&nq=true&nq_control_tag=tvui-main&startup_key=e38d3c70814421931b0189d91d872546326f05d8f470150d07340df9e9d72275&device_type=TCL-TVS88L&e=TCL-TVS88L0000000000000000342914&env=prod&fromNM=true&nm_prefetch=true&nrdapp_version=2015.1.1&plain=true&dh=720&dw=1280&dar=16_9®=undefined&authType=login&authclid=845becf0-992c-46f7-a938-1bc22b097c58&q=source_type%3D1%26additionalDataUrl%3Dhttp%253A%252F%252Flocalhost%253A56789%252Fapps%252FNetflix%252Fdial_data%26source_type_payload%3D", + "User-Agent": "Gibbon/2015.1.1/2015.1.1: Netflix/2015.1.1 (DEVTYPE=TCL-TVS88L; CERTVER=1)", + "X-Gibbon-Cache-Control": "max-age=2592000, priority=4, key=/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABZbHXQr7bRUpSQ2vQe8F8p3xODTJjUbSjEcLgQrFVyGsPgQT1GVhqGWFetJhebcGrVeZGOTmQ3qvHTe9eBRJdjFsVg.jpg?r=723", + "name": "HTTP_DECODER_RESULT_18" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "method": "GET", + "uri": "/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABSFXjTUaVrddq_nehO4yuLziSjuekxJuv3oEsyUpmt3oK3InJcXjtZUHrBBuu0EP05WRC8wFVe78VtxtW_ZuZQ65MIcApb0oZF4JoFlHHnv363RbgJn898Q4tQc.jpg?r=590", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Accept": "image/*", + "Accept-Encoding": "deflate, gzip", + "Connection": "Keep-Alive", + "Host": "occ-0-778-360.1.nflxso.net", + "Language": "en-ET,en", + "Referer": "https://secure.netflix.com/us/tvui/ql/patch/20211109_18752/2/release/darwinBootstrap.js?getMainUrlFromCodex=true&taskDefaultTimeoutV2=120000&bootloader_trace=apiusernotnull__false&nq=true&nq_control_tag=tvui-main&startup_key=e38d3c70814421931b0189d91d872546326f05d8f470150d07340df9e9d72275&device_type=TCL-TVS88L&e=TCL-TVS88L0000000000000000342914&env=prod&fromNM=true&nm_prefetch=true&nrdapp_version=2015.1.1&plain=true&dh=720&dw=1280&dar=16_9®=undefined&authType=login&authclid=845becf0-992c-46f7-a938-1bc22b097c58&q=source_type%3D1%26additionalDataUrl%3Dhttp%253A%252F%252Flocalhost%253A56789%252Fapps%252FNetflix%252Fdial_data%26source_type_payload%3D", + "User-Agent": "Gibbon/2015.1.1/2015.1.1: Netflix/2015.1.1 (DEVTYPE=TCL-TVS88L; CERTVER=1)", + "name": "HTTP_DECODER_RESULT_19" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 14:15:58 GMT", + "Content-Type": "image/jpeg", + "Content-Length": "14129", + "Connection": "keep-alive", + "Cache-Control": "max-age=2592000", + "Last-Modified": "Tue, 26 Oct 2021 15:12:58 GMT", + "ETag": "\"bb83961ad5fe366dcbb5240ead69f650\"", + "name": "HTTP_DECODER_RESULT_20" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "X-Gibbon-Cache-Control": "max-age=2592000, priority=4, key=/dnm/api/v6/Da_vleYcahiCE7JMYt8LJRyoenc/AAAABSFXjTUaVrddq_nehO4yuLziSjuekxJuv3oEsyUpmt3oK3InJcXjtZUHrBBuu0EP05WRC8wFVe78VtxtW_ZuZQ65MIcApb0oZF4JoFlHHnv363RbgJn898Q4tQc.jpg?r=590", + "name": "HTTP_DECODER_RESULT_21" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 14:15:58 GMT", + "Content-Type": "image/jpeg", + "Content-Length": "11493", + "Connection": "keep-alive", + "Cache-Control": "max-age=2592000", + "Last-Modified": "Thu, 04 Nov 2021 20:44:22 GMT", + "ETag": "\"c5be6a7137482da270bb2adc8d44a28d\"", + "name": "HTTP_DECODER_RESULT_22" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 14:15:58 GMT", + "Content-Type": "image/jpeg", + "Content-Length": "14219", + "Connection": "keep-alive", + "Cache-Control": "max-age=2592000", + "Last-Modified": "Sat, 25 Sep 2021 05:02:49 GMT", + "ETag": "\"61bec96775876749bb57139f86f6b0ca\"", + "name": "HTTP_DECODER_RESULT_23" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 14:15:58 GMT", + "Content-Type": "image/jpeg", + "Content-Length": "21967", + "Connection": "keep-alive", + "Cache-Control": "max-age=2592000", + "Last-Modified": "Fri, 02 Jul 2021 10:15:04 GMT", + "ETag": "\"841065529f1e89eabd0ef235a3d3291c\"", + "name": "HTTP_DECODER_RESULT_24" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 14:15:58 GMT", + "Content-Type": "image/jpeg", + "Content-Length": "21670", + "Connection": "keep-alive", + "Cache-Control": "max-age=2592000", + "Last-Modified": "Tue, 19 Oct 2021 14:00:02 GMT", + "ETag": "\"21d4b2c21a3a2f26ba665670e8513940\"", + "name": "HTTP_DECODER_RESULT_25" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "name": "HTTP_DECODER_RESULT_26" + }, + { + "Tuple4": "196.188.112.76.51494>23.246.50.149.80", + "Date": "Sat, 13 Nov 2021 14:15:58 GMT", + "Content-Type": "image/jpeg", + "Content-Length": "14215", + "Connection": "keep-alive", + "Cache-Control": "max-age=2592000", + "Last-Modified": "Thu, 11 Nov 2021 17:32:01 GMT", + "ETag": "\"837a2051f7d0f2899baf54ff20b3d9ad\"", + "name": "HTTP_DECODER_RESULT_27" + } +]
\ No newline at end of file diff --git a/test/http_decoder/test_result_json/http_hdr_truncated_in_kv.json b/test/http_decoder/test_result_json/http_hdr_truncated_in_kv.json new file mode 100644 index 0000000..04b74df --- /dev/null +++ b/test/http_decoder/test_result_json/http_hdr_truncated_in_kv.json @@ -0,0 +1,749 @@ +[ + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/e38f4959d33f4fa390045b0d7123997d.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://the-sexy-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_1" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:01 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "2ceed9968bf8c648", + "Set-Cookie": "ts_uid=6ec96511-9fa6-4e10-86b8-31fdb4531864; expires=Fri, 13 May 2022 13:58:01 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "Set-Cookie2": "bfq=e0SIEaFjiwwZNWjkkDGjCwsRYwpuifFQRJmJMWzMsIEjBw4ZOCr2URAQ; expires=Sun, 14 Nov 2021 13:58:01 GMT; domain=.tsyndicate.com; path=/; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control3": "no-transform", + "X-Robots-Tag4": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_2" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/f6ad1cbd1c2341eb931d06c42c972899.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://the-sexy-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_3" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:02 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "fc3b57a2f128ad48", + "Set-Cookie": "ts_uid=c9a39d23-71b8-45a3-b1de-52dd45506827; expires=Fri, 13 May 2022 13:58:02 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "Set-Cookie2": "bfq=e0SIEaFjiwwZNWjkiDGjCwsRYwpuifFQRJmJMWzMsIEjBw4ZILv0URAQ; expires=Sun, 14 Nov 2021 13:58:02 GMT; domain=.tsyndicate.com; path=/; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control3": "no-transform", + "X-Robots-Tag4": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_4" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/6afeb2b2505e42a3b5e66c05a382da54.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://the-sexy-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_5" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:06 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "87999e0bbd0312bc", + "Set-Cookie": "ts_uid=cb684729-2483-4b4a-bcb1-7d1a466d6698; expires=Fri, 13 May 2022 13:58:06 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control2": "no-transform", + "X-Robots-Tag3": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_6" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/do2/RRXZ58WRY9xXgRUkUDOIU3kgV79voQ84/master?subid=65843620&w=721&h=1601.25&tz=%2D180&count=6", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "Accept": "*/*", + "Origin": "http://the-sexy-tube.com", + "Referer": "http://the-sexy-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_7" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:12 GMT", + "Content-Type": "application/json; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Access-Control-Allow-Origin": "http://the-sexy-tube.com", + "Access-Control-Allow-Methods": "POST, GET, HEAD", + "Access-Control-Allow-Headers": "Accept, X-Requested-With, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, X-Legacy", + "Access-Control-Allow-Credentials": "true", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "Link2": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "782f28a5a47ee12f", + "Set-Cookie": "ts_uid=153b0509-9f66-4cac-bc64-cc0a4b2a7065; expires=Fri, 13 May 2022 13:58:12 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "Set-Cookie3": "bfq=e0SIEaFjiwwZNWjkiHGDBUKFOWDc6MJCxJiCW2KwiFFRRJmMMWzMsIEjBw4ZOWRwHFnyZEoZXfoo; expires=Sun, 14 Nov 2021 13:58:12 GMT; domain=.tsyndicate.com; path=/; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control4": "no-transform", + "name": "HTTP_DECODER_RESULT_8" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "X-Robots-Tag": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_9" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/58e492e46f014965bd65ee7e8b852408.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://the-sexy-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_10" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:17 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script, <https://lcdn.tsyndicate.com/images/1/6/d7099a7a986d9671209e4a122a2972130515d7/main.jpg>; rel=preload; as=image", + "X-Request-Id": "44ca59401e0c6ed9", + "Set-Cookie": "ts_uid=27598b13-f24e-4a7a-a97c-ee81862070bf; expires=Fri, 13 May 2022 13:58:17 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "Set-Cookie2": "bfq=e0SIEaFjiwwZNWjgyGGjCwsRYwpuifFQRJmJMWzMsMEQh4wcN7r0URAQ; expires=Sun, 14 Nov 2021 13:58:17 GMT; domain=.tsyndicate.com; path=/; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control3": "no-transform", + "X-Robots-Tag4": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_11" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/9f09aa35d48c490199e8ff77886ca1c4.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://the-sexy-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_12" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:18 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "22809add4cffac3f", + "Set-Cookie": "ts_uid=6fb2cc93-31ea-48b4-9f1a-126c9c8c4021; expires=Fri, 13 May 2022 13:58:18 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "Set-Cookie2": "bfq=e0SIEaFjyw0aM2TciNGFhYgxBbc0fFhGYgwbM2zgyIFDRscufRQE; expires=Sun, 14 Nov 2021 13:58:18 GMT; domain=.tsyndicate.com; path=/; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control3": "no-transform", + "X-Robots-Tag4": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_13" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/4cf0aa00ed93437599c80aec9385f65f.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://the-sexy-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_14" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:19 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "52699954429e2642", + "Set-Cookie": "ts_uid=828cc65c-5706-46bf-a956-da4f1ed5c92b; expires=Fri, 13 May 2022 13:58:19 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control2": "no-transform", + "X-Robots-Tag3": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_15" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/6afeb2b2505e42a3b5e66c05a382da54.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://xxx-4k-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_16" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:21 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "6259beec775192ea", + "Set-Cookie": "ts_uid=be1c34e7-0a85-4cb1-88f4-cae061674252; expires=Fri, 13 May 2022 13:58:21 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control2": "no-transform", + "X-Robots-Tag3": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_17" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/9f09aa35d48c490199e8ff77886ca1c4.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://xxx-4k-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_18" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:22 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "520c40e75fb6a743", + "Set-Cookie": "ts_uid=98a3c69f-e78a-4d57-af3d-b8b3599a63e6; expires=Fri, 13 May 2022 13:58:22 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control2": "no-transform", + "X-Robots-Tag3": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_19" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/64437d4cd77a4ff9a6de4560177e5ccf.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://xxx-4k-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_20" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:31 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "e6587788a91c2425", + "Set-Cookie": "ts_uid=61e483d0-a205-4bd1-9bad-d2ef30f7d4fc; expires=Fri, 13 May 2022 13:58:31 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "Set-Cookie2": "bfq=e0SIEaFjyw0aM2TciNGFhYgxBbc0fFhGYgwbM2zgyIFjRoyGfRQE; expires=Sun, 14 Nov 2021 13:58:31 GMT; domain=.tsyndicate.com; path=/; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control3": "no-transform", + "X-Robots-Tag4": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_21" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/58e492e46f014965bd65ee7e8b852408.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://xxx-4k-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_22" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:35 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "07272bb1e710b74f", + "Set-Cookie": "ts_uid=179b6f1c-9bdc-49a2-bc57-f9a7aa1e10d8; expires=Fri, 13 May 2022 13:58:35 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control2": "no-transform", + "X-Robots-Tag3": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_23" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/6afeb2b2505e42a3b5e66c05a382da54.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://xxx-4k-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_24" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:36 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "3cd5c0292393d315", + "Set-Cookie": "ts_uid=34c9ab96-4e23-41bd-86e8-570d81275bd6; expires=Fri, 13 May 2022 13:58:36 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control2": "no-transform", + "X-Robots-Tag3": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_25" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/5b465d4461184330bd41f40a2912b874.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://xxx-4k-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_26" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:37 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "783077b4d84f0f99", + "Set-Cookie": "ts_uid=536a2733-c8d4-4afb-a150-10e872be27d1; expires=Fri, 13 May 2022 13:58:37 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control2": "no-transform", + "X-Robots-Tag3": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_27" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/do2/RRXZ58WRY9xXgRUkUDOIU3kgV79voQ84/master?subid=65843620&w=721&h=1601.25&tz=%2D180&count=6", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "Accept": "*/*", + "Origin": "http://xxx-4k-tube.com", + "Referer": "http://xxx-4k-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_28" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:39 GMT", + "Content-Type": "application/json; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Access-Control-Allow-Origin": "http://xxx-4k-tube.com", + "Access-Control-Allow-Methods": "POST, GET, HEAD", + "Access-Control-Allow-Headers": "Accept, X-Requested-With, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, X-Legacy", + "Access-Control-Allow-Credentials": "true", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "Link2": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "5a8c66dbb6f97d43", + "Set-Cookie": "ts_uid=07f6ccce-c08c-490f-ab47-04513111771b; expires=Fri, 13 May 2022 13:58:39 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "Set-Cookie3": "bfq=e0SIEaFjiwwZNWjkkIGDBUKFOWLA6MJCxJiCW2KwiFFRRJmMMWzMsIEjB44ZMXJwHFnyZMocXfoo; expires=Sun, 14 Nov 2021 13:58:39 GMT; domain=.tsyndicate.com; path=/; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control4": "no-transform", + "name": "HTTP_DECODER_RESULT_29" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "X-Robots-Tag": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_30" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/e38f4959d33f4fa390045b0d7123997d.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://the-sexy-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_31" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:41 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "0c9df5d12f4a51bb", + "Set-Cookie": "ts_uid=6c0facf3-ce38-4068-ae55-0d7a3ad13cfd; expires=Fri, 13 May 2022 13:58:41 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "Set-Cookie2": "bfq=e0SIEaFjiwwZNWjkiFGjCwsRYwpuifFQRJmJMWzMsIEjB44ZMir2URAQ; expires=Sun, 14 Nov 2021 13:58:41 GMT; domain=.tsyndicate.com; path=/; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control3": "no-transform", + "X-Robots-Tag4": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_32" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "method": "GET", + "uri": "/iframes2/7ea1bb66b4814265996d3c59697a3024.html?subid=65843620", + "req_version": "1.1", + "major_version": 1, + "minor_version": 1, + "Host": "tsyndicate.com", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Linux; Android 11; SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36", + "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.9", + "Referer": "http://the-sexy-tube.com/", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", + "name": "HTTP_DECODER_RESULT_33" + }, + { + "Tuple4": "196.190.248.93.32727>94.130.141.49.80", + "res_version": "1.1", + "res_status": "OK", + "major_version": 1, + "minor_version": 1, + "status_code": 200, + "Server": "nginx", + "Date": "Sat, 13 Nov 2021 13:58:44 GMT", + "Content-Type": "text/html; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Vary": "Accept-Encoding", + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + "Vary1": "*", + "X-Api-Version": "2", + "Link": "<http://lcdn.tsyndicate.com/sdk/v1/b.b.js>; rel=preload; as=script", + "X-Request-Id": "081d97bd15f93c38", + "Set-Cookie": "ts_uid=9dda90ea-d6da-45dd-87ad-15d9819f945b; expires=Fri, 13 May 2022 13:58:44 GMT; domain=.tsyndicate.com; path=/; HttpOnly; secure; SameSite=None", + "Set-Cookie2": "bfq=e0SIEaFjiwwZNWjkkBGjCwsRYwpucQixzMQYNmbYwJEDxwwZNLr0URAQ; expires=Sun, 14 Nov 2021 13:58:44 GMT; domain=.tsyndicate.com; path=/; secure; SameSite=None", + "X-Robots-Tag": "none", + "Cache-Control3": "no-transform", + "X-Robots-Tag4": "noindex, nofollow", + "Report-To": "{ \"url\": \"https://pxl.tsyndicate.com/api/v1/heavy-ad/report\", \"max_age\": 86401 }", + "Content-Encoding": "gzip", + "name": "HTTP_DECODER_RESULT_34" + } +]
\ No newline at end of file diff --git a/test/http_decoder/test_result_json/http_header_value_empty.json b/test/http_decoder/test_result_json/http_hdr_value_empty.json index 3310002..3310002 100644 --- a/test/http_decoder/test_result_json/http_header_value_empty.json +++ b/test/http_decoder/test_result_json/http_hdr_value_empty.json diff --git a/test/http_decoder/test_result_json/http_headers_exceed_maximum.json b/test/http_decoder/test_result_json/http_hdrs_exceed_maximum.json index 70f1b8a..9ad03b7 100644 --- a/test/http_decoder/test_result_json/http_headers_exceed_maximum.json +++ b/test/http_decoder/test_result_json/http_hdrs_exceed_maximum.json @@ -2,7 +2,7 @@ { "Tuple4": "10.0.0.1.61462>10.0.0.2.80", "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=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "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, |
