HTTP
Provides high-performance HTTP/1.1 server functionality built on libevpl.
The libevpl HTTP server is very minimalist in its current form, but it allows HTTP to be transmitted over arbitrary supported protocols possibly with zero-copy transfer.
Overview
libevpl’s HTTP support provides:
- HTTP/1.1 server - Handle GET, POST, PUT, DELETE, HEAD requests
- Streaming - Support for chunked transfer encoding and content-length
- Zero-copy - Use iovecs for efficient data transfer
- Header manipulation - Add custom request/response headers
- Multiple protocols - Run HTTP over TCP, XLIO, or RDMA
Supported methods: GET, HEAD, POST, PUT, DELETE
Types
struct evpl_http_agent
Opaque structure representing an HTTP agent (per event loop).
struct evpl_http_server
Opaque structure representing an HTTP server attached to a listener.
struct evpl_http_request
Opaque structure representing an individual HTTP request/response.
enum evpl_http_notify_type
HTTP event notifications:
| Type | Description |
|---|---|
EVPL_HTTP_NOTIFY_RECEIVE_DATA | Request body data available |
EVPL_HTTP_NOTIFY_RECEIVE_COMPLETE | Request fully received |
EVPL_HTTP_NOTIFY_WANT_DATA | Server ready for more response data |
EVPL_HTTP_NOTIFY_RESPONSE_COMPLETE | Response fully sent |
enum evpl_http_request_type
HTTP request methods:
EVPL_HTTP_REQUEST_TYPE_GETEVPL_HTTP_REQUEST_TYPE_HEADEVPL_HTTP_REQUEST_TYPE_POSTEVPL_HTTP_REQUEST_TYPE_PUTEVPL_HTTP_REQUEST_TYPE_DELETEEVPL_HTTP_REQUEST_TYPE_UNKNOWN
Callback Types
evpl_http_notify_callback_t
typedef void (*evpl_http_notify_callback_t)(
struct evpl *evpl,
struct evpl_http_agent *agent,
struct evpl_http_request *request,
enum evpl_http_notify_type notify_type,
enum evpl_http_request_type request_type,
const char *uri,
void *notify_data,
void *private_data);
Callback invoked for HTTP events on a specific request.
Parameters:
evpl- Event loopagent- HTTP agentrequest- HTTP requestnotify_type- Type of notificationrequest_type- HTTP method (GET, POST, etc.)uri- Request URInotify_data- Request-specific data (from dispatch callback)private_data- User context (from dispatch callback)
evpl_http_dispatch_callback_t
typedef void (*evpl_http_dispatch_callback_t)(
struct evpl *evpl,
struct evpl_http_agent *agent,
struct evpl_http_request *request,
evpl_http_notify_callback_t *notify_callback,
void **notify_data,
void *private_data);
Callback invoked when a new HTTP request arrives (routing/dispatch).
Parameters:
evpl- Event loopagent- HTTP agentrequest- New HTTP requestnotify_callback- [OUT] Set notification callback for this requestnotify_data- [OUT] Set request-specific contextprivate_data- Server context
Functions
Agent Management
evpl_http_init
struct evpl_http_agent *evpl_http_init(struct evpl *evpl);
Create an HTTP agent for an event loop.
Parameters:
evpl- Event loop
Returns: HTTP agent, or NULL on failure
Note: One agent per event loop.
evpl_http_destroy
void evpl_http_destroy(struct evpl_http_agent *agent);
Destroy an HTTP agent. All servers must be detached first.
Parameters:
agent- Agent to destroy
Server Management
evpl_http_attach
struct evpl_http_server *evpl_http_attach(
struct evpl_http_agent *agent,
struct evpl_listener *listener,
evpl_http_dispatch_callback_t dispatch_callback,
void *private_data);
Attach an HTTP server to a listener.
Parameters:
agent- HTTP agentlistener- Network listenerdispatch_callback- Request dispatch callbackprivate_data- Server context
Returns: HTTP server handle, or NULL on failure
evpl_http_server_destroy
void evpl_http_server_destroy(
struct evpl_http_agent *agent,
struct evpl_http_server *server);
Detach and destroy an HTTP server.
Parameters:
agent- HTTP agentserver- Server to destroy
Request Information
evpl_http_request_type
enum evpl_http_request_type evpl_http_request_type(
struct evpl_http_request *request);
Get the HTTP method of a request.
Returns: Request type enum
evpl_http_request_type_to_string
const char *evpl_http_request_type_to_string(
struct evpl_http_request *request);
Get the HTTP method as a string.
Returns: Method string (“GET”, “POST”, etc.)
evpl_http_request_url
const char *evpl_http_request_url(
struct evpl_http_request *request,
int *len);
Get the request URI.
Parameters:
request- HTTP requestlen- [OUT] URI length (optional, can beNULL)
Returns: URI string
evpl_http_request_header
const char *evpl_http_request_header(
struct evpl_http_request *request,
const char *name);
Get a request header value.
Parameters:
request- HTTP requestname- Header name (case-insensitive)
Returns: Header value, or NULL if not present
evpl_http_request_header_iterate
typedef void (*evpl_http_request_header_cb_t)(
const char *name,
const char *value,
void *private_data);
void evpl_http_request_header_iterate(
struct evpl_http_request *request,
evpl_http_request_header_cb_t callback,
void *private_data);
Invoke callback once for every header on the request, in the order the headers were received. Use this when the set of header names isn’t known up front — for example, when canonicalizing headers for signature verification.
The name and value pointers passed to the callback are owned by the request and remain valid for the duration of the call only; copy them if they need to outlive the callback.
Parameters:
request- HTTP requestcallback- Function to invoke for each headerprivate_data- Opaque pointer forwarded tocallback
Request Body
evpl_http_request_get_data_avail
uint64_t evpl_http_request_get_data_avail(
struct evpl_http_request *request);
Get the number of bytes available to read from request body.
Returns: Available bytes
evpl_http_request_get_datav
int evpl_http_request_get_datav(
struct evpl *evpl,
struct evpl_http_request *request,
struct evpl_iovec *iov,
int length);
Read request body data into iovecs.
Parameters:
evpl- Event looprequest- HTTP requestiov- [OUT] Iovec to receive datalength- Maximum bytes to read
Returns: Number of bytes read
Response Headers
evpl_http_request_add_header
void evpl_http_request_add_header(
struct evpl_http_request *request,
const char *name,
const char *value);
Add a response header.
Parameters:
request- HTTP requestname- Header namevalue- Header value
Response Body
evpl_http_server_set_response_length
void evpl_http_server_set_response_length(
struct evpl_http_request *request,
uint64_t content_length);
Set the response Content-Length.
Parameters:
request- HTTP requestcontent_length- Response body size in bytes
Note: Call before sending data.
evpl_http_server_set_response_chunked
void evpl_http_server_set_response_chunked(
struct evpl_http_request *request);
Enable chunked transfer encoding for the response.
Parameters:
request- HTTP request
Use case: When response size is not known in advance.
evpl_http_request_add_datav
void evpl_http_request_add_datav(
struct evpl_http_request *request,
struct evpl_iovec *iov,
int niov);
Add response body data.
Parameters:
request- HTTP requestiov- Iovecs containing response dataniov- Number of iovecs
evpl_http_server_dispatch_default
void evpl_http_server_dispatch_default(
struct evpl_http_request *request,
int status);
Send a default response with a status code.
Parameters:
request- HTTP requeststatus- HTTP status code (200, 404, 500, etc.)
Use case: Quick responses for errors or simple status pages.
See Also
- Binds & Connections API - Underlying network I/O
- Memory API - Buffer management
- Threading API - Multi-threaded servers
- Examples - Complete HTTP server examples (coming soon)