diff options
| author | luwenpeng <[email protected]> | 2022-11-18 18:49:41 +0800 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2022-11-18 18:49:52 +0800 |
| commit | 54375f7139e1585e66ace05184f56080529717c8 (patch) | |
| tree | 30a73f2292a80a1a94cc51663f438515979250ba /src/protocol_decoder/http/session.c | |
| parent | 7aa1710ed0ecb3ed480ae5c02f31d7f7dcbd5c23 (diff) | |
暂存HTTP decoder的代码,代码结构待整合dev-lwp
TSG-11629 stellar protocol decoder支持HTTP decoder
TSG-11932 stellar http decoder支持mutil request/response in one packet
TSG-11933 llhttp解析request时获取精确的http version
TSG-12021 stellar http decoder支持decompress body data
TSG-12022 stellar http decoder支持chunk模式
Diffstat (limited to 'src/protocol_decoder/http/session.c')
| -rw-r--r-- | src/protocol_decoder/http/session.c | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/src/protocol_decoder/http/session.c b/src/protocol_decoder/http/session.c new file mode 100644 index 0000000..5b581b7 --- /dev/null +++ b/src/protocol_decoder/http/session.c @@ -0,0 +1,185 @@ +#include <assert.h> +#include <string.h> + +#include "hash.h" +#include "session.h" +#include "http_decoder_util.h" + +struct event_queue +{ + struct session_event *head; // del from head + struct session_event *tail; // add to tail +}; + +struct event_queue g_event_queue = {.head = NULL, .tail = NULL}; + +/****************************************************************************** + * session event + ******************************************************************************/ + +void session_event_push(struct session_event *event) +{ + printf("EVENT PUSH: %s\n", event->event_name); + event->next = NULL; + + // none node + if (g_event_queue.head == NULL && g_event_queue.tail == NULL) + { + g_event_queue.head = event; + g_event_queue.tail = event; + } + // only one node + else if (g_event_queue.head == g_event_queue.tail) + { + g_event_queue.tail->next = event; + g_event_queue.tail = event; + } + else + // mutil node + { + g_event_queue.tail->next = event; + g_event_queue.tail = event; + } +} + +struct session_event *session_event_pop() +{ + struct session_event *temp = g_event_queue.head; + + // none node + if (g_event_queue.head == NULL && g_event_queue.tail == NULL) + { + return NULL; + } + // only one node + else if (g_event_queue.head == g_event_queue.tail) + { + g_event_queue.head = NULL; + g_event_queue.tail = NULL; + temp->next = NULL; + printf("EVENT POP : %s\n", temp->event_name); + + return temp; + } + else + // mutil node + { + g_event_queue.head = temp->next; + temp->next = NULL; + printf("EVENT POP : %s\n", temp->event_name); + + return temp; + } +} + +/****************************************************************************** + * session derive/trigger + ******************************************************************************/ + +struct stellar_session *session_derive(struct stellar_session *session, const char *session_name) +{ + struct stellar_session *new_session = safe_alloc(struct stellar_session, 1); + assert(new_session); + + new_session->father = session; + new_session->session_name = session_name; + + printf("SESSION DERIVER: %s\n", session_name); + + return new_session; +} + +void session_trigger(struct stellar_session *session, const char *event_name) +{ + struct session_event *event = safe_alloc(struct session_event, 1); + assert(event); + + event->session = session; + event->event_name = event_name; + + session_event_push(event); +} + +/****************************************************************************** + * session ex data + ******************************************************************************/ + +size_t session_register_ex_data_index(const char *key) +{ + size_t hash_value = 0; + size_t hash_index = 0; + HASH_JEN(key, strlen(key), hash_value); + + hash_index = hash_value % EX_DATA_MAX_NUM; + + return hash_index; +} + +void session_set_ex_data(struct stellar_session *session, int idx, void *ex_data, free_callback *free_cb, void *cb_arg) +{ + assert(idx >= 0 && idx < EX_DATA_MAX_NUM); + assert(session->ex_data[idx].ex_data == NULL); + assert(session->ex_data[idx].free_cb == NULL); + assert(session->ex_data[idx].cb_arg == NULL); + + session->ex_data[idx].ex_data = ex_data; + session->ex_data[idx].free_cb = free_cb; + session->ex_data[idx].cb_arg = cb_arg; +} + +void *session_get_ex_data(struct stellar_session *session, int idx) +{ + assert(idx >= 0 && idx < EX_DATA_MAX_NUM); + + return session->ex_data[idx].ex_data; +} + +void session_del_ex_data(struct stellar_session *session, int idx) +{ + assert(idx >= 0 && idx < EX_DATA_MAX_NUM); + assert(session->ex_data[idx].ex_data); + + session->ex_data[idx].ex_data = NULL; + session->ex_data[idx].free_cb = NULL; + session->ex_data[idx].cb_arg = NULL; +} + +void session_free_ex_data(struct stellar_session *session) +{ + assert(session); + + for (size_t i = 0; i < EX_DATA_MAX_NUM; i++) + { + struct session_ex_data *exdata = &session->ex_data[i]; + if (exdata->free_cb) + { + exdata->free_cb(exdata->ex_data, exdata->cb_arg); + } + exdata->free_cb = NULL; + exdata->cb_arg = NULL; + exdata->ex_data = NULL; + } +} +/****************************************************************************** + * session get data + ******************************************************************************/ + +const char *session_get_l4_payload(struct stellar_session *session) +{ + return session->l7_payload; +} + +size_t session_get_l4_payload_length(struct stellar_session *session) +{ + return session->l7_payload_length; +} + +uint8_t session_get_l4_dir(struct stellar_session *session) +{ + return session->current_packet_dir; +} + +void pm_session_dettach_me(struct stellar_session *session) +{ + printf("pm_session_dettach_me: %s\n", session->session_name); +}
\ No newline at end of file |
