32#define CSILK_VERSION "0.2.3"
39#define CSILK_MAX_PARAMS 20
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
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);
131typedef struct csilk_header_s {
149#ifndef CSILK_HEADER_BUCKETS
150#define CSILK_HEADER_BUCKETS 64
162typedef struct csilk_header_map_s {
341 void (*callback)(csilk_ctx_t* c,
const uint8_t* payload,
size_t len,
int opcode));
346 void (*callback)(csilk_ctx_t* c,
const uint8_t* payload,
size_t len,
int opcode));
442void csilk_redirect(csilk_ctx_t* c,
int status,
const char* location);
468void csilk_set(csilk_ctx_t* c,
const char* key,
void* value);
479void*
csilk_get(csilk_ctx_t* c,
const char* key);
523void csilk_string(csilk_ctx_t* c,
int status,
const char* msg);
782 csilk_log_level_t lv,
const char* file,
int line,
const char* func,
const char* fmt, ...);
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__)
860#define CSILK_LOG_STRUCT(level, extra, ...) \
861 _csilk_log_structured(level, __FILE__, __LINE__, __func__, extra, __VA_ARGS__)
953typedef struct csilk_server_config_s {
1010 int requests_per_minute;
1021 int enable_recovery;
1116void csilk_static(csilk_ctx_t* c,
const char* root_dir);
1127void csilk_file(csilk_ctx_t* c,
const char* file_path);
1242#define CSILK_VALID_REQUIRED (1 << 0)
1243#define CSILK_VALID_INT (1 << 1)
1244#define CSILK_VALID_STRING \
1247#define CSILK_VALID_EMAIL \
1258typedef struct csilk_valid_rule_s {
1298void csilk_json(csilk_ctx_t* c,
int status, cJSON* json);
1338void csilk_json_reflect(csilk_ctx_t* c,
int status,
const char* type_name,
const void* ptr);
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)
1419typedef struct csilk_router_s {
1455 size_t handler_count);
1529 const char* version,
1530 const char* description);
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);
1575 size_t handler_count,
1576 const char* perm_required,
1577 const char* perm_resource);
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);
1611#define CSILK_ROUTE( \
1612 r, method, path, handlers, handler_count, input_type, output_type, summary, desc) \
1613 csilk_router_add_extended(r, \
1644 const char* version,
1645 const char* description);
1736 const char* input_type,
1737 const char* output_type,
1738 const char* summary,
1739 const char* description);
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);
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)
1839void csilk_ws_send(csilk_ctx_t* c,
const uint8_t* payload,
size_t len,
int opcode);
1853void csilk_ws_close(csilk_ctx_t* c, uint16_t status_code,
const char* reason);
1905void csilk_sse_send(csilk_ctx_t* c,
const char* event,
const char* data);
1944cJSON*
csilk_jwt_verify(csilk_ctx_t* c,
const char* token,
const char* secret);
1982typedef struct csilk_multipart_part_s {
1987 char content_type[64];
2095 void (*sha256)(
const uint8_t* data,
size_t len, uint8_t out[32]);
2102 void (*hmac_sha256)(
const uint8_t* key,
2104 const uint8_t* data,
2112 void (*generate_uuid)(
char buf[37]);
2495int csilk_mq_publish(csilk_mq_t*
mq,
const char* topic,
const void* payload,
size_t len);
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
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