Csilk 0.2.1
A lightweight, high-performance C HTTP web framework
Loading...
Searching...
No Matches
csilk.h
Go to the documentation of this file.
1
13#ifndef CSILK_H
14#define CSILK_H
15
16#include <setjmp.h>
17#include <stddef.h>
18#include <stdint.h>
19#include <uv.h>
20
21#include "cJSON.h"
22#include "csilk/drivers/ai.h"
24#include "csilk/drivers/db.h"
25#include "csilk/drivers/perm.h"
27
32#define CSILK_VERSION "0.2.3"
33
39#define CSILK_MAX_PARAMS 20
40
45#define CSILK_STATUS_CONTINUE 100
46#define CSILK_STATUS_SWITCHING_PROTOCOLS 101
47#define CSILK_STATUS_OK 200
48#define CSILK_STATUS_CREATED 201
49#define CSILK_STATUS_NO_CONTENT 204
50#define CSILK_STATUS_PARTIAL_CONTENT 206
51#define CSILK_STATUS_MOVED_PERMANENTLY 301
52#define CSILK_STATUS_FOUND 302
53#define CSILK_STATUS_NOT_MODIFIED 304
54#define CSILK_STATUS_TEMPORARY_REDIRECT 307
55#define CSILK_STATUS_BAD_REQUEST 400
56#define CSILK_STATUS_UNAUTHORIZED 401
57#define CSILK_STATUS_PAYMENT_REQUIRED 402
58#define CSILK_STATUS_FORBIDDEN 403
59#define CSILK_STATUS_NOT_FOUND 404
60#define CSILK_STATUS_METHOD_NOT_ALLOWED 405
61#define CSILK_STATUS_REQUEST_TIMEOUT 408
62#define CSILK_STATUS_CONFLICT 409
63#define CSILK_STATUS_GONE 410
64#define CSILK_STATUS_PAYLOAD_TOO_LARGE 413
65#define CSILK_STATUS_RANGE_NOT_SATISFIABLE 416
66#define CSILK_STATUS_URI_TOO_LONG 414
67#define CSILK_STATUS_UNSUPPORTED_MEDIA_TYPE 415
68#define CSILK_STATUS_TOO_MANY_REQUESTS 429
69#define CSILK_STATUS_INTERNAL_SERVER_ERROR 500
70#define CSILK_STATUS_NOT_IMPLEMENTED 501
71#define CSILK_STATUS_BAD_GATEWAY 502
72#define CSILK_STATUS_SERVICE_UNAVAILABLE 503
73#define CSILK_STATUS_GATEWAY_TIMEOUT 504
83typedef struct csilk_ctx_s csilk_ctx_t;
84
95typedef struct {
100 void (*set)(csilk_ctx_t* c, const char* key, void* value);
105 void* (*get)(csilk_ctx_t* c, const char* key);
108 void (*clear)(csilk_ctx_t* c);
110
120typedef void (*csilk_handler_t)(csilk_ctx_t* c);
121
131typedef struct csilk_header_s {
132 char* key;
134 char* value;
136 size_t key_len;
137 size_t value_len;
138 struct csilk_header_s* next;
141
149#ifndef CSILK_HEADER_BUCKETS
150#define CSILK_HEADER_BUCKETS 64
151#endif
152
162typedef struct csilk_header_map_s {
166
186
203
213typedef struct {
214 char* key;
215 char* value;
217
228typedef struct csilk_arena_s csilk_arena_t;
229
237const char* csilk_get_method(csilk_ctx_t* c);
238
247const char* csilk_get_path(csilk_ctx_t* c);
248
261const char* csilk_get_body(csilk_ctx_t* c, size_t* out_len);
262
272size_t csilk_get_body_len(csilk_ctx_t* c);
273
282int csilk_is_websocket(csilk_ctx_t* c);
283
292void csilk_ws_join_room(csilk_ctx_t* c, const char* room_name);
293
297void csilk_ws_leave_room(csilk_ctx_t* c, const char* room_name);
298
303void csilk_ws_broadcast_room(csilk_ctx_t* c, const char* room_name, const char* message);
304
315int csilk_is_sse(csilk_ctx_t* c);
316
326int csilk_is_aborted(csilk_ctx_t* c);
327
340 csilk_ctx_t* c,
341 void (*callback)(csilk_ctx_t* c, const uint8_t* payload, size_t len, int opcode));
342
345 csilk_ctx_t* c,
346 void (*callback)(csilk_ctx_t* c, const uint8_t* payload, size_t len, int opcode));
347
358const char* csilk_get_request_id(csilk_ctx_t* c);
359
370csilk_arena_t* csilk_get_arena(csilk_ctx_t* c);
371
378int csilk_get_status(csilk_ctx_t* c);
379
391void csilk_set_async(csilk_ctx_t* c, int is_async);
392
399int csilk_is_async(csilk_ctx_t* c);
400
415void csilk_set_response_body(csilk_ctx_t* c, const char* body, size_t len, int managed);
416
429const char* csilk_get_response_body(csilk_ctx_t* c, size_t* out_len);
430
442void csilk_redirect(csilk_ctx_t* c, int status, const char* location);
443
452void csilk_redirect_simple(csilk_ctx_t* c, const char* url);
453
468void csilk_set(csilk_ctx_t* c, const char* key, void* value);
469
479void* csilk_get(csilk_ctx_t* c, const char* key);
480
491void csilk_next(csilk_ctx_t* c);
492
502void csilk_abort(csilk_ctx_t* c);
503
510void csilk_status(csilk_ctx_t* c, int status);
511
523void csilk_string(csilk_ctx_t* c, int status, const char* msg);
524
536const char* csilk_get_param(csilk_ctx_t* c, const char* key);
537
546const char* csilk_get_header(csilk_ctx_t* c, const char* key);
547
556const char* csilk_get_response_header(csilk_ctx_t* c, const char* key);
557
569const char* csilk_get_query(csilk_ctx_t* c, const char* key);
570
580void csilk_parse_form_urlencoded(csilk_ctx_t* c);
581
593const char* csilk_get_form_field(csilk_ctx_t* c, const char* key);
594
604void csilk_set_request_header(csilk_ctx_t* c, const char* key, const char* value);
605
616void csilk_set_header(csilk_ctx_t* c, const char* key, const char* value);
617
629void csilk_add_header(csilk_ctx_t* c, const char* key, const char* value);
630
640void csilk_ctx_cleanup(csilk_ctx_t* c);
641
652csilk_arena_t* csilk_arena_new(size_t default_chunk_size);
653
665void* csilk_arena_alloc(csilk_arena_t* arena, size_t size);
666
675char* csilk_arena_strdup(csilk_arena_t* arena, const char* s);
676
686char* csilk_arena_strndup(csilk_arena_t* arena, const char* s, size_t n);
687
696
707
720void csilk_recovery_handler(csilk_ctx_t* c);
721
731void csilk_panic(csilk_ctx_t* c);
732
750
768
773
782 csilk_log_level_t lv, const char* file, int line, const char* func, const char* fmt, ...);
783
785void csilk_log_close();
786
802 const char* file,
803 int line,
804 const char* func,
805 cJSON* extra,
806 const char* fmt,
807 ...);
808
811int csilk_log_is_json(void);
812
815void csilk_log_set_request_id(const char* request_id);
816
831cJSON* csilk_log_make_kv(const char* key, ...);
832
837#define CSILK_LOG_T(...) \
838 _csilk_log_internal(CSILK_LOG_TRACE, __FILE__, __LINE__, __func__, __VA_ARGS__)
840#define CSILK_LOG_D(...) \
841 _csilk_log_internal(CSILK_LOG_DEBUG, __FILE__, __LINE__, __func__, __VA_ARGS__)
843#define CSILK_LOG_I(...) \
844 _csilk_log_internal(CSILK_LOG_INFO, __FILE__, __LINE__, __func__, __VA_ARGS__)
846#define CSILK_LOG_W(...) \
847 _csilk_log_internal(CSILK_LOG_WARN, __FILE__, __LINE__, __func__, __VA_ARGS__)
849#define CSILK_LOG_E(...) \
850 _csilk_log_internal(CSILK_LOG_ERROR, __FILE__, __LINE__, __func__, __VA_ARGS__)
852#define CSILK_LOG_F(...) \
853 _csilk_log_internal(CSILK_LOG_FATAL, __FILE__, __LINE__, __func__, __VA_ARGS__)
854
860#define CSILK_LOG_STRUCT(level, extra, ...) \
861 _csilk_log_structured(level, __FILE__, __LINE__, __func__, extra, __VA_ARGS__)
867void csilk_logger_handler(csilk_ctx_t* c);
868
872void csilk_request_id_middleware(csilk_ctx_t* c);
873
877void csilk_health_check_handler(csilk_ctx_t* c);
878
886typedef struct {
887 const char* allow_origin;
889 const char* allow_methods;
891 const char* allow_headers;
898
910void csilk_cors_middleware(csilk_ctx_t* c, const csilk_cors_config_t* config);
911
921void csilk_rate_limit_middleware(csilk_ctx_t* c, int limit);
922
932void csilk_csrf_middleware(csilk_ctx_t* c);
933
944int csilk_csrf_generate_token(char* buf, size_t buf_size);
945
953typedef struct csilk_server_config_s {
954 unsigned int idle_timeout_ms;
957 unsigned int read_timeout_ms;
959 unsigned int write_timeout_ms;
961 unsigned int request_timeout_ms;
981 /* TLS configuration */
993
1000typedef struct {
1001 int port;
1004 struct {
1005 int enable;
1006 csilk_cors_config_t config;
1007 } cors;
1008 struct {
1009 int enable;
1010 int requests_per_minute;
1011 } rate_limit;
1012 struct {
1013 int enable;
1014 char* root_dir;
1016 char* prefix;
1017 } static_files;
1018 struct {
1019 int enable_logger;
1021 int enable_recovery;
1023 int enable_csrf;
1024 int enable_auth;
1025 char* auth_token;
1027 } middleware;
1028 struct {
1029 char* driver;
1030 char* model;
1031 char* api_key;
1032 char* base_url;
1033 } ai;
1034 struct {
1035 int enable;
1036 char* driver;
1037 } cipher;
1039
1051int csilk_load_config(const char* yaml_path, csilk_config_t* config);
1052
1064int csilk_config_validate(const csilk_config_t* config, const char** error_msg);
1065
1075void csilk_config_free(csilk_config_t* config);
1076
1086typedef int (*csilk_auth_validator_t)(const char* token);
1087
1099void csilk_auth_middleware(csilk_ctx_t* c, csilk_auth_validator_t validator);
1100
1116void csilk_static(csilk_ctx_t* c, const char* root_dir);
1117
1127void csilk_file(csilk_ctx_t* c, const char* file_path);
1128
1139cJSON* csilk_bind_json(csilk_ctx_t* c);
1140
1152cJSON* csilk_bind_json_err(csilk_ctx_t* c, const char** error);
1153
1164const char* csilk_get_cookie(csilk_ctx_t* c, const char* name);
1165
1183void csilk_set_cookie(csilk_ctx_t* c,
1184 const char* name,
1185 const char* value,
1186 int max_age,
1187 const char* path,
1188 const char* domain,
1189 int secure,
1190 int http_only);
1191
1198void csilk_session_init(void);
1199
1208void csilk_session_start(csilk_ctx_t* c);
1209
1217void csilk_session_set(csilk_ctx_t* c, const char* key, void* value);
1218
1227void* csilk_session_get(csilk_ctx_t* c, const char* key);
1228
1237void csilk_session_destroy(csilk_ctx_t* c);
1238
1242#define CSILK_VALID_REQUIRED (1 << 0)
1243#define CSILK_VALID_INT (1 << 1)
1244#define CSILK_VALID_STRING \
1245 (1 << 2)
1247#define CSILK_VALID_EMAIL \
1248 (1 << 3)
1258typedef struct csilk_valid_rule_s {
1259 const char* field;
1260 int flags;
1262 int min;
1264 int max;
1266 const char* source;
1269
1284const char* csilk_validate(csilk_ctx_t* c, const csilk_valid_rule_t* rules);
1285
1298void csilk_json(csilk_ctx_t* c, int status, cJSON* json);
1299
1310void csilk_json_error(csilk_ctx_t* c, int status, const char* message);
1311
1325int csilk_bind_reflect(csilk_ctx_t* c, const char* type_name, void* ptr);
1326
1338void csilk_json_reflect(csilk_ctx_t* c, int status, const char* type_name, const void* ptr);
1339
1345#define csilk_bind(c, type, ptr) csilk_bind_reflect(c, #type, ptr)
1352#define csilk_json_t(c, status, type, ptr) csilk_json_reflect(c, status, #type, ptr)
1353
1364const char* csilk_get_client_ip(csilk_ctx_t* c);
1365
1377void csilk_split_url(const char* url, char** path, char** query);
1378
1389void csilk_parse_query(csilk_ctx_t* c, const char* query_string);
1390
1397typedef struct csilk_router_node_s csilk_router_node_t;
1398
1419typedef struct csilk_router_s {
1420 csilk_router_node_t* root;
1422
1424typedef struct csilk_group_s csilk_group_t;
1425
1435
1452 const char* method,
1453 const char* path,
1454 csilk_handler_t* handlers,
1455 size_t handler_count);
1456
1469csilk_handler_t* csilk_router_match(csilk_router_t* r, const char* method, const char* path);
1470
1481int csilk_router_match_ctx(csilk_router_t* r, csilk_ctx_t* c);
1482
1492
1499
1512
1528 const char* title,
1529 const char* version,
1530 const char* description);
1531
1553 const char* method,
1554 const char* path,
1555 csilk_handler_t* handlers,
1556 size_t handler_count,
1557 const char* path_pattern,
1558 const char* input_type,
1559 const char* output_type,
1560 const char* summary,
1561 const char* description);
1562
1572 const char* method,
1573 const char* path,
1574 csilk_handler_t* handlers,
1575 size_t handler_count,
1576 const char* perm_required,
1577 const char* perm_resource);
1578
1593 const char* method,
1594 const char* path,
1595 csilk_handler_t* handlers,
1596 size_t handler_count,
1597 const char* path_pattern,
1598 const char* input_type,
1599 const char* output_type,
1600 const char* summary,
1601 const char* description,
1602 const char* perm_required,
1603 const char* perm_resource);
1604
1611#define CSILK_ROUTE( \
1612 r, method, path, handlers, handler_count, input_type, output_type, summary, desc) \
1613 csilk_router_add_extended(r, \
1614 method, \
1615 path, \
1616 handlers, \
1617 handler_count, \
1618 path, \
1619 input_type, \
1620 output_type, \
1621 summary, \
1622 desc)
1623
1641void csilk_serve_openapi(csilk_ctx_t* c,
1642 csilk_router_t* r,
1643 const char* title,
1644 const char* version,
1645 const char* description);
1646
1662void csilk_serve_swagger_ui(csilk_ctx_t* c);
1663
1674csilk_group_t* csilk_group_new(csilk_router_t* router, const char* prefix);
1675
1686csilk_group_t* csilk_group_group(csilk_group_t* parent, const char* prefix);
1687
1697void csilk_group_use(csilk_group_t* group, csilk_handler_t handler);
1698
1710void csilk_group_add_route(csilk_group_t* group,
1711 const char* method,
1712 const char* path,
1713 csilk_handler_t handler);
1714
1732void csilk_group_add_route_extended(csilk_group_t* group,
1733 const char* method,
1734 const char* path,
1735 csilk_handler_t handler,
1736 const char* input_type,
1737 const char* output_type,
1738 const char* summary,
1739 const char* description);
1740
1756void csilk_group_add_route_extended_perm(csilk_group_t* group,
1757 const char* method,
1758 const char* path,
1759 csilk_handler_t handler,
1760 const char* input_type,
1761 const char* output_type,
1762 const char* summary,
1763 const char* description,
1764 const char* perm_required,
1765 const char* perm_resource);
1766
1781void csilk_group_add_handlers(csilk_group_t* group,
1782 const char* method,
1783 const char* path,
1784 csilk_handler_t* handlers,
1785 size_t count);
1786
1795void csilk_group_free(csilk_group_t* group);
1796
1801#define csilk_GET(group, path, handler) csilk_group_add_route(group, "GET", path, handler)
1803#define csilk_POST(group, path, handler) csilk_group_add_route(group, "POST", path, handler)
1805#define csilk_PUT(group, path, handler) csilk_group_add_route(group, "PUT", path, handler)
1807#define csilk_DELETE(group, path, handler) csilk_group_add_route(group, "DELETE", path, handler)
1809#define csilk_PATCH(group, path, handler) csilk_group_add_route(group, "PATCH", path, handler)
1811#define csilk_OPTIONS(group, path, handler) csilk_group_add_route(group, "OPTIONS", path, handler)
1813#define csilk_HEAD(group, path, handler) csilk_group_add_route(group, "HEAD", path, handler)
1826void csilk_ws_handshake(csilk_ctx_t* c);
1827
1839void csilk_ws_send(csilk_ctx_t* c, const uint8_t* payload, size_t len, int opcode);
1840
1853void csilk_ws_close(csilk_ctx_t* c, uint16_t status_code, const char* reason);
1854
1855/* --- Streaming Response (Chunked Transfer Encoding) --- */
1856
1869void csilk_response_write(csilk_ctx_t* c, const uint8_t* data, size_t len);
1870
1879void csilk_response_end(csilk_ctx_t* c);
1880
1881/* --- Server-Sent Events (SSE) --- */
1882
1892void csilk_sse_init(csilk_ctx_t* c);
1893
1905void csilk_sse_send(csilk_ctx_t* c, const char* event, const char* data);
1906
1914void csilk_sse_close(csilk_ctx_t* c);
1915
1916/* --- JWT Authentication Middleware --- */
1917
1930char* csilk_jwt_generate(csilk_ctx_t* c, cJSON* payload, const char* secret);
1931
1944cJSON* csilk_jwt_verify(csilk_ctx_t* c, const char* token, const char* secret);
1945
1957void csilk_jwt_middleware(csilk_ctx_t* c, const char* secret);
1958
1959/* --- Gzip Compression Middleware --- */
1960
1971void csilk_gzip_middleware(csilk_ctx_t* c);
1972
1973/* --- Multipart Form Data --- */
1974
1982typedef struct csilk_multipart_part_s {
1983 char name[128];
1985 char filename[256];
1987 char content_type[64];
1989 uint8_t* data;
1991 size_t data_len;
1992 csilk_ctx_t* ctx;
1994
2003
2014void csilk_multipart_parse(csilk_ctx_t* c, csilk_multipart_handler_t handler);
2015
2017typedef struct csilk_server_s csilk_server_t;
2018
2024csilk_server_t* csilk_ctx_get_server(csilk_ctx_t* c);
2025
2026/* --- Hook System --- */
2027
2050
2056typedef void (*csilk_server_hook_handler_t)(csilk_server_t* s);
2057
2063typedef void (*csilk_ctx_hook_handler_t)(csilk_ctx_t* c);
2064
2077void csilk_server_add_hook(csilk_server_t* s, csilk_hook_type_t type, void* handler);
2078
2079/* --- Crypto Driver Interface --- */
2080
2090typedef struct {
2095 void (*sha256)(const uint8_t* data, size_t len, uint8_t out[32]);
2102 void (*hmac_sha256)(const uint8_t* key,
2103 size_t key_len,
2104 const uint8_t* data,
2105 size_t data_len,
2106 uint8_t out[32]);
2112 void (*generate_uuid)(char buf[37]);
2114
2125void csilk_server_set_crypto_driver(csilk_server_t* server, csilk_crypto_driver_t* driver);
2126
2135void csilk_server_set_cipher_driver(csilk_server_t* server, csilk_cipher_driver_t* driver);
2136
2146csilk_server_t* csilk_server_new(csilk_router_t* router);
2147
2158int csilk_server_use(csilk_server_t* server, csilk_handler_t handler);
2159
2170void csilk_server_set_not_found_handler(csilk_server_t* server, csilk_handler_t handler);
2171
2183void csilk_server_set_spa_fallback(csilk_server_t* server, const char* doc_root);
2184
2193void csilk_server_free(csilk_server_t* server);
2194
2203void csilk_server_stop(csilk_server_t* server);
2204
2214void csilk_server_set_config(csilk_server_t* server, const csilk_server_config_t* config);
2215
2224int csilk_server_set_max_connections(csilk_server_t* server, int max);
2225
2234void csilk_server_set_storage_driver(csilk_server_t* server, csilk_storage_driver_t* driver);
2235
2246int csilk_server_run(csilk_server_t* server, int port);
2247
2248/* --- Database Interface --- */
2249
2256void csilk_db_init(void);
2257
2272csilk_db_pool_t* csilk_db_pool_new(const char* driver_name, const char* dsn);
2273
2282
2293cJSON* csilk_db_query_json(csilk_db_pool_t* pool, const char* sql);
2294
2304int csilk_db_exec(csilk_db_pool_t* pool, const char* sql);
2305
2319cJSON* csilk_db_query_param_json(csilk_db_pool_t* pool, const char* sql, const char** params);
2320
2330void csilk_metrics_middleware(csilk_ctx_t* c, const char* arg);
2331
2340void csilk_metrics_handler(csilk_ctx_t* c);
2341
2357typedef struct csilk_mq_s csilk_mq_t;
2358
2362csilk_mq_t* csilk_ctx_get_mq(csilk_ctx_t* c);
2363
2373csilk_mq_t* csilk_server_get_mq(csilk_server_t* server);
2374
2378csilk_router_t* csilk_server_get_router(csilk_server_t* server);
2379
2387typedef struct csilk_mq_ctx_s csilk_mq_ctx_t;
2388
2394typedef void (*csilk_mq_handler_t)(csilk_mq_ctx_t* ctx);
2395
2404void csilk_mq_next(csilk_mq_ctx_t* ctx);
2405
2413void csilk_mq_abort(csilk_mq_ctx_t* ctx);
2414
2422typedef void (*csilk_mq_worker_t)(const char* topic, const void* payload, size_t len);
2423
2436void csilk_mq_offload(csilk_mq_ctx_t* ctx, csilk_mq_worker_t worker);
2437
2444const char* csilk_mq_get_topic(csilk_mq_ctx_t* ctx);
2445
2455const void* csilk_mq_get_payload(csilk_mq_ctx_t* ctx, size_t* len);
2456
2467void csilk_mq_use(csilk_mq_t* mq, const char* topic, csilk_mq_handler_t middleware);
2468
2479void csilk_mq_subscribe(csilk_mq_t* mq, const char* topic, csilk_mq_handler_t subscriber);
2480
2495int csilk_mq_publish(csilk_mq_t* mq, const char* topic, const void* payload, size_t len);
2496
2508int csilk_mq_set_persistence(csilk_mq_t* mq, const char* wal_path);
2509
2510#endif /* CSILK_H */
Unified pluggable interface for AI/LLM service integration.
Arena allocator for request-scoped memory.
Definition arena.c:101
Pluggable cryptographic primitive driver interface.
int flags
Definition csilk.h:1260
int status
Definition csilk.h:195
int port
Definition csilk.h:1001
csilk_header_map_t form_params
Definition csilk.h:183
unsigned int request_timeout_ms
Definition csilk.h:961
int use_colors
Definition csilk.h:763
int tls_verify_peer
Definition csilk.h:990
int max_connections
Definition csilk.h:971
size_t max_file_size
Definition csilk.h:761
void csilk_group_add_route_extended(csilk_group_t *group, const char *method, const char *path, csilk_handler_t handler, const char *input_type, const char *output_type, const char *summary, const char *description)
Add a route with OpenAPI/reflection metadata to a group.
Definition group.c:303
char * method
Definition csilk.h:175
@ CSILK_HOOK_SERVER_START
Definition csilk.h:2167
char * body
Definition csilk.h:178
char * tls_cert_file
Definition csilk.h:984
int worker_threads
Definition csilk.h:978
unsigned int idle_timeout_ms
Definition csilk.h:954
csilk_server_config_t server
Definition csilk.h:1002
const char * file_path
Definition csilk.h:760
void csilk_ws_handshake(csilk_ctx_t *c)
Perform the WebSocket upgrade handshake (HTTP Upgrade request).
Definition websocket.c:57
char * value
Definition csilk.h:134
size_t body_len
Definition csilk.h:179
csilk_header_map_t query_params
Definition csilk.h:182
unsigned int write_timeout_ms
Definition csilk.h:959
void csilk_group_add_handlers(csilk_group_t *group, const char *method, const char *path, csilk_handler_t *handlers, size_t count)
Add a route with an explicit array of handlers.
Definition group.c:441
void(* csilk_multipart_handler_t)(csilk_multipart_part_t *part)
Callback invoked for each part during multipart parsing.
Definition csilk.h:2134
const char * body
Definition csilk.h:196
csilk_log_config_t logger
Definition csilk.h:1003
const char * source
Definition csilk.h:1266
csilk_header_map_t headers
Definition csilk.h:180
size_t max_body_size
Definition csilk.h:964
csilk_router_node_t * root
Definition csilk.h:1420
void csilk_serve_swagger_ui(csilk_ctx_t *c)
Serve the embedded Swagger UI page.
Definition swagger.c:709
struct csilk_header_s * next
Definition csilk.h:138
const char * field
Definition csilk.h:1259
size_t max_url_size
Definition csilk.h:968
char * path
Definition csilk.h:176
int body_is_managed
Definition csilk.h:200
int tcp_keepalive
Definition csilk.h:976
void csilk_sse_init(csilk_ctx_t *c)
Initialise a Server-Sent Events connection.
Definition sse.c:55
size_t body_len
Definition csilk.h:198
void csilk_group_add_route_extended_perm(csilk_group_t *group, const char *method, const char *path, csilk_handler_t handler, const char *input_type, const char *output_type, const char *summary, const char *description, const char *perm_required, const char *perm_resource)
Add a route with OpenAPI/reflection metadata to a group.
Definition group.c:363
char * key
Definition csilk.h:132
size_t max_header_size
Definition csilk.h:966
cJSON * csilk_router_collect_routes(csilk_router_t *r)
Collect all registered routes from the router tree as a cJSON array.
Definition router.c:281
csilk_log_level_t level
Definition csilk.h:758
size_t key_len
Definition csilk.h:136
uint8_t * data
Definition csilk.h:1989
csilk_server_t * csilk_ctx_get_server(csilk_ctx_t *c)
Get the server instance associated with the current context.
Definition context.c:635
csilk_ctx_t * ctx
Definition csilk.h:1992
char * tls_ca_file
Definition csilk.h:988
const char * allow_origin
Definition csilk.h:887
const char * allow_methods
Definition csilk.h:889
csilk_log_level_t
Log severity levels.
Definition csilk.h:871
size_t value_len
Definition csilk.h:137
int allow_credentials
Definition csilk.h:893
char * key
Definition csilk.h:214
void csilk_multipart_parse(csilk_ctx_t *c, csilk_multipart_handler_t handler)
Parse a multipart/form-data request body.
Definition multipart.c:45
cJSON * csilk_jwt_verify(csilk_ctx_t *c, const char *token, const char *secret)
Verify a JWT token and extract its payload.
Definition jwt.c:144
int enable_tls
Definition csilk.h:982
size_t data_len
Definition csilk.h:1991
unsigned int read_timeout_ms
Definition csilk.h:957
const char * allow_headers
Definition csilk.h:891
int tcp_nodelay
Definition csilk.h:974
size_t max_headers_count
Definition csilk.h:969
char * tls_key_file
Definition csilk.h:986
int min
Definition csilk.h:1262
int json_format
Definition csilk.h:765
int max
Definition csilk.h:1264
csilk_header_map_t headers
Definition csilk.h:199
char * value
Definition csilk.h:215
int max_age
Definition csilk.h:895
int listen_backlog
Definition csilk.h:973
Top-level application configuration.
Definition csilk.h:1000
CORS middleware configuration.
Definition csilk.h:886
A fixed-size chained hash table for HTTP headers.
Definition csilk.h:162
A single HTTP header stored as a node in a chained hash table.
Definition csilk.h:131
Logger initialisation configuration.
Definition csilk.h:757
A single part parsed from a multipart/form-data request body.
Definition csilk.h:1982
A single URL path parameter extracted from a route pattern.
Definition csilk.h:213
Parsed HTTP request.
Definition csilk.h:174
Mutable HTTP response.
Definition csilk.h:194
The main HTTP router.
Definition csilk.h:1419
Low-level server configuration options.
Definition csilk.h:953
A single validation rule for request parameter checking.
Definition csilk.h:1258
void csilk_set_on_ws_send(csilk_ctx_t *c, void(*callback)(csilk_ctx_t *c, const uint8_t *payload, size_t len, int opcode))
Set a callback for outgoing WebSocket frames (for testing).
Definition context.c:835
void csilk_set_on_ws_message(csilk_ctx_t *c, void(*callback)(csilk_ctx_t *c, const uint8_t *payload, size_t len, int opcode))
Register a callback for incoming WebSocket messages.
Definition context.c:825
void csilk_request_id_middleware(csilk_ctx_t *c)
Request ID middleware. Generates a unique ID for each request and sets X-Request-Id header.
Definition request_id.c:31
void csilk_serve_openapi(csilk_ctx_t *c, csilk_router_t *r, const char *title, const char *version, const char *description)
Serve the OpenAPI JSON specification as the response.
Definition swagger.c:625
csilk_handler_t * csilk_router_match(csilk_router_t *r, const char *method, const char *path)
Match a raw method+path to handlers (standalone, no context).
Definition router.c:775
void(* csilk_server_hook_handler_t)(csilk_server_t *s)
Callback signature for server-level hooks.
Definition csilk.h:2056
void csilk_mq_subscribe(csilk_mq_t *mq, const char *topic, csilk_mq_handler_t subscriber)
Register a subscriber for a topic.
Definition mq.c:486
char * csilk_arena_strndup(csilk_arena_t *arena, const char *s, size_t n)
Duplicate n bytes of a string using the arena allocator.
Definition arena.c:208
void csilk_string(csilk_ctx_t *c, int status, const char *msg)
Set a plain-text response body and status code.
Definition context.c:214
void csilk_mq_next(csilk_mq_ctx_t *ctx)
Pass control to the next middleware or subscriber in the MQ chain.
Definition mq.c:60
void _csilk_log_structured(csilk_log_level_t lv, const char *file, int line, const char *func, cJSON *extra, const char *fmt,...)
Log a structured JSON message with extra key-value fields.
Definition logger.c:411
void csilk_server_set_config(csilk_server_t *server, const csilk_server_config_t *config)
Apply server configuration options.
Definition server.c:1730
void csilk_mq_use(csilk_mq_t *mq, const char *topic, csilk_mq_handler_t middleware)
Register MQ middleware for a topic.
Definition mq.c:449
char * csilk_jwt_generate(csilk_ctx_t *c, cJSON *payload, const char *secret)
Generate a signed JWT token (HS256).
Definition jwt.c:45
cJSON * csilk_bind_json(csilk_ctx_t *c)
Bind the request body (JSON) to a cJSON object.
Definition context.c:1048
void csilk_status(csilk_ctx_t *c, int status)
Set the HTTP response status code.
Definition context.c:196
void csilk_ws_send(csilk_ctx_t *c, const uint8_t *payload, size_t len, int opcode)
Send a WebSocket data frame.
Definition websocket.c:119
const char * csilk_get_cookie(csilk_ctx_t *c, const char *name)
Get a cookie value by name from the Cookie request header.
Definition context.c:1110
void csilk_server_set_crypto_driver(csilk_server_t *server, csilk_crypto_driver_t *driver)
Set the global crypto driver for the server.
Definition server.c:1802
void(* csilk_mq_worker_t)(const char *topic, const void *payload, size_t len)
Signature for a background MQ worker function.
Definition csilk.h:2422
void csilk_server_set_storage_driver(csilk_server_t *server, csilk_storage_driver_t *driver)
Replace the context key-value storage driver.
Definition server.c:1787
void csilk_sse_close(csilk_ctx_t *c)
Close the SSE connection.
Definition sse.c:174
csilk_hook_type_t
Lifecycle hook types for the server and individual requests.
Definition csilk.h:2034
@ CSILK_HOOK_COUNT
Definition csilk.h:2047
@ CSILK_HOOK_CONN_CLOSE
Definition csilk.h:2041
@ CSILK_HOOK_REQUEST_BEGIN
Definition csilk.h:2043
@ CSILK_HOOK_CONN_OPEN
Definition csilk.h:2039
@ CSILK_HOOK_SERVER_STOP
Definition csilk.h:2037
@ CSILK_HOOK_REQUEST_END
Definition csilk.h:2045
char * csilk_arena_strdup(csilk_arena_t *arena, const char *s)
Duplicate a NUL-terminated string using the arena allocator.
Definition arena.c:184
void csilk_server_free(csilk_server_t *server)
Destroy the server and release all resources.
Definition server.c:1647
void csilk_health_check_handler(csilk_ctx_t *c)
Built-in Health Check handler. Returns a simple JSON response {"status": "up"}.
Definition request_id.c:67
void csilk_log_set_request_id(const char *request_id)
Set the Request ID for the current thread (for log correlation).
Definition logger.c:476
void csilk_split_url(const char *url, char **path, char **query)
Split a URL into path and query-string components.
Definition url.c:98
void csilk_jwt_middleware(csilk_ctx_t *c, const char *secret)
JWT authentication middleware.
Definition jwt.c:235
csilk_group_t * csilk_group_group(csilk_group_t *parent, const char *prefix)
Create a nested sub-group within an existing group.
Definition group.c:160
void csilk_json_reflect(csilk_ctx_t *c, int status, const char *type_name, const void *ptr)
Serialise a reflected struct as a JSON response.
Definition context.c:1333
void csilk_server_stop(csilk_server_t *server)
Request a graceful server shutdown.
Definition server.c:1699
void csilk_arena_reset(csilk_arena_t *arena)
Reset the arena without freeing its chunks.
Definition arena.c:253
void csilk_session_set(csilk_ctx_t *c, const char *key, void *value)
Store a value in the session.
Definition session.c:332
void csilk_config_free(csilk_config_t *config)
Free all heap-allocated strings inside a configuration.
Definition config.c:344
void csilk_group_add_route(csilk_group_t *group, const char *method, const char *path, csilk_handler_t handler)
Add a route to the group.
Definition group.c:276
void csilk_group_free(csilk_group_t *group)
Destroy a route group and release its resources.
Definition group.c:491
int csilk_mq_publish(csilk_mq_t *mq, const char *topic, const void *payload, size_t len)
Publish a message to a topic.
Definition mq.c:781
void csilk_ws_leave_room(csilk_ctx_t *c, const char *room_name)
Remove a WebSocket client from a room.
Definition ws_room.c:136
const char * csilk_get_query(csilk_ctx_t *c, const char *key)
Get a query-string parameter by key.
Definition context.c:339
void csilk_set(csilk_ctx_t *c, const char *key, void *value)
Store an opaque value in the request context.
Definition context.c:968
void csilk_set_request_header(csilk_ctx_t *c, const char *key, const char *value)
Set (or overwrite) a request header.
Definition context.c:353
const char * csilk_validate(csilk_ctx_t *c, const csilk_valid_rule_t *rules)
Validate request parameters against a set of rules.
Definition validate.c:119
void csilk_session_init(void)
Initialise the session subsystem (call once at startup).
Definition session.c:251
cJSON * csilk_db_query_param_json(csilk_db_pool_t *pool, const char *sql, const char **params)
Execute a parameterised SELECT query with ? placeholders.
Definition db.c:261
void * csilk_arena_alloc(csilk_arena_t *arena, size_t size)
Allocate zero-initialised memory from an arena.
Definition arena.c:145
csilk_arena_t * csilk_arena_new(size_t default_chunk_size)
Create a new arena allocator.
Definition arena.c:121
int csilk_bind_reflect(csilk_ctx_t *c, const char *type_name, void *ptr)
Parse the JSON request body into a struct registered via reflection.
Definition context.c:1305
csilk_db_pool_t * csilk_db_pool_new(const char *driver_name, const char *dsn)
Create a new database connection pool.
Definition db.c:142
void csilk_abort(csilk_ctx_t *c)
Immediately abort the handler chain.
Definition context.c:185
const char * csilk_get_header(csilk_ctx_t *c, const char *key)
Get a request header value by name (case-insensitive).
Definition context.c:306
const char * csilk_get_method(csilk_ctx_t *c)
Get the HTTP method of the current request.
Definition context.c:453
void csilk_response_write(csilk_ctx_t *c, const uint8_t *data, size_t len)
Write a chunk to the response stream (chunked transfer encoding).
Definition context.c:1702
void csilk_ws_broadcast_room(csilk_ctx_t *c, const char *room_name, const char *message)
Broadcast a message to all WebSockets in a room via MQ.
Definition ws_room.c:156
void csilk_set_response_body(csilk_ctx_t *c, const char *body, size_t len, int managed)
Overwrite the response body from middleware.
Definition context.c:787
csilk_arena_t * csilk_get_arena(csilk_ctx_t *c)
Get the arena allocator associated with the request context.
Definition context.c:595
const char * csilk_get_body(csilk_ctx_t *c, size_t *out_len)
Get the raw request body and its length.
Definition context.c:481
const char * csilk_get_form_field(csilk_ctx_t *c, const char *key)
Get a form-urlencoded field value by key.
Definition context.c:1494
void csilk_parse_form_urlencoded(csilk_ctx_t *c)
Parse the request body as application/x-www-form-urlencoded.
Definition context.c:1427
int csilk_router_match_ctx(csilk_router_t *r, csilk_ctx_t *c)
Match the current request against the router and update the context.
Definition router.c:796
void * csilk_get(csilk_ctx_t *c, const char *key)
Retrieve an opaque value from the request context.
Definition context.c:1020
void csilk_json(csilk_ctx_t *c, int status, cJSON *json)
Send a JSON response (takes ownership of the cJSON object).
Definition context.c:1244
void csilk_db_pool_free(csilk_db_pool_t *pool)
Free a database pool and disconnect.
Definition db.c:180
void csilk_set_async(csilk_ctx_t *c, int is_async)
Enable or disable asynchronous response mode.
Definition context.c:623
int csilk_log_is_json(void)
Check whether the logger is in JSON format mode.
Definition logger.c:465
void csilk_router_add_perm(csilk_router_t *r, const char *method, const char *path, csilk_handler_t *handlers, size_t handler_count, const char *perm_required, const char *perm_resource)
Register a route with permission metadata.
Definition router.c:513
cJSON * csilk_generate_openapi_json(csilk_router_t *router, const char *title, const char *version, const char *description)
Generate an OpenAPI 3.0 specification JSON from the router.
Definition swagger.c:311
int csilk_server_use(csilk_server_t *server, csilk_handler_t handler)
Register global middleware.
Definition server.c:1610
void(* csilk_handler_t)(csilk_ctx_t *c)
Function pointer for route handlers and middleware.
Definition csilk.h:120
int csilk_load_config(const char *yaml_path, csilk_config_t *config)
Load and parse a YAML configuration file.
Definition config.c:75
void csilk_redirect(csilk_ctx_t *c, int status, const char *location)
Send an HTTP redirect response with a custom status code.
Definition context.c:930
const char * csilk_get_response_header(csilk_ctx_t *c, const char *key)
Get a response header value by name (case-insensitive).
Definition context.c:322
const char * csilk_get_request_id(csilk_ctx_t *c)
Get the unique identifier for the current request.
Definition context.c:579
csilk_server_t * csilk_server_new(csilk_router_t *router)
Create a new server instance.
Definition server.c:1469
size_t csilk_get_body_len(csilk_ctx_t *c)
Get the length of the raw request body.
Definition context.c:495
void(* csilk_ctx_hook_handler_t)(csilk_ctx_t *c)
Callback signature for request/connection-level hooks.
Definition csilk.h:2063
void csilk_mq_offload(csilk_mq_ctx_t *ctx, csilk_mq_worker_t worker)
Offload message processing to a background thread.
Definition mq.c:171
const char * csilk_get_client_ip(csilk_ctx_t *c)
Get the client's IP address.
Definition server.c:1435
void csilk_redirect_simple(csilk_ctx_t *c, const char *url)
Send a simple 302 Found redirect.
Definition context.c:950
void csilk_db_init(void)
Initialise the database subsystem.
Definition db.c:335
csilk_mq_t * csilk_ctx_get_mq(csilk_ctx_t *c)
Get the internal MQ instance from the context.
Definition context.c:645
int csilk_log_init(csilk_log_config_t config)
Initialize the global logger with config.
Definition logger.c:313
void csilk_next(csilk_ctx_t *c)
Pass control to the next handler in the middleware/handler chain.
Definition context.c:165
void csilk_sse_send(csilk_ctx_t *c, const char *event, const char *data)
Send an SSE event (or comment) to the client.
Definition sse.c:122
void csilk_auth_middleware(csilk_ctx_t *c, csilk_auth_validator_t validator)
Simple token-based authentication middleware.
Definition auth.c:32
int csilk_server_set_max_connections(csilk_server_t *server, int max)
Set the maximum number of concurrent connections and return the previous limit.
Definition server.c:1768
cJSON * csilk_db_query_json(csilk_db_pool_t *pool, const char *sql)
Execute a SELECT query and return the result as a JSON array.
Definition db.c:194
csilk_group_t * csilk_group_new(csilk_router_t *router, const char *prefix)
Create a new route group with a URL prefix.
Definition group.c:132
void csilk_metrics_handler(csilk_ctx_t *c)
Prometheus /metrics endpoint handler.
Definition metrics.c:304
void csilk_parse_query(csilk_ctx_t *c, const char *query_string)
Parse a raw query string and populate the query_params map.
Definition context.c:1370
void csilk_metrics_middleware(csilk_ctx_t *c, const char *arg)
Prometheus metrics middleware.
Definition metrics.c:212
void csilk_ws_join_room(csilk_ctx_t *c, const char *room_name)
Join a WebSocket client to a room.
Definition ws_room.c:88
void csilk_response_end(csilk_ctx_t *c)
Finalise a chunked streaming response.
Definition context.c:1734
void * csilk_session_get(csilk_ctx_t *c, const char *key)
Retrieve a value from the session.
Definition session.c:376
void csilk_set_header(csilk_ctx_t *c, const char *key, const char *value)
Set (or overwrite) a response header.
Definition context.c:368
void csilk_router_add_extended(csilk_router_t *r, const char *method, const char *path, csilk_handler_t *handlers, size_t handler_count, const char *path_pattern, const char *input_type, const char *output_type, const char *summary, const char *description)
Register a route with full OpenAPI/reflection metadata.
Definition router.c:452
void csilk_json_error(csilk_ctx_t *c, int status, const char *message)
Send a JSON-formatted error response.
Definition context.c:1277
void csilk_log_close()
Close the global logger.
Definition logger.c:515
cJSON * csilk_bind_json_err(csilk_ctx_t *c, const char **error)
Bind request body to cJSON with a descriptive error message.
Definition context.c:1068
void csilk_ws_close(csilk_ctx_t *c, uint16_t status_code, const char *reason)
Send a WebSocket close frame.
Definition websocket.c:221
void _csilk_log_internal(csilk_log_level_t lv, const char *file, int line, const char *func, const char *fmt,...)
Internal log function (use macros instead).
Definition logger.c:361
void csilk_server_set_not_found_handler(csilk_server_t *server, csilk_handler_t handler)
Set a custom handler for 404 (route-not-found) responses.
Definition server.c:1568
int(* csilk_auth_validator_t)(const char *token)
Authentication validator callback.
Definition csilk.h:1086
csilk_log_level_t
Log severity levels.
Definition csilk.h:739
@ CSILK_LOG_FATAL
Definition csilk.h:748
@ CSILK_LOG_TRACE
Definition csilk.h:740
@ CSILK_LOG_INFO
Definition csilk.h:743
@ CSILK_LOG_ERROR
Definition csilk.h:746
@ CSILK_LOG_WARN
Definition csilk.h:744
@ CSILK_LOG_DEBUG
Definition csilk.h:742
int csilk_server_run(csilk_server_t *server, int port)
Start the server and enter the libuv event loop.
Definition server.c:2137
const char * csilk_get_path(csilk_ctx_t *c)
Get the decoded URL path of the current request.
Definition context.c:468
csilk_router_t * csilk_router_new(void)
Create a new empty router.
Definition router.c:204
void csilk_arena_free(csilk_arena_t *arena)
Free all memory chunks owned by the arena.
Definition arena.c:229
void csilk_static(csilk_ctx_t *c, const char *root_dir)
Serve static files from a local directory.
Definition static.c:287
void csilk_panic(csilk_ctx_t *c)
Trigger a panic (caught by recovery middleware).
Definition recovery.c:70
const char * csilk_mq_get_topic(csilk_mq_ctx_t *ctx)
Get the topic of the current message.
Definition mq.c:91
csilk_router_t * csilk_server_get_router(csilk_server_t *server)
Get the router instance attached to a server.
Definition server.c:2502
const void * csilk_mq_get_payload(csilk_mq_ctx_t *ctx, size_t *len)
Get the payload of the current message.
Definition mq.c:105
void(* csilk_mq_handler_t)(csilk_mq_ctx_t *ctx)
MQ handler signature for middleware and subscribers.
Definition csilk.h:2394
int csilk_is_async(csilk_ctx_t *c)
Check whether asynchronous response mode is enabled.
Definition context.c:657
void csilk_server_set_cipher_driver(csilk_server_t *server, csilk_cipher_driver_t *driver)
Set the global cipher algorithm driver for the server.
Definition server.c:1810
int csilk_db_exec(csilk_db_pool_t *pool, const char *sql)
Execute a statement that returns no result rows.
Definition db.c:219
int csilk_mq_set_persistence(csilk_mq_t *mq, const char *wal_path)
Enable Write-Ahead Log (WAL) persistence for the MQ.
Definition mq.c:368
int csilk_is_aborted(csilk_ctx_t *c)
Check whether the handler chain has been aborted.
Definition context.c:807
void csilk_session_destroy(csilk_ctx_t *c)
Destroy the session and clear the session cookie.
Definition session.c:408
void csilk_set_cookie(csilk_ctx_t *c, const char *name, const char *value, int max_age, const char *path, const char *domain, int secure, int http_only)
Set a cookie in the Set-Cookie response header.
Definition context.c:1176
void csilk_router_add(csilk_router_t *r, const char *method, const char *path, csilk_handler_t *handlers, size_t handler_count)
Register a route with one or more handlers.
Definition router.c:489
void csilk_recovery_handler(csilk_ctx_t *c)
Panic-recovery middleware.
Definition recovery.c:36
void csilk_gzip_middleware(csilk_ctx_t *c)
Gzip response compression middleware.
Definition gzip.c:151
void csilk_mq_abort(csilk_mq_ctx_t *ctx)
Abort the MQ middleware/subscriber chain.
Definition mq.c:78
void csilk_session_start(csilk_ctx_t *c)
Start or resume a session for the current request.
Definition session.c:274
void csilk_csrf_middleware(csilk_ctx_t *c)
Stateless CSRF protection middleware.
Definition csrf.c:38
int csilk_config_validate(const csilk_config_t *config, const char **error_msg)
Validate configuration values for semantic correctness.
Definition config.c:432
void csilk_group_use(csilk_group_t *group, csilk_handler_t handler)
Add middleware to a group.
Definition group.c:195
const char * csilk_get_param(csilk_ctx_t *c, const char *key)
Get a URL path parameter by key.
Definition context.c:244
int csilk_csrf_generate_token(char *buf, size_t buf_size)
Generate a cryptographically random CSRF token.
Definition csrf.c:100
csilk_mq_t * csilk_server_get_mq(csilk_server_t *server)
Get the Message Queue instance attached to a server.
Definition server.c:2496
void csilk_server_add_hook(csilk_server_t *s, csilk_hook_type_t type, void *handler)
Register a lifecycle hook callback.
Definition server.c:1832
void csilk_file(csilk_ctx_t *c, const char *file_path)
Serve a specific file from the local filesystem.
Definition static.c:307
void csilk_cors_middleware(csilk_ctx_t *c, const csilk_cors_config_t *config)
CORS middleware — handles preflight and adds CORS headers.
Definition cors.c:34
int csilk_get_status(csilk_ctx_t *c)
Get the current response status code.
Definition context.c:606
void csilk_router_add_extended_perm(csilk_router_t *r, const char *method, const char *path, csilk_handler_t *handlers, size_t handler_count, const char *path_pattern, const char *input_type, const char *output_type, const char *summary, const char *description, const char *perm_required, const char *perm_resource)
Register a route with full metadata including permissions.
Definition router.c:553
void csilk_router_free(csilk_router_t *r)
Destroy the router and release all its resources.
Definition router.c:221
int csilk_is_sse(csilk_ctx_t *c)
Check whether the connection is in Server-Sent Events mode.
Definition context.c:529
#define CSILK_HEADER_BUCKETS
Number of buckets in the header chained hash table.
Definition csilk.h:150
void csilk_ctx_cleanup(csilk_ctx_t *c)
Release all memory and resources associated with a request context.
Definition context.c:382
int csilk_is_websocket(csilk_ctx_t *c)
Check whether the connection has been upgraded to WebSocket.
Definition context.c:506
void csilk_logger_handler(csilk_ctx_t *c)
Logging middleware handler. Logs request method, path, and processing time.
Definition logger.c:79
void csilk_add_header(csilk_ctx_t *c, const char *key, const char *value)
Append a response header, preserving any existing value(s).
Definition context.c:1153
void csilk_server_set_spa_fallback(csilk_server_t *server, const char *doc_root)
Enable single-page application (SPA) fallback mode.
Definition server.c:1588
cJSON * csilk_log_make_kv(const char *key,...)
Create a simple key-value cJSON object for structured logging.
Definition logger.c:491
const char * csilk_get_response_body(csilk_ctx_t *c, size_t *out_len)
Get the current response body and its length.
Definition context.c:759
void csilk_rate_limit_middleware(csilk_ctx_t *c, int limit)
Simple per-IP rate-limiting middleware.
Definition ratelimit.c:142
A (currently single-connection) database pool.
Definition db.h:62
csilk_router_t * router
Definition group.c:47
char * prefix
Definition group.c:43
csilk_group_t * parent
Definition group.c:56
Route group structure.
Definition group.c:42
csilk_mq_t * mq
Definition internal.h:512
Internal: Per-message MQ context passed to middleware and subscribers.
Definition internal.h:511
Internal: The Message Queue instance.
Definition internal.h:471
Pluggable permission/access-control (ACL) driver interface.
static csilk_perm_rule_t rules[MAX_RULES]
Global rule table. Populated at startup by csilk_perm_simple_allow().
Definition perm_simple.c:32
Node in the router trie — represents a URL path segment.
Definition router.c:79
Main Server structure — represents the core HTTP server instance.
Definition server_internal.h:54
Virtual function table implemented by each cipher backend.
Definition cipher.h:50
Pluggable cryptographic primitive driver.
Definition csilk.h:2090
Main Request Context — holds all state for the current HTTP request/response cycle.
Definition context_internal.h:107
Pluggable storage driver for context key-value pairs.
Definition csilk.h:95