133 lines
3.9 KiB
C
133 lines
3.9 KiB
C
#include <stdlib.h>
|
|
|
|
#ifndef HTTPSERVER_IMPL
|
|
#include "api.h"
|
|
#include "buffer_util.h"
|
|
#include "common.h"
|
|
#include "io_events.h"
|
|
#include "request_util.h"
|
|
#include "respond.h"
|
|
#include "server.h"
|
|
#endif
|
|
|
|
int http_request_has_flag(http_request_t *request, int flag) {
|
|
return HTTP_FLAG_CHECK(request->flags, flag);
|
|
}
|
|
|
|
int http_server_loop(http_server_t *server) { return server->loop; }
|
|
|
|
http_server_t *http_server_init(int port, void (*handler)(http_request_t *)) {
|
|
#ifdef KQUEUE
|
|
return hs_server_init(port, handler, hs_on_kqueue_server_event, NULL);
|
|
#else
|
|
return hs_server_init(port, handler, hs_on_epoll_server_connection_event,
|
|
hs_on_epoll_server_timer_event);
|
|
#endif
|
|
}
|
|
|
|
void http_request_free_buffer(http_request_t *request) {
|
|
_hs_buffer_free(&request->buffer, &request->server->memused);
|
|
}
|
|
|
|
void *http_request_userdata(http_request_t *request) { return request->data; }
|
|
|
|
void http_request_set_userdata(http_request_t *request, void *data) {
|
|
request->data = data;
|
|
}
|
|
|
|
void http_server_set_userdata(struct http_server_s *serv, void *data) {
|
|
serv->data = data;
|
|
}
|
|
|
|
void *http_request_server_userdata(struct http_request_s *request) {
|
|
return request->server->data;
|
|
}
|
|
|
|
int http_request_iterate_headers(http_request_t *request, http_string_t *key,
|
|
http_string_t *val, int *iter) {
|
|
return hs_request_iterate_headers(request, key, val, iter);
|
|
}
|
|
|
|
http_string_t http_request_header(http_request_t *request, char const *key) {
|
|
return hs_request_header(request, key);
|
|
}
|
|
|
|
void http_request_connection(http_request_t *request, int directive) {
|
|
hs_request_set_keep_alive_flag(request, directive);
|
|
}
|
|
|
|
http_string_t http_request_chunk(struct http_request_s *request) {
|
|
return hs_request_chunk(request);
|
|
}
|
|
|
|
http_response_t *http_response_init() { return hs_response_init(); }
|
|
|
|
void http_response_header(http_response_t *response, char const *key,
|
|
char const *value) {
|
|
return hs_response_set_header(response, key, value);
|
|
}
|
|
|
|
void http_response_status(http_response_t *response, int status) {
|
|
hs_response_set_status(response, status);
|
|
}
|
|
|
|
void http_response_body(http_response_t *response, char const *body,
|
|
int length) {
|
|
hs_response_set_body(response, body, length);
|
|
}
|
|
|
|
void http_respond(http_request_t *request, http_response_t *response) {
|
|
hs_request_respond(request, response, hs_request_begin_write);
|
|
}
|
|
|
|
void http_respond_chunk(http_request_t *request, http_response_t *response,
|
|
void (*cb)(http_request_t *)) {
|
|
hs_request_respond_chunk(request, response, cb, hs_request_begin_write);
|
|
}
|
|
|
|
void http_respond_chunk_end(http_request_t *request,
|
|
http_response_t *response) {
|
|
hs_request_respond_chunk_end(request, response, hs_request_begin_write);
|
|
}
|
|
|
|
http_string_t http_request_method(http_request_t *request) {
|
|
return hs_get_token_string(request, HSH_TOK_METHOD);
|
|
}
|
|
|
|
http_string_t http_request_target(http_request_t *request) {
|
|
return hs_get_token_string(request, HSH_TOK_TARGET);
|
|
}
|
|
|
|
http_string_t http_request_body(http_request_t *request) {
|
|
return hs_get_token_string(request, HSH_TOK_BODY);
|
|
}
|
|
|
|
int http_server_listen(http_server_t *serv) {
|
|
return hs_server_run_event_loop(serv, NULL);
|
|
}
|
|
|
|
int http_server_listen_addr(http_server_t *serv, const char *ipaddr) {
|
|
return hs_server_run_event_loop(serv, ipaddr);
|
|
}
|
|
|
|
int http_server_poll(http_server_t *serv) {
|
|
return hs_server_poll_events(serv);
|
|
}
|
|
|
|
int http_server_listen_poll(http_server_t *serv) {
|
|
hs_server_listen_on_addr(serv, NULL);
|
|
return 0;
|
|
}
|
|
|
|
int http_server_listen_addr_poll(http_server_t *serv, const char *ipaddr) {
|
|
hs_server_listen_on_addr(serv, ipaddr);
|
|
return 0;
|
|
}
|
|
|
|
void http_request_read_chunk(struct http_request_s *request,
|
|
void (*chunk_cb)(struct http_request_s *)) {
|
|
request->state = HTTP_SESSION_READ;
|
|
request->chunk_cb = chunk_cb;
|
|
hs_request_begin_read(request);
|
|
}
|