5 #include <evhtp/config.h> 11 #ifndef EVHTP_DISABLE_EVTHR 12 #include <evhtp/thread.h> 15 #include <evhtp/parser.h> 17 #ifndef EVHTP_DISABLE_REGEX 18 #include <onigposix.h> 21 #include <sys/queue.h> 22 #include <event2/event.h> 23 #include <event2/listener.h> 24 #include <event2/buffer.h> 25 #include <event2/bufferevent.h> 27 #ifndef EVHTP_DISABLE_SSL 28 #include <event2/bufferevent_ssl.h> 29 #include <openssl/ssl.h> 30 #include <openssl/err.h> 31 #include <openssl/rand.h> 39 struct evhtp_callbacks_s;
41 #ifndef EVHTP_DISABLE_SSL 47 #if OPENSSL_VERSION_NUMBER < 0x10100000L 65 #ifdef EVHTP_DISABLE_EVTHR 66 typedef struct event_base evbase_t;
68 typedef void evthr_pool_t;
93 #define evhtp_header_s evhtp_kv_s 94 #define evhtp_headers_s evhtp_kvs_s 95 #define evhtp_query_s evhtp_kvs_s 97 #define evhtp_header_t evhtp_kv_t 98 #define evhtp_headers_t evhtp_kvs_t 99 #define evhtp_query_t evhtp_kvs_t 133 #ifndef EVHTP_DISABLE_REGEX 158 typedef void (*
evhtp_hook_err_cb)(evhtp_request_t * req, evhtp_error_flags errtype,
void * arg);
183 #ifndef EVHTP_DISABLE_SSL 186 typedef EVP_PKEY * (* evhtp_ssl_decrypt_cb)(
char * privfile);
188 typedef int (*
evhtp_ssl_scache_add)(evhtp_connection_t * connection, evhtp_ssl_data_t * sid,
int sid_len, evhtp_ssl_sess_t * sess);
190 typedef evhtp_ssl_sess_t * (* evhtp_ssl_scache_get)(evhtp_connection_t * connection, evhtp_ssl_data_t * sid,
int sid_len);
192 typedef void * (* evhtp_ssl_scache_init)(evhtp_t *);
195 #define EVHTP_VERSION "1.2.16" 196 #define EVHTP_VERSION_MAJOR 1 197 #define EVHTP_VERSION_MINOR 2 198 #define EVHTP_VERSION_PATCH 15 200 #define evhtp_headers_iterator evhtp_kvs_iterator 202 #define EVHTP_RES_ERROR 0 203 #define EVHTP_RES_PAUSE 1 204 #define EVHTP_RES_FATAL 2 205 #define EVHTP_RES_USER 3 206 #define EVHTP_RES_DATA_TOO_LONG 4 207 #define EVHTP_RES_OK 200 209 #ifndef DOXYGEN_SHOULD_SKIP_THIS 210 #define EVHTP_RES_100 100 211 #define EVHTP_RES_CONTINUE 100 212 #define EVHTP_RES_SWITCH_PROTO 101 213 #define EVHTP_RES_PROCESSING 102 214 #define EVHTP_RES_URI_TOOLONG 122 216 #define EVHTP_RES_200 200 217 #define EVHTP_RES_CREATED 201 218 #define EVHTP_RES_ACCEPTED 202 219 #define EVHTP_RES_NAUTHINFO 203 220 #define EVHTP_RES_NOCONTENT 204 221 #define EVHTP_RES_RSTCONTENT 205 222 #define EVHTP_RES_PARTIAL 206 223 #define EVHTP_RES_MSTATUS 207 224 #define EVHTP_RES_IMUSED 226 226 #define EVHTP_RES_300 300 227 #define EVHTP_RES_MCHOICE 300 228 #define EVHTP_RES_MOVEDPERM 301 229 #define EVHTP_RES_FOUND 302 230 #define EVHTP_RES_SEEOTHER 303 231 #define EVHTP_RES_NOTMOD 304 232 #define EVHTP_RES_USEPROXY 305 233 #define EVHTP_RES_SWITCHPROXY 306 234 #define EVHTP_RES_TMPREDIR 307 236 #define EVHTP_RES_400 400 237 #define EVHTP_RES_BADREQ 400 238 #define EVHTP_RES_UNAUTH 401 239 #define EVHTP_RES_PAYREQ 402 240 #define EVHTP_RES_FORBIDDEN 403 241 #define EVHTP_RES_NOTFOUND 404 242 #define EVHTP_RES_METHNALLOWED 405 243 #define EVHTP_RES_NACCEPTABLE 406 244 #define EVHTP_RES_PROXYAUTHREQ 407 245 #define EVHTP_RES_TIMEOUT 408 246 #define EVHTP_RES_CONFLICT 409 247 #define EVHTP_RES_GONE 410 248 #define EVHTP_RES_LENREQ 411 249 #define EVHTP_RES_PRECONDFAIL 412 250 #define EVHTP_RES_ENTOOLARGE 413 251 #define EVHTP_RES_URITOOLARGE 414 252 #define EVHTP_RES_UNSUPPORTED 415 253 #define EVHTP_RES_RANGENOTSC 416 254 #define EVHTP_RES_EXPECTFAIL 417 255 #define EVHTP_RES_IAMATEAPOT 418 257 #define EVHTP_RES_500 500 258 #define EVHTP_RES_SERVERR 500 259 #define EVHTP_RES_NOTIMPL 501 260 #define EVHTP_RES_BADGATEWAY 502 261 #define EVHTP_RES_SERVUNAVAIL 503 262 #define EVHTP_RES_GWTIMEOUT 504 263 #define EVHTP_RES_VERNSUPPORT 505 264 #define EVHTP_RES_BWEXEED 509 296 #define EVHTP_FLAG_ENABLE_100_CONT (1 << 1) 297 #define EVHTP_FLAG_ENABLE_REUSEPORT (1 << 2) 298 #define EVHTP_FLAG_ENABLE_NODELAY (1 << 3) 299 #define EVHTP_FLAG_ENABLE_DEFER_ACCEPT (1 << 4) 300 #define EVHTP_FLAG_DEFAULTS EVHTP_FLAG_ENABLE_100_CONT 301 #define EVHTP_FLAG_ENABLE_ALL EVHTP_FLAG_ENABLE_100_CONT \ 302 | EVHTP_FLAG_ENABLE_REUSEPORT \ 303 | EVHTP_FLAG_ENABLE_NODELAY \ 304 | EVHTP_FLAG_ENABLE_DEFER_ACCEPT 309 #ifndef EVHTP_DISABLE_SSL 314 #ifndef EVHTP_DISABLE_EVTHR 324 #define thread_init_cbarg thread_cbarg 330 struct timeval recv_timeo;
331 struct timeval send_timeo;
335 TAILQ_ENTRY(
evhtp_s) next_vhost;
416 #define EVHTP_REQ_FLAG_KEEPALIVE (1 << 1) 417 #define EVHTP_REQ_FLAG_FINISHED (1 << 2) 418 #define EVHTP_REQ_FLAG_CHUNKED (1 << 3) 419 #define EVHTP_REQ_FLAG_ERROR (1 << 4) 428 #define evhtp_request_content_len(r) htparser_get_content_length(r->conn->parser) 434 #ifndef EVHTP_DISABLE_EVTHR 437 #ifndef EVHTP_DISABLE_SSL 444 struct timeval recv_timeo;
445 struct timeval send_timeo;
452 #define EVHTP_CONN_FLAG_ERROR (1 << 1) 453 #define EVHTP_CONN_FLAG_OWNER (1 << 2) 454 #define EVHTP_CONN_FLAG_VHOST_VIA_SNI (1 << 3) 455 #define EVHTP_CONN_FLAG_PAUSED (1 << 4) 456 #define EVHTP_CONN_FLAG_CONNECTED (1 << 5) 457 #define EVHTP_CONN_FLAG_WAITING (1 << 6) 458 #define EVHTP_CONN_FLAG_FREE_CONN (1 << 7) 459 #define EVHTP_CONN_FLAG_KEEPALIVE (1 << 8) 464 #ifdef EVHTP_FUTURE_USE 503 #ifndef EVHTP_DISABLE_SSL 534 void (*
free_)(
void *));
549 EVHTP_EXPORT evhtp_t *
evhtp_new(
struct event_base * evbase,
void * arg);
568 EVHTP_EXPORT
void evhtp_free(evhtp_t * evhtp);
581 EVHTP_EXPORT
void evhtp_set_timeouts(evhtp_t * htp,
const struct timeval * r,
const struct timeval * w);
608 #ifndef EVHTP_DISABLE_SSL 610 EVHTP_EXPORT
int evhtp_ssl_init(evhtp_t * htp, evhtp_ssl_cfg_t * ssl_cfg);
621 DEPRECATED("evhtp_disable_100 will soon be deprecated, use htp->flags
instead");
676 EVHTP_EXPORT evhtp_callback_t *
evhtp_set_cb(evhtp_t * htp, const
char * path,
690 #ifndef EVHTP_DISABLE_REGEX 691 EVHTP_EXPORT evhtp_callback_t *
evhtp_set_regex_cb(evhtp_t * htp,
const char * pattern,
709 EVHTP_EXPORT evhtp_callback_t *
evhtp_set_glob_cb(evhtp_t * htp,
const char * pattern,
738 EVHTP_EXPORT evhtp_callback_t *
evhtp_get_cb(evhtp_t * htp,
const char * needle);
816 EVHTP_EXPORT
int evhtp_bind_socket(evhtp_t * htp,
const char * addr, uint16_t port,
int backlog);
854 size_t sin_len,
int backlog);
872 DEPRECATED(
"will take on the syntax of evhtp_use_threads_wexit");
881 int nthreads,
void * arg);
889 EVHTP_EXPORT
void evhtp_send_reply(evhtp_request_t * request, evhtp_res code);
952 EVHTP_EXPORT evhtp_callback_t *
990 EVHTP_EXPORT
int evhtp_add_vhost(evhtp_t * evhtp,
const char * name, evhtp_t * vhost);
1029 EVHTP_EXPORT evhtp_kv_t *
evhtp_kv_new(
const char * key,
const char * val,
char kalloc,
char valloc);
1113 #define EVHTP_PARSE_QUERY_FLAG_STRICT 0 1114 #define EVHTP_PARSE_QUERY_FLAG_IGNORE_HEX (1 << 0) 1115 #define EVHTP_PARSE_QUERY_FLAG_ALLOW_EMPTY_VALS (1 << 1) 1116 #define EVHTP_PARSE_QUERY_FLAG_ALLOW_NULL_VALS (1 << 2) 1117 #define EVHTP_PARSE_QUERY_FLAG_TREAT_SEMICOLON_AS_SEP (1 << 3) 1118 #define EVHTP_PARSE_QUERY_FLAG_IGNORE_FRAGMENTS (1 << 4) 1119 #define EVHTP_PARSE_QUERY_FLAG_LENIENT \ 1120 EVHTP_PARSE_QUERY_FLAG_IGNORE_HEX \ 1121 | EVHTP_PARSE_QUERY_FLAG_ALLOW_EMPTY_VALS \ 1122 | EVHTP_PARSE_QUERY_FLAG_ALLOW_NULL_VALS \ 1123 | EVHTP_PARSE_QUERY_FLAG_TREAT_SEMICOLON_AS_SEP 1125 #define EVHTP_PARSE_QUERY_FLAG_DEFAULT EVHTP_PARSE_QUERY_FLAG_LENIENT 1175 char kalloc,
char valloc);
1188 const char * key,
char kalloc);
1201 const char * val,
char valloc);
1222 #define evhtp_header_find evhtp_kv_find 1223 #define evhtp_headers_find_header evhtp_kvs_find_kv 1224 #define evhtp_headers_for_each evhtp_kvs_for_each 1225 #define evhtp_header_new evhtp_kv_new 1226 #define evhtp_header_free evhtp_kv_free 1227 #define evhtp_headers_new evhtp_kvs_new 1228 #define evhtp_headers_free evhtp_kvs_free 1229 #define evhtp_header_rm_and_free evhtp_kv_rm_and_free 1230 #define evhtp_headers_add_header evhtp_kvs_add_kv 1231 #define evhtp_headers_add_headers evhtp_kvs_add_kvs 1232 #define evhtp_query_new evhtp_kvs_new 1233 #define evhtp_query_free evhtp_kvs_free 1326 const struct timeval * r,
1327 const struct timeval * w);
1407 struct event_base * evbase,
1408 struct evdns_base * dns_base,
1409 const char * addr, uint16_t port);
1414 EVHTP_EXPORT evhtp_connection_t *
1417 #ifndef EVHTP_DISABLE_SSL 1419 struct event_base * evbase,
1420 const char * addr, uint16_t port, evhtp_ssl_ctx_t * ctx);
1433 evhtp_request_t * r, htp_method meth,
const char * uri);
EVHTP_EXPORT void evhtp_connection_set_bev(evhtp_connection_t *conn, struct bufferevent *bev)
Sets the connections underlying bufferevent.
EVHTP_EXPORT evhtp_header_t * evhtp_header_key_add(evhtp_headers_t *headers, const char *key, char kalloc)
creates a new evhtp_header_t, sets only the key, and adds to the evhtp_headers TAILQ ...
void(* evhtp_thread_init_cb)(evhtp_t *htp, evthr_t *thr, void *arg)
evhtp_res(* evhtp_hook_write_cb)(evhtp_connection_t *conn, void *arg)
EVHTP_EXPORT evhtp_proto evhtp_request_get_proto(evhtp_request_t *r)
evhtp_hook_chunk_new_cb on_new_chunk
uint16_t parser_flags
default query flags to alter 'strictness' (see EVHTP_PARSE_QUERY_FLAG_*)
evhtp_query_t * query
list of k/v for query arguments
EVHTP_EXPORT unsigned int evhtp_request_status(evhtp_request_t *)
EVHTP_EXPORT void evhtp_kv_free(evhtp_kv_t *kv)
frees resources allocated for a single key/value
void * cbarg
argument which is passed to the cb function
type which defines to hook whenever an error occurs
evhtp_uri_t * uri
request URI information
evhtp_res(* evhtp_hook_hostname_cb)(evhtp_request_t *r, const char *hostname, void *arg)
EVHTP_EXPORT void evhtp_set_max_body_size(evhtp_t *htp, uint64_t len)
set a max body size to accept for an incoming request, this will default to unlimited.
unsigned char evhtp_ssl_data_t
evhtp_hook_hostname_cb on_hostname
EVHTP_EXPORT void evhtp_connection_enable_flag(evhtp_connection_t *, int)
EVHTP_EXPORT evhtp_callback_t * evhtp_set_regex_cb(evhtp_t *htp, const char *pattern, evhtp_callback_cb cb, void *arg)
sets a callback to be executed based on a regex pattern
evhtp_ssl_decrypt_cb decrypt_cb
evhtp_type type
server or client
struct evhtp_callbacks_s evhtp_callbacks_t
EVHTP_EXPORT int evhtp_connection_set_hook(evhtp_connection_t *c, evhtp_hook_type type, evhtp_hook cb, void *arg)
sets a callback hook for either a connection or a path/regex .
struct evconnlistener evserv_t
unsigned char * query_raw
the unparsed query arguments
void * on_headers_start_arg
EVHTP_EXPORT int evhtp_request_set_hook(evhtp_request_t *r, evhtp_hook_type type, evhtp_hook cb, void *arg)
evhtp_connection_t * conn
the associated connection
EVHTP_EXPORT evhtp_request_t * evhtp_request_new(evhtp_callback_cb cb, void *arg)
allocate a new request
EVHTP_EXPORT void evhtp_disable_flag(evhtp_t *, int)
char * hostname
hostname if present in URI
EVHTP_EXPORT htp_method evhtp_request_get_method(evhtp_request_t *r)
returns the htp_method enum version of the request method.
EVHTP_EXPORT int evhtp_bind_sockaddr(evhtp_t *htp, struct sockaddr *, size_t sin_len, int backlog)
bind to an already allocated sockaddr.
evhtp_ssl_scache_add scache_add
htp_method method
HTTP method used.
EVHTP_EXPORT evhtp_kv_t * evhtp_kvs_find_kv(evhtp_kvs_t *kvs, const char *key)
find the evhtp_kv_t reference 'key' from the k/val list 'kvs'
evhtp_hook_read_cb on_read
EVHTP_EXPORT int evhtp_request_get_flags(evhtp_request_t *)
EVHTP_EXPORT void use htp flags instead
EVHTP_EXPORT void evhtp_request_free(evhtp_request_t *request)
EVHTP_EXPORT void evhtp_request_set_keepalive(evhtp_request_t *request, int val)
evhtp_post_accept_cb post_accept
evhtp_ssl_scache_del scache_del
type which defines to hook once a path has been parsed
void(* evhtp_ssl_scache_del)(evhtp_t *htp, evhtp_ssl_data_t *sid, int sid_len)
EVHTP_EXPORT void evhtp_send_reply_end(evhtp_request_t *request)
EVHTP_EXPORT evhtp_callback_t * evhtp_callback_new(const char *path, evhtp_callback_type type, evhtp_callback_cb cb, void *arg)
creates a new evhtp_callback_t structure.
EVHTP_EXPORT int evhtp_use_callback_locks(evhtp_t *htp)
creates a lock around callbacks and hooks, allowing for threaded applications to add/remove/modify ho...
void * on_connection_fini_arg
int(* evhtp_ssl_scache_add)(evhtp_connection_t *connection, evhtp_ssl_data_t *sid, int sid_len, evhtp_ssl_sess_t *sess)
EVHTP_EXPORT int evhtp_callback_set_hook(evhtp_callback_t *cb, evhtp_hook_type type, evhtp_hook hookcb, void *arg)
char * file
the filename if present (c.html)
main structure containing all configuration information
EVHTP_EXPORT void evhtp_kvs_add_kv(evhtp_kvs_t *kvs, evhtp_kv_t *kv)
appends a key/val structure to a evhtp_kvs_t tailq
EVHTP_EXPORT void evhtp_connection_resume(evhtp_connection_t *connection)
resumes a connection (enables reading) and activates resume event.
char k_heaped
set to 1 if the key can be free()'d
struct event_base * evbase
the initialized event_base
evhtp_res(* evhtp_hook_conn_err_cb)(evhtp_connection_t *connection, evhtp_error_flags errtype, void *arg)
evhtp_hook_chunk_fini_cb on_chunk_fini
evhtp_res status
The HTTP response code or other error conditions.
void *(* evhtp_ssl_scache_init)(evhtp_t *)
struct evbuffer * buffer_in
buffer containing data from client
EVHTP_EXPORT int evhtp_use_threads(evhtp_t *, evhtp_thread_init_cb, int nthreads, void *) DEPRECATED("will take on the syntax of evhtp_use_threads_wexit")
Enable thread-pool support for an evhtp_t context.
EVHTP_EXPORT void evhtp_request_set_bev(evhtp_request_t *request, struct bufferevent *bev)
sets the underlying bufferevent for a evhtp_request
htp_scheme scheme
set if a scheme is found
EVHTP_EXPORT void evhtp_connection_pause(evhtp_connection_t *connection)
pauses a connection (disables reading)
pthread_mutex_t evhtp_mutex_t
evhtp_ssl_scache_type scache_type
struct evbuffer * scratch_buf
always zero'd out after used
pthread_mutex_t * lock
parent lock for add/del cbs in threads
EVHTP_EXPORT evhtp_callback_t * evhtp_get_cb(evhtp_t *htp, const char *needle)
attempts to find the callback matching the exact string 'needle'.
EVHTP_EXPORT void evhtp_request_resume(evhtp_request_t *request)
Wrapper around evhtp_connection_resume.
evhtp_hook_type
types associated with where a developer can hook into during the request processing cycle...
evhtp_res(* evhtp_hook_path_cb)(evhtp_request_t *req, evhtp_path_t *path, void *arg)
EVHTP_EXPORT int evhtp_make_request(evhtp_connection_t *c, evhtp_request_t *r, htp_method meth, const char *uri)
make a client request
evhtp_hook_header_cb on_header
EVHTP_EXPORT int evhtp_unset_all_hooks(evhtp_hooks_t **hooks)
removes all hooks.
EVHTP_EXPORT void evhtp_set_gencb(evhtp_t *htp, evhtp_callback_cb cb, void *arg)
sets a callback which is called if no other callbacks are matched
EVHTP_EXPORT evhtp_query_t * evhtp_parse_query_wflags(const char *query, size_t len, int flags)
Parses the query portion of the uri into a set of key/values.
static void(* free_)(void *d)
EVHTP_EXPORT void evhtp_connection_set_max_body_size(evhtp_connection_t *conn, uint64_t len)
set a max body size for a specific connection, this will default to the size set by evhtp_set_max_bod...
evhtp_res(* evhtp_hook_request_fini_cb)(evhtp_request_t *req, void *arg)
EVHTP_EXPORT void evhtp_callback_free(evhtp_callback_t *callback)
safely frees callback structure memory and internals
evhtp_hook_path_cb on_path
EVHTP_EXPORT evhtp_connection_t * evhtp_connection_new(struct event_base *evbase, const char *addr, uint16_t port)
allocate a new connection
char * username
the username in URI (scheme://USER:.
X509_STORE_CTX evhtp_x509_store_ctx_t
EVHTP_EXPORT void evhtp_set_post_accept_cb(evhtp_t *htp, evhtp_post_accept_cb, void *arg)
call a user-defined function right after a connection is accepted.
EVHTP_EXPORT int evhtp_connection_get_flags(evhtp_connection_t *)
EVHTP_EXPORT void evhtp_connection_free(evhtp_connection_t *connection)
free's all connection related resources, this will also call your request fini hook and request fini ...
type which defines to hook before the request is free'd
evhtp_headers_t * headers_in
headers from client
EVHTP_EXPORT int evhtp_response_needs_body(const evhtp_res code, const htp_method method)
Determine if a response should have a body.
evhtp_hook_err_cb on_error
EVHTP_EXPORT int evhtp_unescape_string(unsigned char **out, unsigned char *str, size_t str_len)
Unescapes strings like '%7B1,%202,%203%7D' would become '{1, 2, 3}'.
EVHTP_EXPORT int evhtp_get_flags(evhtp_t *)
evhtp_res(* evhtp_hook_chunk_fini_cb)(evhtp_request_t *r, void *arg)
EVHTP_EXPORT evhtp_kvs_t * evhtp_kvs_new(void)
creates an empty list of key/values
void(* evhtp_hook_err_cb)(evhtp_request_t *req, evhtp_error_flags errtype, void *arg)
evhtp_t * parent
only when this is a vhost
evhtp_res(* evhtp_hook_header_cb)(evhtp_request_t *req, evhtp_header_t *hdr, void *arg)
void(* evhtp_thread_exit_cb)(evhtp_t *htp, evthr_t *thr, void *arg)
uint8_t evhtp_error_flags
evhtp_thread_exit_cb thread_exit_cb
EVHTP_EXPORT void evhtp_set_pre_accept_cb(evhtp_t *htp, evhtp_pre_accept_cb, void *arg)
call a user-defined function before the connection is accepted.
evhtp_hooks_t * hooks
request specific hooks
evhtp_callbacks_t * callbacks
evhtp_res(* evhtp_hook)()
a generic key/value structure
unsigned int matched_eoff
offset of where the uri ends mainly used for regex matching
EVHTP_EXPORT int evhtp_callback_unset_hook(evhtp_callback_t *callback, evhtp_hook_type type)
EVHTP_EXPORT int evhtp_request_unset_hook(evhtp_request_t *req, evhtp_hook_type type)
struct event_base * evbase
EVHTP_EXPORT void evhtp_send_reply_chunk(evhtp_request_t *request, struct evbuffer *buf)
send a chunk reply.
evhtp_res(* evhtp_hook_headers_cb)(evhtp_request_t *req, evhtp_headers_t *hdr, void *arg)
a structure containing all information for a http request.
evthr_pool_t * thr_pool
connection threadpool
EVHTP_EXPORT void evhtp_disable_100_continue(evhtp_t *htp) DEPRECATED("evhtp_disable_100 will soon be deprecated
when a client sends an Expect: 100-continue, if this is function is called, evhtp will not send a HTT...
EVHTP_EXPORT struct bufferevent * evhtp_request_get_bev(evhtp_request_t *request)
returns the underlying requests bufferevent
EVHTP_EXPORT evhtp_callback_t * evhtp_set_glob_cb(evhtp_t *htp, const char *pattern, evhtp_callback_cb cb, void *arg)
sets a callback to to be executed on simple glob/wildcard patterns this is useful if the app does not...
TAILQ_HEAD(evhtp_kvs_s, evhtp_kv_s)
evhtp_hook_connection_fini_cb on_connection_fini
EVHTP_EXPORT void evhtp_request_enable_flag(evhtp_request_t *, int)
void * on_chunks_fini_arg
evhtp_hook_conn_err_cb on_connection_error
int(* evhtp_ssl_chk_issued_cb)(evhtp_x509_store_ctx_t *ctx, evhtp_x509_t *x, evhtp_x509_t *issuer)
structure containing a single callback and configuration
EVHTP_EXPORT evhtp_header_t * evhtp_header_val_add(evhtp_headers_t *headers, const char *val, char valloc)
finds the last header in the headers tailq and adds the value
EVHTP_EXPORT evhtp_connection_t * evhtp_connection_ssl_new(struct event_base *evbase, const char *addr, uint16_t port, evhtp_ssl_ctx_t *ctx)
evhtp_callback_cb cb
the function to call when fully processed
int(* evhtp_ssl_verify_cb)(int pre_verify, evhtp_x509_store_ctx_t *ctx)
struct evconnlistener * server
the libevent listener struct
EVHTP_EXPORT void evhtp_set_timeouts(evhtp_t *htp, const struct timeval *r, const struct timeval *w)
set a read/write timeout on all things evhtp_t.
evhtp_res(* evhtp_hook_connection_fini_cb)(evhtp_connection_t *connection, void *arg)
EVHTP_EXPORT void evhtp_connection_set_timeouts(evhtp_connection_t *conn, const struct timeval *r, const struct timeval *w)
sets a connection-specific read/write timeout which overrides the global read/write settings...
evhtp_hook_chunks_fini_cb on_chunks_fini
type which defines to hook after all headers have been parsed
char * server_name
the name included in Host: responses
evhtp_hook_write_cb on_write
EVHTP_EXPORT evhtp_callback_t * evhtp_set_cb(evhtp_t *htp, const char *path, evhtp_callback_cb cb, void *arg)
sets a callback to be executed on a specific path
EVHTP_EXPORT evhtp_t * evhtp_new(struct event_base *evbase, void *arg)
creates a new evhtp_t instance
evhtp_request_t * request
the request currently being processed
struct evhtp_kvs_s evhtp_kvs_t
EVHTP_EXPORT void evhtp_send_reply(evhtp_request_t *request, evhtp_res code)
generates all the right information for a reply to be sent to the client
EVHTP_EXPORT evhtp_kv_t * evhtp_kv_new(const char *key, const char *val, char kalloc, char valloc)
Allocates a new key/value structure.
EVHTP_EXPORT void evhtp_set_bev_flags(evhtp_t *htp, int flags)
bufferevent flags which will be used for bev sockets.
EVHTP_EXPORT evhtp_connection_t * evhtp_request_get_connection(evhtp_request_t *request)
returns the underlying evhtp_connection_t structure from a request
EVHTP_EXPORT evhtp_connection_t * evhtp_connection_new_dns(struct event_base *evbase, struct evdns_base *dns_base, const char *addr, uint16_t port)
allocate a new connection
EVHTP_EXPORT void evhtp_request_disable_flag(evhtp_request_t *, int)
evhtp_hook_headers_start_cb on_headers_start
EVHTP_EXPORT int evhtp_use_threads_wexit(evhtp_t *, evhtp_thread_init_cb, evhtp_thread_exit_cb, int nthreads, void *arg)
Temporary function which will be renamed evhtp_use_threads in the future.
a generic container representing an entire URI strucutre
EVHTP_EXPORT void evhtp_set_max_keepalive_requests(evhtp_t *htp, uint64_t num)
sets a maximum number of requests that a single connection can make.
char * path
the path (/a/b/)
EVHTP_EXPORT void evhtp_unbind_socket(evhtp_t *htp)
stops the listening socket.
char v_heaped
set to 1 if the val can be free()'d
EVHTP_EXPORT struct bufferevent * evhtp_connection_take_ownership(evhtp_connection_t *connection)
let a user take ownership of the underlying bufferevent and free all other underlying resources...
EVHTP_EXPORT void evhtp_set_mem_functions(void *(*malloc_)(size_t), void *(*realloc_)(void *, size_t), void(*free_)(void *))
evhtp_res(* evhtp_pre_accept_cb)(evhtp_connection_t *conn, void *arg)
EVHTP_EXPORT void evhtp_request_set_max_body_size(evhtp_request_t *request, uint64_t len)
just calls evhtp_connection_set_max_body_size for the request.
evhtp_pre_accept_cb pre_accept
EVHTP_EXPORT int evhtp_ssl_init(evhtp_t *htp, evhtp_ssl_cfg_t *ssl_cfg)
int(* evhtp_kvs_iterator)(evhtp_kv_t *kv, void *arg)
EVHTP_EXPORT void evhtp_send_reply_chunk_end(evhtp_request_t *request)
call when all chunks have been sent and you wish to send the last bits.
EVHTP_EXPORT int evhtp_add_vhost(evhtp_t *evhtp, const char *name, evhtp_t *vhost)
add an evhtp_t structure (with its own callbacks) to a base evhtp_t structure for virtual hosts...
evhtp_authority_t * authority
char * full
the full path+file (/a/b/c.html)
EVHTP_EXPORT int evhtp_kvs_for_each(evhtp_kvs_t *kvs, evhtp_kvs_iterator cb, void *arg)
callback iterator which executes 'cb' for every entry in 'kvs'
EVHTP_EXPORT void evhtp_kv_rm_and_free(evhtp_kvs_t *kvs, evhtp_kv_t *kv)
free's resources associated with 'kv' if ONLY found within the key/value list
EVHTP_EXPORT const char * evhtp_kv_find(evhtp_kvs_t *kvs, const char *key)
find the string value of 'key' from the key/value list 'kvs'
EVHTP_EXPORT void evhtp_kvs_free(evhtp_kvs_t *kvs)
frees a the list of key/values, and all underlying entries
type which defines to hook whenever the parser recieves data in a body
EVHTP_EXPORT void evhtp_request_pause(evhtp_request_t *request)
Wrapper around evhtp_connection_pause.
type which defines to hook whenever a connection error occurs
evhtp_res(* evhtp_hook_headers_start_cb)(evhtp_request_t *r, void *arg)
#define evhtp_header_find
void * arg
user-defined evhtp_t specific arguments
EVHTP_EXPORT void evhtp_set_parser_flags(evhtp_t *htp, int flags)
during the request processing cycle, these flags will be used to for query argument parsing...
EVHTP_EXPORT void evhtp_connection_disable_flag(evhtp_connection_t *, int)
EVHTP_EXPORT evhtp_hooks_t * evhtp_connection_get_hooks(evhtp_connection_t *c)
SSL_SESSION evhtp_ssl_sess_t
evhtp_res(* evhtp_post_accept_cb)(evhtp_connection_t *conn, void *arg)
evhtp_proto proto
HTTP protocol used.
EVHTP_EXPORT evhtp_hooks_t * evhtp_callback_get_hooks(evhtp_callback_t *cb)
returns callback hooks
evhtp_ssl_cfg_t * ssl_cfg
struct evbuffer * buffer_out
buffer containing data to client
EVHTP_EXPORT int evhtp_callbacks_add_callback(evhtp_callbacks_t *cbs, evhtp_callback_t *cb)
Adds a evhtp_callback_t to the evhtp_callbacks_t list.
char * password
the password in URI (scheme://...:PASS.
EVHTP_EXPORT evhtp_query_t * evhtp_parse_query(const char *query, size_t len)
Parses the query portion of the uri into a set of key/values in a strict manner.
EVHTP_EXPORT struct bufferevent * evhtp_connection_get_bev(evhtp_connection_t *conn)
returns the underlying connections bufferevent
#define evhtp_headers_add_header
void(* evhtp_hook_event_cb)(evhtp_connection_t *conn, short events, void *arg)
uint16_t flags
the base flags set for this context, see: EVHTP_FLAG_*
EVHTP_EXPORT evhtp_hooks_t * evhtp_request_get_hooks(evhtp_request_t *r)
returns request hooks
evhtp_hook_request_fini_cb on_request_fini
EVHTP_EXPORT void evhtp_send_reply_start(evhtp_request_t *request, evhtp_res code)
evhtp_ssl_ctx_t * ssl_ctx
if ssl enabled, this is the servers CTX
evhtp_res(* evhtp_hook_read_cb)(evhtp_request_t *req, struct evbuffer *buf, void *arg)
struct bufferevent evbev_t
evhtp_t * htp
the parent evhtp_t structure
evhtp_hook_headers_cb on_headers
static void *(* malloc_)(size_t sz)
evhtp_ssl_scache_init scache_init
evhtp_ssl_chk_issued_cb x509_chk_issued_cb
void(* evhtp_callback_cb)(evhtp_request_t *req, void *arg)
void * on_connection_error_arg
uint16_t port
port if present in URI
EVP_PKEY *(* evhtp_ssl_decrypt_cb)(char *privfile)
int bev_flags
bufferevent flags to use on bufferevent_*_socket_new()
evhtp_res(* evhtp_hook_chunk_new_cb)(evhtp_request_t *r, uint64_t len, void *arg)
EVHTP_EXPORT int evhtp_ssl_use_threads(void)
unsigned int matched_soff
offset of where the uri starts mainly used for regex matching
EVHTP_EXPORT int evhtp_add_alias(evhtp_t *evhtp, const char *name)
Add an alias hostname for a virtual-host specific evhtp_t.
EVHTP_EXPORT int evhtp_connection_unset_hook(evhtp_connection_t *conn, evhtp_hook_type type)
EVHTP_EXPORT int evhtp_accept_socket(evhtp_t *htp, evutil_socket_t sock, int backlog)
create the listener plus setup various options with an already-bound socket.
EVHTP_EXPORT void evhtp_kvs_add_kvs(evhtp_kvs_t *dst, evhtp_kvs_t *src)
appends all key/val structures from src tailq onto dst tailq
evhtp_res(* evhtp_hook_chunks_fini_cb)(evhtp_request_t *r, void *arg)
evhtp_ssl_verify_cb x509_verify_cb
evhtp_defaults_t defaults
#define evhtp_headers_iterator
evhtp_ssl_sess_t *(* evhtp_ssl_scache_get)(evhtp_connection_t *connection, evhtp_ssl_data_t *sid, int sid_len)
evhtp_hook_event_cb on_event
evhtp_thread_init_cb thread_init_cb
evhtp_ssl_scache_get scache_get
static void *(* realloc_)(void *d, size_t sz)
unsigned char * fragment
data after '#' in uri
type which defines to hook after one header has been parsed
EVHTP_EXPORT int evhtp_add_aliases(evhtp_t *evhtp, const char *name,...)
set a variable number of aliases in one call evhtp_add_alias
structure which represents a URI path and or file
EVHTP_EXPORT void evhtp_send_reply_chunk_start(evhtp_request_t *request, evhtp_res code)
start a chunked response.
uint64_t max_keepalive_requests
EVHTP_EXPORT void evhtp_free(evhtp_t *evhtp)
Frees evhtp_t structure; will stop and free threads associated with the structure, and free the ssl context as well (if applicable).
EVHTP_EXPORT void evhtp_send_reply_body(evhtp_request_t *request, struct evbuffer *buf)
structure which represents authority information in a URI
EVHTP_EXPORT void evhtp_enable_flag(evhtp_t *, int)
EVHTP_EXPORT int evhtp_bind_socket(evhtp_t *htp, const char *addr, uint16_t port, int backlog)
bind to a socket, optionally with specific protocol support formatting.
evhtp_headers_t * headers_out
headers to client
void * on_request_fini_arg