diff options
Diffstat (limited to 'decoders/http/http_decoder_private.h')
| -rw-r--r-- | decoders/http/http_decoder_private.h | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/decoders/http/http_decoder_private.h b/decoders/http/http_decoder_private.h new file mode 100644 index 0000000..8c071e8 --- /dev/null +++ b/decoders/http/http_decoder_private.h @@ -0,0 +1,152 @@ + +#pragma once + +#ifndef __USE_MISC +#define __USE_MISC 1 +#endif + +#include <cstddef> +#ifdef __cplusplus +extern "C" +{ +#endif +#include <bits/types/struct_iovec.h> +#include "stellar/stellar.h" +#include "stellar/layer.h" +#include "stellar/packet.h" +#include "stellar/utils.h" +#include "stellar/session.h" +#include "stellar/stellar_mq.h" +#include "stellar/stellar_exdata.h" + +#include "nmx_pool/nmx_palloc.h" +#include "stellar/utils.h" +#include "stellar/http.h" +#include "http_decoder_result_queue.h" +#include "http_decoder_half.h" +#include "http_decoder_table.h" +#include "http_decoder_result_queue.h" +#include "http_decoder_utils.h" +#include "http_decoder_stat.h" +#include "http_decoder_tunnel.h" +#include "fieldstat/fieldstat_easy.h" +#include "toml/toml.h" + +#ifndef likely +#define likely(x) __builtin_expect((x), 1) +#endif +#ifndef unlikely +#define unlikely(x) __builtin_expect((x), 0) +#endif + +#define MEMPOOL_CALLOC(pool, type, number) ((type *)nmx_pcalloc(pool, sizeof(type) * number)) +#define MEMPOOL_REALLOC(pool) +#define MEMPOOL_FREE(pool, p) nmx_pfree(pool, p) + +#define ENABLE_MEMPOOL 0 +#if ENABLE_MEMPOOL +#define HD_CALLOC(pool, type, number) MEMPOOL_CALLOC(pool, number, type) +#define HD_FREE(pool, p) MEMPOOL_FREE(pool, p) +#else +#define HD_CALLOC(pool, type, number) CALLOC(type, number) +#define HD_FREE(pool, p) FREE(p) +#endif + +#define HTTP_IDENTIFY_LEN 16 +#define HD_RESULT_QUEUE_LEN 16 + +#define DEFAULT_STAT_OUTPUT_INTERVAL 1 +#define DEFAULT_STAT_INTERVAL_PKTS 1000 +#define DEFAULT_MEMPOOL_SIZE (32 * 1024) + +#define HTTPD_CFG_FILE "./etc/http/http_decoder.toml" +#define FILEDSTAT_OUTPUT_FILE "./metrics/http_decoder_fs4.json" + +#define HTTP_CTX_NOT_HTTP "__NOT_HTTP_SESS__" +#define HTTP_CTX_IS_HTTP "__FAKE_HTTP_CTX__" + + struct http_decoder_config + { + int decompress_switch; + int stat_interval_pkts; // call fieldstat_incrby every stat_interval_pkts + int stat_output_interval; + int proxy_enable; + size_t result_queue_len; // per session result queue length + size_t mempool_size; // per session mempool size + }; + + /** + * NOTE: http_message don't have the ownership of data + */ + struct http_message + { + uint8_t flow_type; + enum http_message_type type; + size_t queue_index; + struct http_decoder_result_queue *ref_queue; + hstring raw_payload; // cause tcp reorder, maybe receive many tcp segments for one packet + hstring decompress_payload; + hstring tunnel_payload; + }; + + struct http_decoder + { + struct http_decoder_half *c2s_half; + struct http_decoder_half *s2c_half; + }; + + enum httpd_topic_index + { + HTTPD_TOPIC_TCP_STREAM_INDEX = 0, + HTTPD_TOPIC_HTTP_MSG_INDEX, + HTTPD_TOPIC_HTTP_TUNNEL_INDEX, + HTTPD_TOPIC_INDEX_MAX, + }; + + struct http_decoder_exdata + { + int sub_topic_id; // tcp_stream + int pub_topic_id; // http message or http tunnel msg + struct http_decoder_result_queue *queue; + struct http_decoder *decoder; + nmx_pool_t *mempool; + enum http_tunnel_state tunnel_state; + int in_tunnel_is_http; + }; + + // struct http_decoder_context{ + // int array_size; + // struct http_decoder_exdata **exdata_array; //raw tcp stream for http msg; http tunnel for inner http transaction. + // }; + + struct http_topic_exdata_compose + { + enum httpd_topic_index index; + const char *topic_name; + on_session_msg_cb_func *on_msg_cb; + stellar_msg_free_cb_func *msg_free_cb; + const char *exdata_name; + stellar_exdata_free *exdata_free_cb; + int sub_topic_id; // as consumer + int exdata_id; + }; + + struct http_decoder_env + { + struct stellar *st; + int plugin_id; + struct http_topic_exdata_compose topic_exdata_compose[HTTPD_TOPIC_INDEX_MAX]; + struct http_decoder_config hd_cfg; + struct http_decoder_stat hd_stat; + }; + + struct http_message; + + struct http_message *http_message_new(enum http_message_type type, struct http_decoder_result_queue *queue, + int queue_index, unsigned char flow_type); + struct http_message *http_body_message_new(enum http_message_type type, struct http_decoder_result_queue *queue, + int queue_index, uint8_t flow_type, hstring *raw_payload); + int http_topic_exdata_compose_get_index(const struct http_decoder_env *httpd_env, int by_topic_id); +#ifdef __cplusplus +} +#endif |
