summaryrefslogtreecommitdiff
path: root/test/http_decoder_driver.cpp
diff options
context:
space:
mode:
authorlijia <[email protected]>2024-05-24 22:47:32 +0800
committerlijia <[email protected]>2024-06-03 11:08:06 +0800
commit1c232f0176c43c93c3e787ac83f3573bf42c58f1 (patch)
tree734c31a97ec38847972b70a18ec075fd415bb5f6 /test/http_decoder_driver.cpp
parent22d071e23ff423242f51dce2eab1477b5fb9d106 (diff)
Adapt to stellar2.0;update API,add HDR_END,BODY_END,TRANSACTION_NEW,FREE msg.v2.0.2
Diffstat (limited to 'test/http_decoder_driver.cpp')
-rw-r--r--test/http_decoder_driver.cpp981
1 files changed, 0 insertions, 981 deletions
diff --git a/test/http_decoder_driver.cpp b/test/http_decoder_driver.cpp
deleted file mode 100644
index be10f97..0000000
--- a/test/http_decoder_driver.cpp
+++ /dev/null
@@ -1,981 +0,0 @@
-/*
- Http Decoder Google Test driver module
-*/
-#include <stdio.h>
-#include <string.h>
-#ifndef __USE_MISC
-#define __USE_MISC 1
-#endif
-#ifndef __FAVOR_BSD
-#define __FAVOR_BSD 1
-#endif
-#ifndef __USE_BSD
-#define __USE_BSD 1
-#endif
-#include <netinet/tcp.h>
-#include <netinet/ip.h>
-#include <arpa/inet.h>
-#include <time.h>
-#include <unistd.h>
-#include <assert.h>
-#include <getopt.h>
-#include <gtest/gtest.h>
-#include <pcap/pcap.h>
-#include "http_decoder_gtest.h"
-#include "MESA_jump_layer.h"
-#include "base64.h"
-
-extern "C" int http_decoder_entry(struct session *sess, int events,
- const struct packet *pkt, void *cb_arg);
-extern "C" void http_decoder_test_exit(void *test_ctx);
-extern "C" void *http_decoder_test_init(struct stellar *st);
-extern "C" void *http_decoder_init(struct stellar *st);
-
-static const char *hdgt_cla_short_options = "hb:p:s:m:";
-static const struct option hdgt_cla_long_options[] =
- {
- {"help", no_argument, NULL, 'h'},
- {"benchmark-file", required_argument, NULL, 'b'},
- {"data-pcap-file", required_argument, NULL, 'p'},
- {"data-json-file", required_argument, NULL, 's'},
- {"mss", required_argument, NULL, 'm'},
- {NULL, 0, NULL, 0}};
-
-static const char *g_data_src_json_non_headers[] = {
- GTEST_HTTP_URL_NAME,
- GTEST_HTTP_TRANS_NAME,
- GTEST_HTTP_TRANS_SEQ_NAME,
- GTEST_HTTP_TUPLE4_NAME,
- GTEST_HTTP_PAYLOAD_NAME,
- GTEST_HTTP_PAYLOAD_MD5_NAME,
- "method",
- "uri",
- "req_version",
- "major_version",
- "minor_version",
- "res_version",
- "res_status",
- "status_code",
- NULL};
-
-static void hdgt_cmd_usage(int argc, char **argv)
-{
- fprintf(stderr, "Usage:\n");
- fprintf(stderr, "\t -b set benchmark json file\n");
- fprintf(stderr, "\t -p set data source as pcap file\n");
- fprintf(stderr, "\t -s set data source as json file\n");
- fprintf(stderr, "\t -m set tcp Max Segment Size\n");
- exit(1);
-}
-
-void hdgt_set_data_source_type(fake_stellar *fst, enum data_source_type_t type)
-{
- fst->data_source_type = type;
-}
-
-static int hdgt_parse_cmd_args(fake_stellar *fst, int argc, char **argv)
-{
- int c, ret;
-
- while (1)
- {
- c = getopt_long(argc, argv, hdgt_cla_short_options, hdgt_cla_long_options, NULL);
- if (c == -1)
- {
- ret = 0;
- break;
- }
-
- switch (c)
- {
- case 'h':
- hdgt_cmd_usage(argc, argv);
- break;
- case 'b':
- fst->benchmark_json_file_name = optarg;
- break;
- case 'p':
- hdgt_set_data_source_type(fst, DATA_SOURCE_PCAP);
- fst->data_source_file_name = optarg;
- break;
- case 's':
- hdgt_set_data_source_type(fst, DATA_SOURCE_JSON);
- fst->data_source_file_name = optarg;
- break;
- case 'm':
- fst->tcp_mss = atoi(optarg);
- if (fst->tcp_mss <= 0 || fst->tcp_mss > 65535)
- {
- DEBUG_PRINT("Invalid tcp mss value! must be [1, 65535]\n");
- hdgt_cmd_usage(argc, argv);
- }
- break;
- default:
- return -1;
- break;
- }
- }
-
- // check args
- // if (!fst->benchmark_json_file_name)
- // {
- // DEBUG_PRINT("benchmark json file is not set!\n");
- // hdgt_cmd_usage(argc, argv);
- // return -1;
- // }
-
- if (__DATA_SOURCE_NULL == fst->data_source_type)
- {
- DEBUG_PRINT("data source is not set!\n");
- hdgt_cmd_usage(argc, argv);
- return -1;
- }
-
- return ret;
-}
-
-int hdgt_compare_result(struct fake_stellar *fst)
-{
- int final_result = 0;
- cJSON_bool case_sensitive = FLASE;
-
- if (!fst->http_plug_test_result_root)
- {
- DEBUG_PRINT("Not found test json result!\n");
- return -1;
- }
-
- if (!fst->load_benchmark_json_root)
- {
- DEBUG_PRINT("Not found benchmark json instance!\n");
- return -1;
- }
-
- if (cJSON_GetArraySize(fst->load_benchmark_json_root) != cJSON_GetArraySize(fst->http_plug_test_result_root))
- {
- DEBUG_PRINT("Compare json result: array size is diff!\n");
- final_result++;
- }
-
- int ret = cJSON_Compare(fst->load_benchmark_json_root, fst->http_plug_test_result_root, case_sensitive);
- if (ret != TRUE)
- {
- char *load_json_str = cJSON_Print(fst->load_benchmark_json_root);
- printf("LOAD Raw:\n%s\n", load_json_str);
-
- char *result_json_str = cJSON_Print(fst->http_plug_test_result_root);
- printf("TEST Raw:\n%s\n", result_json_str);
-
- int min_len = MIN(strlen(load_json_str), strlen(result_json_str));
- for (size_t i = 0; i < min_len; i++)
- {
- if (load_json_str[i] != result_json_str[i])
- {
- printf("######### JSON Diff at len:%d: \n\tLOAD: %.*s\n\tTEST: %.*s\n", (int)i, 16, load_json_str + i, 16, result_json_str + i);
- break;
- }
- }
-
- free(load_json_str);
- free(result_json_str);
-
- cJSON *t_load = fst->load_benchmark_json_root->child;
- cJSON *t_test = fst->http_plug_test_result_root->child;
- while (t_load != NULL && t_test != NULL)
- {
- ret = cJSON_Compare(t_load, t_test, case_sensitive);
- if (ret != TRUE)
- {
- load_json_str = cJSON_Print(t_load);
- printf("LOAD Diff:\n%s\n", load_json_str);
- free(load_json_str);
- result_json_str = cJSON_Print(t_test);
- printf("TEST Diff:\n%s\n", result_json_str);
- free(result_json_str);
- final_result++;
- }
- t_load = t_load->next;
- t_test = t_test->next;
- }
- }
- else
- {
- DEBUG_PRINT("Compare json result success!\n");
- }
-
- return final_result;
-}
-
-static char *hdgt_get_file_content(const char *filename)
-{
- FILE *fp = fopen(filename, "r");
- if (NULL == fp)
- {
- DEBUG_PRINT("fopen() fail!\n");
- return NULL;
- }
- fseek(fp, 0, SEEK_END);
- long file_size = ftell(fp);
- fseek(fp, 0, SEEK_SET);
- char *file_content = MMALLOC(char, file_size + 1);
- if (fread(file_content, 1, file_size, fp) != file_size)
- {
- DEBUG_PRINT("fread() %s fail!\n", filename);
- fclose(fp);
- MFREE(file_content);
- return NULL;
- }
- fclose(fp);
- return file_content;
-}
-
-static struct fake_session *hdgt_session_new(struct fake_stellar *fst)
-{
- struct fake_session *fses = MMALLOC(struct fake_session, sizeof(struct fake_session));
-
- fses->fst = fst;
- fses->tcp_mss = fst->tcp_mss;
- // todo : get protocol type from packet, not fixed
- fses->type = SESSION_TYPE_TCP;
- return fses;
-}
-
-static int hdgt_get_packet_from_pcap(struct fake_stellar *fst, struct fake_packet *fpkt)
-{
- struct pcap_pkthdr *pkt_hdr;
- const u_char *pkt_data;
- int ret = pcap_next_ex(fst->pcap_ins, &pkt_hdr, &pkt_data);
- if (1 == ret)
- {
- fpkt->raw_pkt_data = (char *)pkt_data;
- fpkt->raw_pkt_data_len = pkt_hdr->caplen;
- DEBUG_PRINT("Warning! this is a rough packet decoder, not support tcp out of order, seq overlap...\n");
- return 1;
- }
- else if (-2 == ret)
- {
- DEBUG_PRINT("pcap file over!\n");
- return 0;
- }
- DEBUG_PRINT("pcap_next_ex() fail: %s!\n", pcap_geterr(fst->pcap_ins));
- return -1;
-}
-
-static int hdgt_get_packet_from_json(struct fake_stellar *fst, struct fake_packet *fpkt)
-{
- cJSON *json_root = fst->data_src_json_para.json_root;
- cJSON *json_item = cJSON_GetArrayItem(json_root, fst->data_src_json_para.current_json_array_idx);
- if (NULL == json_item)
- {
- DEBUG_PRINT("Not found json object at index %d!\n", fst->data_src_json_para.current_json_array_idx);
- return -1;
- }
- fst->data_src_json_para.current_object = json_item;
- fst->data_src_json_para.current_json_array_idx++;
- return 1;
-}
-
-static int hdgt_is_reserverd_json_header(const cJSON *json_object)
-{
- for (size_t i = 0; g_data_src_json_non_headers[i] != NULL; i++)
- {
- if (strlen(json_object->string) == strlen(g_data_src_json_non_headers[i]) && (0 == strncmp(json_object->string, g_data_src_json_non_headers[i], strlen(g_data_src_json_non_headers[i]))))
- {
- return 1;
- }
- }
-
- return 0;
-}
-
-static int hdgt_get_packet_dir_from_json(cJSON *json)
-{
- cJSON *json_dir = cJSON_GetObjectItem(json, GTEST_HTTP_TRANS_NAME);
- if (NULL == json_dir)
- {
- return -1;
- }
- if (strncasecmp("request", json_dir->valuestring, strlen("request")) == 0)
- {
- return PACKET_DIRECTION_C2S;
- }
- else if (strncasecmp("response", json_dir->valuestring, strlen("response")) == 0)
- {
- return PACKET_DIRECTION_S2C;
- }
- else
- {
- return -1;
- }
-}
-
-static void hdgt_get_req_line_from_json(struct data_src_json_para_t *data_src_json_para)
-{
- cJSON *json_item = data_src_json_para->current_object;
- cJSON *method, *uri, *major_version, *minor_version;
-
- method = cJSON_GetObjectItem(json_item, "method");
- uri = cJSON_GetObjectItem(json_item, "uri");
- major_version = cJSON_GetObjectItem(json_item, "major_version");
- minor_version = cJSON_GetObjectItem(json_item, "minor_version");
-
- if (method && uri && major_version && minor_version)
- {
- sprintf(data_src_json_para->key_value_buf, "%s %s HTTP/%d.%d\r\n",
- method->valuestring, uri->valuestring, major_version->valueint, minor_version->valueint);
- }
- else
- {
- DEBUG_PRINT("get request line from json fail!\n");
- }
-}
-
-static void hdgt_get_res_line_from_json(struct data_src_json_para_t *data_src_json_para)
-{
- cJSON *json_item = data_src_json_para->current_object;
- cJSON *res_status, *status_code, *major_version, *minor_version;
-
- res_status = cJSON_GetObjectItem(json_item, "res_status");
- status_code = cJSON_GetObjectItem(json_item, "status_code");
- major_version = cJSON_GetObjectItem(json_item, "major_version");
- minor_version = cJSON_GetObjectItem(json_item, "minor_version");
-
- if (res_status && status_code && major_version && minor_version)
- {
- sprintf(data_src_json_para->key_value_buf, "HTTP/%d.%d %d %s\r\n",
- major_version->valueint, minor_version->valueint, status_code->valueint, res_status->valuestring);
- }
- else
- {
- DEBUG_PRINT("get response line from json fail!\n");
- }
-}
-
-static void hdgt_get_headers_from_json(struct data_src_json_para_t *data_src_json_para)
-{
- cJSON *json_item = data_src_json_para->current_object->child;
- char *data_ptr = data_src_json_para->key_value_buf + strlen(data_src_json_para->key_value_buf);
- int len;
-
- while (json_item)
- {
- if (0 == hdgt_is_reserverd_json_header(json_item))
- {
- if (cJSON_IsString(json_item))
- {
- len = sprintf(data_ptr, "%s: %s\r\n", json_item->string, json_item->valuestring);
- }
- else if (cJSON_IsNumber(json_item))
- {
- len = sprintf(data_ptr, "%s: %d\r\n", json_item->string, json_item->valueint);
- }
- else if (cJSON_IsBool(json_item))
- {
- len = sprintf(data_ptr, "%s: %s\r\n", json_item->string, json_item->valueint ? "true" : "false");
- }
- else
- {
- len = sprintf(data_ptr, "%s: %s\r\n", json_item->string, cJSON_Print(json_item));
- }
- data_ptr += len;
- }
- json_item = json_item->next;
- }
- sprintf(data_ptr, "\r\n"); // headers EOF
-}
-
-static void hdgt_get_body_from_json(struct data_src_json_para_t *data_src_json_para)
-{
- cJSON *json_root = data_src_json_para->current_object;
- char *data_ptr = data_src_json_para->key_value_buf + strlen(data_src_json_para->key_value_buf);
-
- // todo, support gzip, deflate, etc.
- // todo, cjson not support binary data, need base64 encode/decode
- cJSON *json_body = cJSON_GetObjectItem(json_root, GTEST_HTTP_PAYLOAD_NAME);
- if (json_body)
- {
- int base64_cont_len = strlen(json_body->valuestring);
- char *raw_cont_buf = (char *)calloc(1, base64_cont_len + 1);
- int raw_cont_len = base64_decode(json_body->valuestring, base64_cont_len, (unsigned char *)raw_cont_buf);
- sprintf(data_ptr, "%s", raw_cont_buf);
- }
-}
-
-static int hdgt_update_packet_detail_by_json(struct fake_stellar *fst, struct fake_packet *fpkt)
-{
- fpkt->dir = hdgt_get_packet_dir_from_json(fst->data_src_json_para.current_object);
- if (PACKET_DIRECTION_C2S != fpkt->dir && PACKET_DIRECTION_S2C != fpkt->dir)
- {
- DEBUG_PRINT("get packet direction from json fail!\n");
- return -1;
- }
-
- if (PACKET_DIRECTION_C2S == fpkt->dir)
- {
- hdgt_get_req_line_from_json(&fst->data_src_json_para);
- }
- else
- {
- hdgt_get_res_line_from_json(&fst->data_src_json_para);
- }
- hdgt_get_headers_from_json(&fst->data_src_json_para);
-
- hdgt_get_body_from_json(&fst->data_src_json_para);
-
- fpkt->payload_data = fst->data_src_json_para.key_value_buf;
- fpkt->payload_data_len = strlen(fst->data_src_json_para.key_value_buf);
- fpkt->payload_submit_offset = 0;
-
- return 0;
-}
-
-static int hdgt_get_packet(struct fake_stellar *fst, struct fake_packet *fpkt)
-{
- int ret = -1;
- memset(fpkt, 0, sizeof(struct fake_packet));
- if (DATA_SOURCE_PCAP == fst->data_source_type)
- {
- ret = hdgt_get_packet_from_pcap(fst, fpkt);
- }
- else if (DATA_SOURCE_JSON == fst->data_source_type)
- {
- ret = hdgt_get_packet_from_json(fst, fpkt);
- }
- else
- {
- fprintf(stderr, "hdgt_get_packet(): invalid data source type!\n");
- ret = -1;
- }
-
- return ret;
-}
-
-static int hdgt_has_data_left(struct fake_packet *fpkt)
-{
- return fpkt->payload_submit_offset < fpkt->payload_data_len;
-}
-
-static int hdgt_get_packet_dir_of_tcp(const struct tcphdr *th)
-{
- int dir;
-
- if (TH_SYN == th->th_flags)
- {
- dir = PACKET_DIRECTION_C2S;
- }
- else if ((TH_SYN | TH_ACK) == th->th_flags)
- {
- dir = PACKET_DIRECTION_S2C;
- }
- else
- {
- if (ntohs(th->th_sport) > ntohs(th->th_dport)) // Unwritten rule, not sure
- {
- dir = PACKET_DIRECTION_C2S;
- }
- else
- {
- dir = PACKET_DIRECTION_S2C;
- }
- }
-
- return dir;
-}
-
-static void hdgt_determine_packet_dir(struct fake_session *fses, struct fake_packet *fpkt, const struct tcphdr *th)
-{
- if (SESSION_ADDR_TYPE_IPV4_TCP == fses->addr_type)
- {
- if (th->th_sport == fses->addr->ipv4.sport)
- {
- fpkt->dir = PACKET_DIRECTION_C2S;
- }
- else
- {
- fpkt->dir = PACKET_DIRECTION_S2C;
- }
- }
- else
- {
- if (th->th_sport == fses->addr->ipv6.sport)
- {
- fpkt->dir = PACKET_DIRECTION_C2S;
- }
- else
- {
- fpkt->dir = PACKET_DIRECTION_S2C;
- }
- }
-}
-
-static void hdgt_update_packet_payload(struct fake_packet *fpkt, const struct tcphdr *th, int from_tcp_len)
-{
- // todo, support UDP?
- fpkt->payload_data = (char *)th + th->th_off * 4;
-#if 0
- /* for ethernet, maybe end with padding bytes, must not use packet length, use ip header len */
- fpkt->payload_data_len = fpkt->raw_pkt_data_len - ((char *)th - fpkt->raw_pkt_data) - (th->th_off * 4);
-#else
- fpkt->payload_data_len = from_tcp_len - (th->th_off * 4);
-#endif
- fpkt->payload_submit_offset = 0;
-}
-
-static int hdgt_update_packet_detail_by_pcap(struct fake_session *fses, struct fake_packet *fpkt)
-{
- size_t from_tcp_len = 0;
- if (SESSION_ADDR_TYPE_IPV4_TCP == fses->addr_type)
- {
- struct ip *i4h = (struct ip *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV4);
- if (NULL == i4h)
- {
- DEBUG_PRINT("Not found ipv4 header!\n");
- return -1;
- }
- from_tcp_len = ntohs(i4h->ip_len) - i4h->ip_hl * 4;
- }
- else
- {
- struct ip6_hdr *i6h = (struct ip6_hdr *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV6);
- if (NULL == i6h)
- {
- DEBUG_PRINT("Not found ipv6 header!\n");
- return -1;
- }
- from_tcp_len = ntohs(i6h->ip6_plen);
- }
-
- struct tcphdr *th = (struct tcphdr *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_TCP);
- if (NULL == th)
- {
- DEBUG_PRINT("Not found tcp header!\n");
- return -1;
- }
-
- hdgt_determine_packet_dir(fses, fpkt, th);
- hdgt_update_packet_payload(fpkt, th, from_tcp_len);
- return 0;
-}
-
-static int hdgt_update_packet_detail(struct fake_session *fses, struct fake_packet *fpkt)
-{
- int ret;
- if (DATA_SOURCE_PCAP == fses->fst->data_source_type)
- {
- ret = hdgt_update_packet_detail_by_pcap(fses, fpkt);
- }
- else
- {
- ret = hdgt_update_packet_detail_by_json(fses->fst, fpkt);
- }
- return ret;
-}
-
-static struct session_addr *hgdt_get_session_addr_by_pcap(struct fake_session *fses, struct fake_packet *fpkt)
-{
- if (fses->addr != NULL)
- {
- return fses->addr;
- }
-
- struct session_addr tmp_addr = {};
- int innermost_l3_layer_type;
-
- struct tcphdr *th = (struct tcphdr *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_TCP);
- if (NULL == th)
- {
- DEBUG_PRINT("Not found tcp header!\n");
- // todo, support UDP ?
- return NULL;
- }
- fpkt->l4_header = (char *)th;
- struct ip *i4h = (struct ip *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV4);
- struct ip6_hdr *i6h = (struct ip6_hdr *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV6);
- if ((NULL == i6h) && (NULL == i4h))
- {
- DEBUG_PRINT("Not found ipv4 or ipv6 header!\n");
- return NULL;
- }
-
- if (i4h && (NULL == i6h))
- {
- innermost_l3_layer_type = ADDR_TYPE_IPV4;
- }
- else if (i6h && (NULL == i4h))
- {
- innermost_l3_layer_type = ADDR_TYPE_IPV6;
- }
- else // both ipv4 and ipv6 exist, maybe 4over6, 6over4, gtp etc.
- {
- if ((char *)i4h - (char *)i6h > 0)
- {
- innermost_l3_layer_type = ADDR_TYPE_IPV4;
- }
- else
- {
- innermost_l3_layer_type = ADDR_TYPE_IPV6;
- }
- }
-
- int cur_pkt_dir = hdgt_get_packet_dir_of_tcp(th);
-
- if (ADDR_TYPE_IPV4 == innermost_l3_layer_type)
- {
- fses->addr_type = SESSION_ADDR_TYPE_IPV4_TCP;
- if (PACKET_DIRECTION_C2S == cur_pkt_dir)
- {
-
- tmp_addr.ipv4.saddr = i4h->ip_src.s_addr;
- tmp_addr.ipv4.daddr = i4h->ip_dst.s_addr;
- tmp_addr.ipv4.sport = th->th_sport;
- tmp_addr.ipv4.dport = th->th_dport;
- }
- else
- {
- tmp_addr.ipv4.saddr = i4h->ip_dst.s_addr;
- tmp_addr.ipv4.daddr = i4h->ip_src.s_addr;
- tmp_addr.ipv4.sport = th->th_dport;
- tmp_addr.ipv4.dport = th->th_sport;
- }
- }
- else
- {
- fses->addr_type = SESSION_ADDR_TYPE_IPV6_TCP;
- if (PACKET_DIRECTION_C2S == cur_pkt_dir)
- {
- memcpy(tmp_addr.ipv6.saddr, i6h->ip6_src.s6_addr, IPV6_ADDR_LEN);
- memcpy(tmp_addr.ipv6.daddr, i6h->ip6_dst.s6_addr, IPV6_ADDR_LEN);
- tmp_addr.ipv6.sport = th->th_sport;
- tmp_addr.ipv6.dport = th->th_dport;
- }
- else
- {
- memcpy(tmp_addr.ipv6.saddr, i6h->ip6_dst.s6_addr, IPV6_ADDR_LEN);
- memcpy(tmp_addr.ipv6.daddr, i6h->ip6_src.s6_addr, IPV6_ADDR_LEN);
- tmp_addr.ipv6.sport = th->th_dport;
- tmp_addr.ipv6.dport = th->th_sport;
- }
- }
-
- fses->addr = MMALLOC(struct session_addr, sizeof(struct session_addr));
- memcpy(fses->addr, &tmp_addr, sizeof(struct session_addr));
-
- return fses->addr;
-}
-
-/* example: "1.1.1.1.12345>2.2.2.2.80" */
-static void hdgt_json_session_adddr_pton_v4(struct session_addr *addr, const char *tuple4_cstr)
-{
- const char *delim = ".>";
- char *dup_str = strdup(tuple4_cstr);
- char *sip1 = strtok(dup_str, delim);
- char *sip2 = strtok(NULL, delim);
- char *sip3 = strtok(NULL, delim);
- char *sip4 = strtok(NULL, delim);
- char *sport = strtok(NULL, delim);
-
- char *dip1 = strtok(NULL, delim);
- char *dip2 = strtok(NULL, delim);
- char *dip3 = strtok(NULL, delim);
- char *dip4 = strtok(NULL, delim);
- char *dport = strtok(NULL, delim);
-
- char sip_str[INET_ADDRSTRLEN] = {};
- char dip_str[INET_ADDRSTRLEN] = {};
- sprintf(sip_str, "%s.%s.%s.%s", sip1, sip2, sip3, sip4);
- inet_pton(AF_INET, sip_str, &addr->ipv4.saddr);
- sprintf(dip_str, "%s.%s.%s.%s", dip1, dip2, dip3, dip4);
- inet_pton(AF_INET, dip_str, &addr->ipv4.daddr);
- addr->ipv4.sport = htons(atoi(sport));
- addr->ipv4.dport = htons(atoi(dport));
-}
-
-/* fe80::8c19:7aff:fef2:11e5.12345>fe80::8c19:7aff:fef2:11e5.80 */
-static void hdgt_json_session_adddr_pton_v6(struct session_addr *addr, const char *tuple4_cstr)
-{
- char *dup_str = strdup(tuple4_cstr);
- char *sip = dup_str;
- char *ptr = strchr(dup_str, '.');
- *ptr = '\0';
- ptr++;
- char *sport = ptr;
- ptr = strchr(sport, '>');
- *ptr = '\0';
- ptr++;
- char *dip = ptr;
- ptr = strchr(dip, '.');
- *ptr = '\0';
- ptr++;
- char *dport = ptr;
-
- char sip_str[INET6_ADDRSTRLEN] = {};
- char dip_str[INET6_ADDRSTRLEN] = {};
- inet_pton(AF_INET6, sip, addr->ipv6.saddr);
- inet_pton(AF_INET6, dip, addr->ipv6.daddr);
- addr->ipv6.sport = htons(atoi(sport));
- addr->ipv6.dport = htons(atoi(dport));
-}
-
-static void hdgt_json_session_adddr_pton(struct fake_session *fses, const char *tuple4_cstr)
-{
- struct session_addr *addr = fses->addr;
- if (strchr(tuple4_cstr, ':') != NULL)
- {
- hdgt_json_session_adddr_pton_v6(addr, tuple4_cstr);
- fses->addr_type = SESSION_ADDR_TYPE_IPV6_TCP;
- return;
- }
- else
- {
- hdgt_json_session_adddr_pton_v4(addr, tuple4_cstr);
- fses->addr_type = SESSION_ADDR_TYPE_IPV4_TCP;
- }
-}
-
-static struct session_addr *hgdt_get_session_addr_by_json(struct fake_session *fses, struct fake_packet *fpkt)
-{
- if (fses->addr != NULL)
- {
- return fses->addr;
- }
-
- cJSON *tuple4_obj = cJSON_GetObjectItem(fses->fst->data_src_json_para.current_object, GTEST_HTTP_TUPLE4_NAME);
- if (NULL == tuple4_obj)
- {
- fprintf(stderr, "Not found tuple4 object!\n");
- return NULL;
- }
- fses->addr = MMALLOC(struct session_addr, sizeof(struct session_addr));
- hdgt_json_session_adddr_pton(fses, tuple4_obj->valuestring);
- return fses->addr;
-}
-
-static struct session_addr *hgdt_get_session_addr(struct fake_session *fses, struct fake_packet *fpkt)
-{
- if (fses->fst->data_source_type == DATA_SOURCE_PCAP)
- {
- return hgdt_get_session_addr_by_pcap(fses, fpkt);
- }
- return hgdt_get_session_addr_by_json(fses, fpkt);
-}
-
-static void hdgt_session_update(struct fake_stellar *fst, struct fake_session *fses, int event)
-{
- fst->http_decoder_entry((struct session *)fses, event, (struct packet *)fses->fpkt, fst->http_decoder_ctx);
-}
-
-int hdgt_data_source_init_by_json_text(struct fake_stellar *fst, const char *json_cont)
-{
- fst->data_src_json_para.json_root = cJSON_Parse(json_cont);
- if (NULL == fst->data_src_json_para.json_root)
- {
- fprintf(stderr, "cJSON_Parse() %s fail!\n", json_cont);
- return -1;
- }
- fst->data_src_json_para.json_array_size = cJSON_GetArraySize(fst->data_src_json_para.json_root);
- fst->data_src_json_para.current_json_array_idx = 0;
- return 0;
-}
-
-int hdgt_data_source_init_by_json_file(struct fake_stellar *fst, const char *json_file)
-{
- char *file_cont = hdgt_get_file_content(json_file);
- int ret;
- if (NULL == file_cont)
- {
- fprintf(stderr, "Open json file fail: %s\n", json_file);
- return -1;
- }
- ret = hdgt_data_source_init_by_json_text(fst, file_cont);
- MFREE(file_cont);
- return ret;
-}
-
-int hdgt_data_source_init(struct fake_stellar *fst)
-{
- if (DATA_SOURCE_PCAP == fst->data_source_type)
- {
- char errbuf[PCAP_ERRBUF_SIZE];
- fst->pcap_ins = pcap_open_offline(fst->data_source_file_name, errbuf);
- if (NULL == fst->pcap_ins)
- {
- fprintf(stderr, "pcap_open_offline() fail: %s\n", errbuf);
- return -1;
- }
- }
- else if (DATA_SOURCE_JSON == fst->data_source_type)
- {
- return hdgt_data_source_init_by_json_file(fst, fst->data_source_file_name);
- }
- else
- {
- DEBUG_PRINT("Invalid data source type!\n");
- return -1;
- }
-
- return 0;
-}
-
-static void hdgt_prune_non_result_item(cJSON *benchmark_json_root)
-{
- int array_size = cJSON_GetArraySize(benchmark_json_root);
-
- for (int i = 0; i < array_size; i++)
- {
- cJSON *object_root = cJSON_GetArrayItem(benchmark_json_root, i);
- cJSON_DeleteItemFromObject(object_root, GTEST_HTTP_PAYLOAD_NAME);
- }
-}
-
-static int hdgt_benchmakr_json_parse(struct fake_stellar *fst)
-{
- char *file_cont = hdgt_get_file_content(fst->benchmark_json_file_name);
- if (NULL == file_cont)
- {
- fprintf(stderr, "Open json file fail: %s\n", fst->benchmark_json_file_name);
- return -1;
- }
- fst->load_benchmark_json_root = cJSON_Parse(file_cont);
- if (NULL == fst->load_benchmark_json_root)
- {
- fprintf(stderr, "cJSON_Parse() %s fail!\n", fst->benchmark_json_file_name);
- MFREE(file_cont);
- return -1;
- }
- fst->http_plug_test_result_root = cJSON_CreateArray();
- MFREE(file_cont);
-
- hdgt_prune_non_result_item(fst->load_benchmark_json_root);
- return 0;
-}
-
-int hdgt_under_test_module_init(struct fake_stellar *fst, HTTP_DECODER_INIT_FUN_T init_fun, HTTP_DECODER_ENTRY_FUN_T entry_fun)
-{
- fst->http_decoder_ctx = init_fun((struct stellar *)fst);
- fst->http_decoder_entry = entry_fun;
- return 0;
-}
-
-int hdgt_test_plug_init(struct fake_stellar *fst, HTTP_DECODER_INIT_FUN_T init_fun, HTTP_DECODER_PLUG_ENTRY_FUN_T entry_fun)
-{
- http_decoder_plug_set_entry_fuc(entry_fun);
- fst->http_http_plug_ctx = init_fun((struct stellar *)fst);
- return 0;
-}
-
-struct fake_stellar *hdgt_create(void)
-{
- struct fake_stellar *fst = MMALLOC(struct fake_stellar, sizeof(struct fake_stellar));
- fst->tcp_mss = 1460; // set default value
- return fst;
-}
-
-int hdgt_init_once(struct fake_stellar *fst, int argc, char **argv,
- HTTP_DECODER_INIT_FUN_T hd_init_fun, HTTP_DECODER_ENTRY_FUN_T hd_entry_fun,
- HTTP_DECODER_INIT_FUN_T hd_plug_init_fun, HTTP_DECODER_PLUG_ENTRY_FUN_T hd_plug_entry_fun)
-{
- if (hdgt_parse_cmd_args(fst, argc, argv) < 0)
- {
- fprintf(stderr, "hdgt_parse_cmd_args() fail!\n");
- goto fail_exit;
- }
- if (hdgt_data_source_init(fst) < 0)
- {
- fprintf(stderr, "hdgt_data_source_init() fail!\n");
- goto fail_exit;
- }
- if (hdgt_benchmakr_json_parse(fst) < 0)
- {
- fprintf(stderr, "hdgt_benchmakr_json_parse() fail!\n");
- goto fail_exit;
- }
- if (hdgt_under_test_module_init(fst, hd_init_fun, hd_entry_fun) < 0)
- {
- fprintf(stderr, "hdgt_under_test_module_init() fail!\n");
- goto fail_exit;
- }
- if (hdgt_test_plug_init(fst, hd_plug_init_fun, hd_plug_entry_fun) < 0)
- {
- fprintf(stderr, "hdgt_test_plug_init() fail!\n");
- goto fail_exit;
- }
-
- return 0;
-
-fail_exit:
- return -1;
-}
-
-void hdgt_destroy(struct fake_stellar *fst)
-{
- cJSON_free(fst->load_benchmark_json_root);
- cJSON_free(fst->http_plug_test_result_root);
- if (fst->data_src_json_para.json_root)
- {
- cJSON_free(fst->data_src_json_para.json_root);
- }
- if (fst->pcap_ins)
- {
- pcap_close(fst->pcap_ins);
- }
-
- MFREE(fst);
- return;
-}
-
-static void hdgt_session_free(struct fake_session *fses)
-{
- const struct fake_exdata_manage *ex_mgr = fses->fst->fake_exdata_mgr;
-
- for (int i = 0; i < EX_DATA_MAX_SIZE; i++)
- {
- if (fses->plug_exdata_array[i] != NULL)
- {
- ex_mgr[i].free_func((struct session *)fses, i, fses->plug_exdata_array[i], ex_mgr[i].arg);
- }
- }
-
- if (fses->readable_addr_cstr)
- {
- MFREE(fses->readable_addr_cstr);
- }
-
- if (fses->addr)
- {
- MFREE(fses->addr);
- }
-
- MFREE(fses);
-}
-
-void hdgt_main_loop(struct fake_stellar *fst)
-{
- struct fake_packet __null_pkt = {};
- struct fake_packet fpkt = {};
- struct fake_session *fses = hdgt_session_new(fst);
-
- fses->fpkt = &__null_pkt;
- hdgt_session_update(fst, fses, SESS_EV_OPENING);
-
- fses->fpkt = &fpkt;
- while (hdgt_get_packet(fst, &fpkt) == 1)
- {
- if (NULL == hgdt_get_session_addr(fses, &fpkt))
- {
- continue; // not tcp, not ip
- }
- if (hdgt_update_packet_detail(fses, &fpkt) < 0)
- {
- continue;
- }
- while (hdgt_has_data_left(&fpkt))
- {
- hdgt_session_update(fst, fses, SESS_EV_PACKET);
- }
- }
-
- fses->fpkt = &__null_pkt;
- hdgt_session_update(fst, fses, SESS_EV_CLOSING);
-
- hdgt_session_free(fses);
-}