#ifndef RPROXY_TYPES_H #define RPROXY_TYPES_H #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #define MAX_EVENTS 4096 #define MAX_FDS 65536 #define CHUNK_SIZE 65536 #define HISTORY_SECONDS 300 #define MAX_HEADER_SIZE 8192 #define MAX_REQUEST_LINE_SIZE 4096 #define MAX_URI_SIZE 2048 #define CONNECTION_TIMEOUT 300 #define ERROR_RESPONSE_SIZE 4096 #define HOST_HEADER_SIZE 512 #define MAX_BUFFER_SIZE (64 * 1024 * 1024) #define MIN_DATA_FOR_REQUEST_CHECK 1 #define RATE_LIMIT_WINDOW_SECONDS 60 #define DEFAULT_RATE_LIMIT_REQUESTS 1000 #define HEALTH_CHECK_INTERVAL_SECONDS 30 #define HEALTH_CHECK_TIMEOUT_MS 5000 #define MAX_UPSTREAM_RETRIES 3 #define UPSTREAM_RETRY_DELAY_MS 100 #define MAX_PATCH_RULES 64 #define MAX_PATCH_KEY_SIZE 256 #define MAX_PATCH_VALUE_SIZE 1024 typedef enum { CONN_TYPE_UNUSED, CONN_TYPE_LISTENER, CONN_TYPE_CLIENT, CONN_TYPE_UPSTREAM } conn_type_t; typedef enum { CLIENT_STATE_READING_HEADERS, CLIENT_STATE_FORWARDING, CLIENT_STATE_SERVING_INTERNAL, CLIENT_STATE_ERROR, CLIENT_STATE_CLOSING } client_state_t; typedef struct { char *data; size_t capacity; size_t head; size_t tail; } buffer_t; typedef struct { char method[32]; char uri[MAX_URI_SIZE]; char version[16]; char host[256]; long content_length; int is_websocket; int keep_alive; int connection_close; bool is_chunked; } http_request_t; struct connection_s; struct vhost_stats_s; struct route_config_s; struct app_config_s; typedef struct connection_s { conn_type_t type; client_state_t state; int fd; struct connection_s *pair; struct vhost_stats_s *vhost_stats; buffer_t read_buf; buffer_t write_buf; SSL *ssl; int ssl_handshake_done; http_request_t request; double request_start_time; time_t last_activity; int half_closed; int write_shutdown; struct route_config_s *route; struct app_config_s *config; int is_textual_content; int content_type_checked; int patch_blocked; int response_headers_parsed; long original_content_length; long content_length_delta; } connection_t; typedef struct { char key[MAX_PATCH_KEY_SIZE]; char value[MAX_PATCH_VALUE_SIZE]; int is_null; size_t key_len; size_t value_len; } patch_rule_t; typedef struct { patch_rule_t rules[MAX_PATCH_RULES]; int rule_count; } patch_config_t; typedef struct route_config_s { char hostname[256]; char upstream_host[256]; int upstream_port; int use_ssl; int rewrite_host; int use_auth; char username[128]; char password_hash[256]; patch_config_t patches; } route_config_t; typedef struct app_config_s { int port; route_config_t *routes; int route_count; _Atomic int ref_count; struct app_config_s *next; } app_config_t; typedef struct { double time; double value; } history_point_t; typedef struct { history_point_t *points; int capacity; int head; int count; } history_deque_t; typedef struct { double time; double rx_kbps; double tx_kbps; } network_history_point_t; typedef struct { network_history_point_t *points; int capacity; int head; int count; } network_history_deque_t; typedef struct { double time; double read_mbps; double write_mbps; } disk_history_point_t; typedef struct { disk_history_point_t *points; int capacity; int head; int count; } disk_history_deque_t; typedef struct { double *times; int capacity; int head; int count; } request_time_deque_t; typedef struct vhost_stats_s { char vhost_name[256]; long long http_requests; long long websocket_requests; long long total_requests; long long bytes_sent; long long bytes_recv; double avg_request_time_ms; long long last_bytes_sent; long long last_bytes_recv; double last_update; history_deque_t throughput_history; request_time_deque_t request_times; struct vhost_stats_s *next; } vhost_stats_t; typedef struct { time_t start_time; int active_connections; history_deque_t cpu_history; history_deque_t memory_history; network_history_deque_t network_history; disk_history_deque_t disk_history; history_deque_t throughput_history; history_deque_t load1_history; history_deque_t load5_history; history_deque_t load15_history; long long last_net_sent; long long last_net_recv; long long last_disk_read; long long last_disk_write; double last_net_update_time; double last_disk_update_time; vhost_stats_t *vhost_stats_head; sqlite3 *db; } system_monitor_t; #endif