KEEL 1.0.0
Minimal C11 HTTP client/server library built on epoll/kqueue/io_uring/poll
Loading...
Searching...
No Matches
request.h
Go to the documentation of this file.
1#ifndef KEEL_REQUEST_H
2#define KEEL_REQUEST_H
3
4#include <stddef.h>
5#include <string.h>
6#include <strings.h>
7
9#define KL_MAX_HEADERS 64
10
13
14typedef struct {
15 const char *name;
16 size_t name_len;
17 const char *value;
18 size_t value_len;
19} KlParam;
20
22#define KL_MAX_PARAMS 16
23
24typedef struct KlRequest KlRequest;
25
26struct KlRequest {
27 const char *method;
28 size_t method_len;
29 const char *path;
30 size_t path_len;
31 const char *query;
32 size_t query_len;
37 struct {
38 const char *name; size_t name_len;
39 const char *value; size_t value_len;
44 int chunked;
46 void *ctx;
52};
53
55typedef struct KlConn KlConn;
56
58static inline KlConn *kl_request_conn(const KlRequest *req) {
59 return (KlConn *)req->_server_ctx;
60}
61
64static inline const char *kl_request_header(const KlRequest *req,
65 const char *name) {
66 size_t nlen = strlen(name);
67 for (int i = 0; i < req->num_headers; i++) {
68 if (req->headers[i].name_len == nlen &&
69 strncasecmp(req->headers[i].name, name, nlen) == 0) {
70 return req->headers[i].value;
71 }
72 }
73 return NULL;
74}
75
78static inline const char *kl_request_header_len(const KlRequest *req,
79 const char *name,
80 size_t *out_len) {
81 size_t nlen = strlen(name);
82 for (int i = 0; i < req->num_headers; i++) {
83 if (req->headers[i].name_len == nlen &&
84 strncasecmp(req->headers[i].name, name, nlen) == 0) {
85 if (out_len) *out_len = req->headers[i].value_len;
86 return req->headers[i].value;
87 }
88 }
89 return NULL;
90}
91
94static inline const char *kl_request_param(const KlRequest *req,
95 const char *name,
96 size_t *out_len) {
97 size_t nlen = strlen(name);
98 for (int i = 0; i < req->num_params; i++) {
99 if (req->params[i].name_len == nlen &&
100 memcmp(req->params[i].name, name, nlen) == 0) {
101 if (out_len) *out_len = req->params[i].value_len;
102 return req->params[i].value;
103 }
104 }
105 return NULL;
106}
107
108#endif
static const char * kl_request_param(const KlRequest *req, const char *name, size_t *out_len)
Find route parameter by name.
Definition request.h:94
#define KL_MAX_HEADERS
Maximum number of request headers.
Definition request.h:9
#define KL_MAX_PARAMS
Maximum number of route parameters.
Definition request.h:22
static const char * kl_request_header(const KlRequest *req, const char *name)
Find header by name (case-insensitive).
Definition request.h:64
static const char * kl_request_header_len(const KlRequest *req, const char *name, size_t *out_len)
Find header by name (case-insensitive).
Definition request.h:78
static KlConn * kl_request_conn(const KlRequest *req)
Typed accessor for the connection handle (preferred over raw _server_ctx).
Definition request.h:58
Definition body_reader.h:21
Definition connection.h:34
KlRequest req
Definition connection.h:44
Definition request.h:14
const char * name
Definition request.h:15
size_t value_len
Definition request.h:18
const char * value
Definition request.h:17
size_t name_len
Definition request.h:16
Definition request.h:26
size_t query_len
Definition request.h:32
const char * path
Definition request.h:29
size_t method_len
Definition request.h:28
int chunked
Definition request.h:44
int version_minor
Definition request.h:34
void * _server_ctx
Definition request.h:51
size_t name_len
Definition request.h:38
int version_major
Definition request.h:33
const char * query
Definition request.h:31
KlBodyReader * body_reader
Definition request.h:45
size_t content_length
Definition request.h:43
const char * name
Definition request.h:38
int keep_alive
Definition request.h:35
size_t value_len
Definition request.h:39
const char * method
Definition request.h:27
KlParam params[KL_MAX_PARAMS]
Definition request.h:48
struct KlRequest::@0 headers[KL_MAX_HEADERS]
int num_headers
Definition request.h:41
int num_params
Definition request.h:49
const char * value
Definition request.h:39
void * ctx
Definition request.h:46
size_t path_len
Definition request.h:30