Rename HTTP_ResponseHandle to HTTP_ResponseBuilder
This commit is contained in:
@@ -41,13 +41,13 @@ int main(void)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
HTTP_Request *req;
|
HTTP_Request *req;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder builder;
|
||||||
http_server_wait(server, &req, &res);
|
http_server_wait(server, &req, &builder);
|
||||||
|
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(builder, 200);
|
||||||
http_response_header(res, "Content-Type: text/plain");
|
http_response_builder_header(builder, "Content-Type: text/plain");
|
||||||
http_response_body(res, HTTP_STR("Hello, world!"));
|
http_response_builder_body(builder, HTTP_STR("Hello, world!"));
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
http_server_free(server);
|
http_server_free(server);
|
||||||
|
|||||||
@@ -4279,7 +4279,7 @@ int http_client_wait(HTTP_Client *client, HTTP_Response **result, void **user_da
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClientConnection *builder2conn(HTTP_RequestBuilder handle)
|
static ClientConnection *client_builder_to_conn(HTTP_RequestBuilder handle)
|
||||||
{
|
{
|
||||||
if (handle.data0 == NULL)
|
if (handle.data0 == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -4299,7 +4299,7 @@ static ClientConnection *builder2conn(HTTP_RequestBuilder handle)
|
|||||||
|
|
||||||
void http_request_builder_user_data(HTTP_RequestBuilder builder, void *user_data)
|
void http_request_builder_user_data(HTTP_RequestBuilder builder, void *user_data)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(builder);
|
ClientConnection *conn = client_builder_to_conn(builder);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -4310,7 +4310,7 @@ void http_request_builder_user_data(HTTP_RequestBuilder builder, void *user_data
|
|||||||
|
|
||||||
void http_request_builder_trace(HTTP_RequestBuilder builder, bool trace)
|
void http_request_builder_trace(HTTP_RequestBuilder builder, bool trace)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(builder);
|
ClientConnection *conn = client_builder_to_conn(builder);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -4321,7 +4321,7 @@ void http_request_builder_trace(HTTP_RequestBuilder builder, bool trace)
|
|||||||
|
|
||||||
void http_request_builder_line(HTTP_RequestBuilder builder, HTTP_Method method, HTTP_String url)
|
void http_request_builder_line(HTTP_RequestBuilder builder, HTTP_Method method, HTTP_String url)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(builder);
|
ClientConnection *conn = client_builder_to_conn(builder);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -4369,7 +4369,7 @@ void http_request_builder_line(HTTP_RequestBuilder builder, HTTP_Method method,
|
|||||||
|
|
||||||
void http_request_builder_header(HTTP_RequestBuilder handle, HTTP_String str)
|
void http_request_builder_header(HTTP_RequestBuilder handle, HTTP_String str)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(handle);
|
ClientConnection *conn = client_builder_to_conn(handle);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -4380,7 +4380,7 @@ void http_request_builder_header(HTTP_RequestBuilder handle, HTTP_String str)
|
|||||||
|
|
||||||
void http_request_builder_body(HTTP_RequestBuilder handle, HTTP_String str)
|
void http_request_builder_body(HTTP_RequestBuilder handle, HTTP_String str)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(handle);
|
ClientConnection *conn = client_builder_to_conn(handle);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -4392,7 +4392,7 @@ void http_request_builder_body(HTTP_RequestBuilder handle, HTTP_String str)
|
|||||||
void http_request_builder_submit(HTTP_RequestBuilder handle)
|
void http_request_builder_submit(HTTP_RequestBuilder handle)
|
||||||
{
|
{
|
||||||
HTTP_Client *client = handle.data0;
|
HTTP_Client *client = handle.data0;
|
||||||
ClientConnection *conn = builder2conn(handle);
|
ClientConnection *conn = client_builder_to_conn(handle);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT &&
|
if (conn->state != CLIENT_CONNECTION_INIT &&
|
||||||
@@ -4600,7 +4600,7 @@ static void* server_memfunc(HTTP_MemoryFuncTag tag, void *ptr, int len, void *da
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandle *handle)
|
int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseBuilder *builder)
|
||||||
{
|
{
|
||||||
while (server->ready_count == 0) {
|
while (server->ready_count == 0) {
|
||||||
|
|
||||||
@@ -4701,63 +4701,63 @@ int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandl
|
|||||||
server->ready_count--;
|
server->ready_count--;
|
||||||
|
|
||||||
*req = http_engine_getreq(&server->conns[index].engine);
|
*req = http_engine_getreq(&server->conns[index].engine);
|
||||||
*handle = (HTTP_ResponseHandle) { server, index, server->conns[index].gen };
|
*builder = (HTTP_ResponseBuilder) { server, index, server->conns[index].gen };
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Connection*
|
static Connection*
|
||||||
handle2conn(HTTP_ResponseHandle handle)
|
server_builder_to_conn(HTTP_ResponseBuilder builder)
|
||||||
{
|
{
|
||||||
HTTP_Server *server = handle.data0;
|
HTTP_Server *server = builder.data0;
|
||||||
if (handle.data1 >= MAX_CONNS)
|
if (builder.data1 >= MAX_CONNS)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
Connection *conn = &server->conns[handle.data1];
|
Connection *conn = &server->conns[builder.data1];
|
||||||
if (conn->gen != handle.data2)
|
if (conn->gen != builder.data2)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_status(HTTP_ResponseHandle res, int status)
|
void http_response_builder_status(HTTP_ResponseBuilder res, int status)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_status(&conn->engine, status);
|
http_engine_status(&conn->engine, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_header(HTTP_ResponseHandle res, HTTP_String str)
|
void http_response_builder_header(HTTP_ResponseBuilder res, HTTP_String str)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_header(&conn->engine, str);
|
http_engine_header(&conn->engine, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_body(HTTP_ResponseHandle res, HTTP_String str)
|
void http_response_builder_body(HTTP_ResponseBuilder res, HTTP_String str)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_body(&conn->engine, str);
|
http_engine_body(&conn->engine, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_bodycap(HTTP_ResponseHandle res, int mincap)
|
void http_response_builder_bodycap(HTTP_ResponseBuilder res, int mincap)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_bodycap(&conn->engine, mincap);
|
http_engine_bodycap(&conn->engine, mincap);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *http_response_bodybuf(HTTP_ResponseHandle res, int *cap)
|
char *http_response_builder_bodybuf(HTTP_ResponseBuilder res, int *cap)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL) {
|
if (conn == NULL) {
|
||||||
*cap = 0;
|
*cap = 0;
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -4766,28 +4766,28 @@ char *http_response_bodybuf(HTTP_ResponseHandle res, int *cap)
|
|||||||
return http_engine_bodybuf(&conn->engine, cap);
|
return http_engine_bodybuf(&conn->engine, cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_bodyack(HTTP_ResponseHandle res, int num)
|
void http_response_builder_bodyack(HTTP_ResponseBuilder res, int num)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_bodyack(&conn->engine, num);
|
http_engine_bodyack(&conn->engine, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_undo(HTTP_ResponseHandle res)
|
void http_response_builder_undo(HTTP_ResponseBuilder res)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_undo(&conn->engine);
|
http_engine_undo(&conn->engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_done(HTTP_ResponseHandle res)
|
void http_response_builder_done(HTTP_ResponseBuilder res)
|
||||||
{
|
{
|
||||||
HTTP_Server *server = res.data0;
|
HTTP_Server *server = res.data0;
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -5117,7 +5117,7 @@ static int file_read(File file, char *dst, int max)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoint, HTTP_String base_path, HTTP_String endpoint)
|
static int serve_file_or_index(HTTP_ResponseBuilder res, HTTP_String base_endpoint, HTTP_String base_path, HTTP_String endpoint)
|
||||||
{
|
{
|
||||||
char mem[1<<12];
|
char mem[1<<12];
|
||||||
int ret = swap_parents(base_endpoint, base_path, endpoint, mem, sizeof(mem));
|
int ret = swap_parents(base_endpoint, base_path, endpoint, mem, sizeof(mem));
|
||||||
@@ -5129,8 +5129,8 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
File file;
|
File file;
|
||||||
ret = file_open(path.ptr, &file, &size);
|
ret = file_open(path.ptr, &file, &size);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
@@ -5139,8 +5139,8 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
|
|
||||||
char index[] = "index.html";
|
char index[] = "index.html";
|
||||||
if (path.len + sizeof(index) + 1 > sizeof(mem)) {
|
if (path.len + sizeof(index) + 1 > sizeof(mem)) {
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
path.ptr[path.len++] = '/';
|
path.ptr[path.len++] = '/';
|
||||||
@@ -5149,8 +5149,8 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
|
|
||||||
ret = file_open(path.ptr, &file, &size);
|
ret = file_open(path.ptr, &file, &size);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (ret == 1)
|
if (ret == 1)
|
||||||
@@ -5160,9 +5160,9 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
|
|
||||||
int cap;
|
int cap;
|
||||||
char *dst;
|
char *dst;
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(res, 200);
|
||||||
http_response_bodycap(res, size);
|
http_response_builder_bodycap(res, size);
|
||||||
dst = http_response_bodybuf(res, &cap);
|
dst = http_response_builder_bodybuf(res, &cap);
|
||||||
if (dst) {
|
if (dst) {
|
||||||
int copied = 0;
|
int copied = 0;
|
||||||
while (copied < size) {
|
while (copied < size) {
|
||||||
@@ -5172,28 +5172,28 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
copied += ret;
|
copied += ret;
|
||||||
}
|
}
|
||||||
if (copied < size) goto err;
|
if (copied < size) goto err;
|
||||||
http_response_bodyack(res, size);
|
http_response_builder_bodyack(res, size);
|
||||||
}
|
}
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
file_close(file);
|
file_close(file);
|
||||||
return 1;
|
return 1;
|
||||||
err:
|
err:
|
||||||
http_response_bodyack(res, 0);
|
http_response_builder_bodyack(res, 0);
|
||||||
http_response_undo(res);
|
http_response_builder_undo(res);
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
file_close(file);
|
file_close(file);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int serve_dynamic_route(Route *route, HTTP_Request *req, HTTP_ResponseHandle res)
|
static int serve_dynamic_route(Route *route, HTTP_Request *req, HTTP_ResponseBuilder res)
|
||||||
{
|
{
|
||||||
char path_mem[1<<12];
|
char path_mem[1<<12];
|
||||||
int path_len = sanitize_path(req->url.path, path_mem, (int) sizeof(path_mem));
|
int path_len = sanitize_path(req->url.path, path_mem, (int) sizeof(path_mem));
|
||||||
if (path_len < 0) {
|
if (path_len < 0) {
|
||||||
http_response_status(res, 400);
|
http_response_builder_status(res, 400);
|
||||||
http_response_body(res, HTTP_STR("Invalid path"));
|
http_response_builder_body(res, HTTP_STR("Invalid path"));
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
HTTP_String path = {path_mem, path_len};
|
HTTP_String path = {path_mem, path_len};
|
||||||
@@ -5205,7 +5205,7 @@ static int serve_dynamic_route(Route *route, HTTP_Request *req, HTTP_ResponseHan
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_router_resolve(HTTP_Router *router, HTTP_Request *req, HTTP_ResponseHandle res)
|
void http_router_resolve(HTTP_Router *router, HTTP_Request *req, HTTP_ResponseBuilder res)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < router->num_routes; i++) {
|
for (int i = 0; i < router->num_routes; i++) {
|
||||||
Route *route = &router->routes[i];
|
Route *route = &router->routes[i];
|
||||||
@@ -5224,13 +5224,13 @@ void http_router_resolve(HTTP_Router *router, HTTP_Request *req, HTTP_ResponseHa
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
http_response_status(res, 404);
|
http_response_builder_status(res, 404);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
int http_serve(char *addr, int port, HTTP_Router *router)
|
int http_serve(char *addr, int port, HTTP_Router *router)
|
||||||
@@ -5245,7 +5245,7 @@ int http_serve(char *addr, int port, HTTP_Router *router)
|
|||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
HTTP_Request *req;
|
HTTP_Request *req;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder res;
|
||||||
ret = http_server_wait(server, &req, &res);
|
ret = http_server_wait(server, &req, &res);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
http_server_free(server);
|
http_server_free(server);
|
||||||
|
|||||||
@@ -471,7 +471,7 @@ typedef struct {
|
|||||||
void *data0;
|
void *data0;
|
||||||
int data1;
|
int data1;
|
||||||
int data2;
|
int data2;
|
||||||
} HTTP_ResponseHandle;
|
} HTTP_ResponseBuilder;
|
||||||
|
|
||||||
typedef struct HTTP_Server HTTP_Server;
|
typedef struct HTTP_Server HTTP_Server;
|
||||||
|
|
||||||
@@ -481,16 +481,16 @@ HTTP_Server *http_server_init_ex(HTTP_String addr, uint16_t port,
|
|||||||
uint16_t secure_port, HTTP_String cert_key, HTTP_String private_key);
|
uint16_t secure_port, HTTP_String cert_key, HTTP_String private_key);
|
||||||
|
|
||||||
void http_server_free (HTTP_Server *server);
|
void http_server_free (HTTP_Server *server);
|
||||||
int http_server_wait (HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandle *handle);
|
int http_server_wait (HTTP_Server *server, HTTP_Request **req, HTTP_ResponseBuilder *handle);
|
||||||
int http_server_add_website (HTTP_Server *server, HTTP_String domain, HTTP_String cert_file, HTTP_String key_file);
|
int http_server_add_website (HTTP_Server *server, HTTP_String domain, HTTP_String cert_file, HTTP_String key_file);
|
||||||
void http_response_status (HTTP_ResponseHandle res, int status);
|
void http_response_builder_status (HTTP_ResponseBuilder res, int status);
|
||||||
void http_response_header (HTTP_ResponseHandle res, HTTP_String str);
|
void http_response_builder_header (HTTP_ResponseBuilder res, HTTP_String str);
|
||||||
void http_response_body (HTTP_ResponseHandle res, HTTP_String str);
|
void http_response_builder_body (HTTP_ResponseBuilder res, HTTP_String str);
|
||||||
void http_response_bodycap (HTTP_ResponseHandle res, int mincap);
|
void http_response_builder_bodycap (HTTP_ResponseBuilder res, int mincap);
|
||||||
char* http_response_bodybuf (HTTP_ResponseHandle res, int *cap);
|
char* http_response_builder_bodybuf (HTTP_ResponseBuilder res, int *cap);
|
||||||
void http_response_bodyack (HTTP_ResponseHandle res, int num);
|
void http_response_builder_bodyack (HTTP_ResponseBuilder res, int num);
|
||||||
void http_response_undo (HTTP_ResponseHandle res);
|
void http_response_builder_undo (HTTP_ResponseBuilder res);
|
||||||
void http_response_done (HTTP_ResponseHandle res);
|
void http_response_builder_done (HTTP_ResponseBuilder res);
|
||||||
|
|
||||||
#endif // HTTP_SERVER_INCLUDED
|
#endif // HTTP_SERVER_INCLUDED
|
||||||
|
|
||||||
@@ -507,11 +507,11 @@ void http_response_done (HTTP_ResponseHandle res);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct HTTP_Router HTTP_Router;
|
typedef struct HTTP_Router HTTP_Router;
|
||||||
typedef void (*HTTP_RouterFunc)(HTTP_Request*, HTTP_ResponseHandle, void*);;
|
typedef void (*HTTP_RouterFunc)(HTTP_Request*, HTTP_ResponseBuilder, void*);;
|
||||||
|
|
||||||
HTTP_Router* http_router_init (void);
|
HTTP_Router* http_router_init (void);
|
||||||
void http_router_free (HTTP_Router *router);
|
void http_router_free (HTTP_Router *router);
|
||||||
void http_router_resolve (HTTP_Router *router, HTTP_Request *req, HTTP_ResponseHandle res);
|
void http_router_resolve (HTTP_Router *router, HTTP_Request *req, HTTP_ResponseBuilder res);
|
||||||
void http_router_dir (HTTP_Router *router, HTTP_String endpoint, HTTP_String path);
|
void http_router_dir (HTTP_Router *router, HTTP_String endpoint, HTTP_String path);
|
||||||
void http_router_func (HTTP_Router *router, HTTP_Method method, HTTP_String endpoint, HTTP_RouterFunc func, void*);
|
void http_router_func (HTTP_Router *router, HTTP_Method method, HTTP_String endpoint, HTTP_RouterFunc func, void*);
|
||||||
int http_serve (char *addr, int port, HTTP_Router *router);
|
int http_serve (char *addr, int port, HTTP_Router *router);
|
||||||
|
|||||||
@@ -30,10 +30,10 @@ int main(void)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
HTTP_Request *req;
|
HTTP_Request *req;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder builder;
|
||||||
|
|
||||||
// Block until a request is available
|
// Block until a request is available
|
||||||
int ret = http_server_wait(server, &req, &res);
|
int ret = http_server_wait(server, &req, &builder);
|
||||||
|
|
||||||
// The wait functions returns 0 on success and -1
|
// The wait functions returns 0 on success and -1
|
||||||
// on error. By "error" I mean an unrecoverable
|
// on error. By "error" I mean an unrecoverable
|
||||||
@@ -70,19 +70,19 @@ int main(void)
|
|||||||
// order.
|
// order.
|
||||||
|
|
||||||
// First the status code
|
// First the status code
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(builder, 200);
|
||||||
|
|
||||||
// Then zero or more headers
|
// Then zero or more headers
|
||||||
http_response_header(res, HTTP_STR("Content-Type: text/plain"));
|
http_response_builder_header(builder, HTTP_STR("Content-Type: text/plain"));
|
||||||
|
|
||||||
// Then you can write zero or more chunks of the response body
|
// Then you can write zero or more chunks of the response body
|
||||||
http_response_body(res, HTTP_STR("Hello"));
|
http_response_builder_body(builder, HTTP_STR("Hello"));
|
||||||
http_response_body(res, HTTP_STR(", world!"));
|
http_response_builder_body(builder, HTTP_STR(", world!"));
|
||||||
|
|
||||||
// Then, mark the request as complete (Very important or the server will hang!)
|
// Then, mark the request as complete (Very important or the server will hang!)
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
|
|
||||||
// Note that none of the http_response_* functions return errors.
|
// Note that none of the http_response_builder_* functions return errors.
|
||||||
// This is by design to simplify user endpoint code. If at any point
|
// This is by design to simplify user endpoint code. If at any point
|
||||||
// something goes wrong, the server will send a code 4xx or 5xx to
|
// something goes wrong, the server will send a code 4xx or 5xx to
|
||||||
// the client or abort the TCP connection entirely.
|
// the client or abort the TCP connection entirely.
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ int main(void)
|
|||||||
http_global_init();
|
http_global_init();
|
||||||
|
|
||||||
// All the setup is identical to the previous example.
|
// All the setup is identical to the previous example.
|
||||||
// The only thing that changes where "http_response_body"
|
// The only thing that changes where "http_response_builder_body"
|
||||||
// is called.
|
// is called.
|
||||||
|
|
||||||
HTTP_Server *server = http_server_init(HTTP_STR("127.0.0.1"), 8080);
|
HTTP_Server *server = http_server_init(HTTP_STR("127.0.0.1"), 8080);
|
||||||
@@ -19,19 +19,19 @@ int main(void)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
HTTP_Request *req;
|
HTTP_Request *req;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder builder;
|
||||||
|
|
||||||
int ret = http_server_wait(server, &req, &res);
|
int ret = http_server_wait(server, &req, &builder);
|
||||||
if (ret < 0) return -1;
|
if (ret < 0) return -1;
|
||||||
|
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(builder, 200);
|
||||||
http_response_header(res, HTTP_STR("Content-Type: text/plain"));
|
http_response_builder_header(builder, HTTP_STR("Content-Type: text/plain"));
|
||||||
|
|
||||||
// The previous example used the *_body function to
|
// The previous example used the *_body function to
|
||||||
// write the response body in chunks:
|
// write the response body in chunks:
|
||||||
//
|
//
|
||||||
// http_response_body(res, HTTP_STR("Hello"));
|
// http_response_builder_body(builder, HTTP_STR("Hello"));
|
||||||
// http_response_body(res, HTTP_STR(", world!"));
|
// http_response_builder_body(builder, HTTP_STR(", world!"));
|
||||||
//
|
//
|
||||||
// This function reads from an user buffer and copies
|
// This function reads from an user buffer and copies
|
||||||
// the data in the connection's output buffer. If the
|
// the data in the connection's output buffer. If the
|
||||||
@@ -53,7 +53,7 @@ int main(void)
|
|||||||
int example_data_len = sizeof(example_data)-1;
|
int example_data_len = sizeof(example_data)-1;
|
||||||
|
|
||||||
// Tell the server how much data we are going to write
|
// Tell the server how much data we are going to write
|
||||||
http_response_bodycap(res, example_data_len);
|
http_response_builder_bodycap(builder, example_data_len);
|
||||||
|
|
||||||
int cap;
|
int cap;
|
||||||
char *dst;
|
char *dst;
|
||||||
@@ -62,7 +62,7 @@ int main(void)
|
|||||||
// output parameter [cap] is the capacity of the region
|
// output parameter [cap] is the capacity of the region
|
||||||
// and is equal or larger than the data we requested
|
// and is equal or larger than the data we requested
|
||||||
// with *_bodycap
|
// with *_bodycap
|
||||||
dst = http_response_bodybuf(res, &cap);
|
dst = http_response_builder_bodybuf(builder, &cap);
|
||||||
|
|
||||||
// Write the data directly into the output buffer. In
|
// Write the data directly into the output buffer. In
|
||||||
// this example we are copying from memory, but you could
|
// this example we are copying from memory, but you could
|
||||||
@@ -73,7 +73,7 @@ int main(void)
|
|||||||
|
|
||||||
// Tell the server how much bytes we have written to
|
// Tell the server how much bytes we have written to
|
||||||
// the provided region.
|
// the provided region.
|
||||||
http_response_bodyack(res, example_data_len);
|
http_response_builder_bodyack(builder, example_data_len);
|
||||||
|
|
||||||
// The reason we had to guard the [memcpy] by checking the
|
// The reason we had to guard the [memcpy] by checking the
|
||||||
// [dst] pointer is that if an error occurred internally
|
// [dst] pointer is that if an error occurred internally
|
||||||
@@ -84,7 +84,7 @@ int main(void)
|
|||||||
// as nothing bad happened.
|
// as nothing bad happened.
|
||||||
|
|
||||||
// As usual, mark the response as complete
|
// As usual, mark the response as complete
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
|
|
||||||
// If we're being being honest, this is not a zero-copy
|
// If we're being being honest, this is not a zero-copy
|
||||||
// interface. It's more like an N-1 copy interface as in
|
// interface. It's more like an N-1 copy interface as in
|
||||||
|
|||||||
@@ -15,15 +15,15 @@ int main(void)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
HTTP_Request *req;
|
HTTP_Request *req;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder builder;
|
||||||
|
|
||||||
int ret = http_server_wait(server, &req, &res);
|
int ret = http_server_wait(server, &req, &builder);
|
||||||
if (ret < 0) return -1;
|
if (ret < 0) return -1;
|
||||||
|
|
||||||
// Say we are building a request..
|
// Say we are building a request..
|
||||||
|
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(builder, 200);
|
||||||
http_response_header(res, HTTP_STR("Content-Type: text/plain"));
|
http_response_builder_header(builder, HTTP_STR("Content-Type: text/plain"));
|
||||||
|
|
||||||
// .. and in the middle of building an error condition
|
// .. and in the middle of building an error condition
|
||||||
// occurs. Maybe a file was missing or an allocation fails.
|
// occurs. Maybe a file was missing or an allocation fails.
|
||||||
@@ -37,19 +37,19 @@ int main(void)
|
|||||||
bool error_occurred = true;
|
bool error_occurred = true;
|
||||||
if (error_occurred) {
|
if (error_occurred) {
|
||||||
|
|
||||||
http_response_undo(res);
|
http_response_builder_undo(builder);
|
||||||
|
|
||||||
// Now we are back to setting the status code
|
// Now we are back to setting the status code
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(builder, 500);
|
||||||
http_response_header(res, HTTP_STR("Content-Type: text/plain"));
|
http_response_builder_header(builder, HTTP_STR("Content-Type: text/plain"));
|
||||||
http_response_body(res, HTTP_STR("An error occurred!"));
|
http_response_builder_body(builder, HTTP_STR("An error occurred!"));
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// If no error occures, we finish as planned
|
// If no error occures, we finish as planned
|
||||||
http_response_body(res, HTTP_STR("Hello, world!"));
|
http_response_builder_body(builder, HTTP_STR("Hello, world!"));
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ typedef enum {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
JobType type;
|
JobType type;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder builder;
|
||||||
} Job;
|
} Job;
|
||||||
|
|
||||||
// Maximum number of jobs that can be buffered at once
|
// Maximum number of jobs that can be buffered at once
|
||||||
@@ -100,15 +100,15 @@ ThreadReturn worker(void*)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case JOB_A:
|
case JOB_A:
|
||||||
http_response_status(job.res, 200);
|
http_response_builder_status(job.builder, 200);
|
||||||
http_response_body(job.res, HTTP_STR("Job A completed"));
|
http_response_builder_body(job.builder, HTTP_STR("Job A completed"));
|
||||||
http_response_done(job.res);
|
http_response_builder_done(job.builder);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JOB_B:
|
case JOB_B:
|
||||||
http_response_status(job.res, 200);
|
http_response_builder_status(job.builder, 200);
|
||||||
http_response_body(job.res, HTTP_STR("Job B completed"));
|
http_response_builder_body(job.builder, HTTP_STR("Job B completed"));
|
||||||
http_response_done(job.res);
|
http_response_builder_done(job.builder);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -131,9 +131,9 @@ int main(void)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
HTTP_Request *req;
|
HTTP_Request *req;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder builder;
|
||||||
|
|
||||||
int ret = http_server_wait(server, &req, &res);
|
int ret = http_server_wait(server, &req, &builder);
|
||||||
if (ret < 0) return -1;
|
if (ret < 0) return -1;
|
||||||
|
|
||||||
if (http_streq(req->url.path, HTTP_STR("/endpoint_A"))) {
|
if (http_streq(req->url.path, HTTP_STR("/endpoint_A"))) {
|
||||||
@@ -143,7 +143,7 @@ int main(void)
|
|||||||
|
|
||||||
Job job;
|
Job job;
|
||||||
job.type = JOB_A;
|
job.type = JOB_A;
|
||||||
job.res = res;
|
job.builder = builder;
|
||||||
push_job(job, true);
|
push_job(job, true);
|
||||||
|
|
||||||
} else if (http_streq(req->url.path, HTTP_STR("/endpoint_B"))) {
|
} else if (http_streq(req->url.path, HTTP_STR("/endpoint_B"))) {
|
||||||
@@ -155,18 +155,18 @@ int main(void)
|
|||||||
|
|
||||||
Job job;
|
Job job;
|
||||||
job.type = JOB_B;
|
job.type = JOB_B;
|
||||||
job.res = res;
|
job.builder = builder;
|
||||||
if (!push_job(job, false)) {
|
if (!push_job(job, false)) {
|
||||||
http_response_status(res, 503);
|
http_response_builder_status(builder, 503);
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Other endpoints may resolve immediately
|
// Other endpoints may resolve immediately
|
||||||
|
|
||||||
http_response_status(res, 404);
|
http_response_builder_status(builder, 404);
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,16 +60,16 @@ int main(void)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
HTTP_Request *req;
|
HTTP_Request *req;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder builder;
|
||||||
|
|
||||||
int ret = http_server_wait(server, &req, &res);
|
int ret = http_server_wait(server, &req, &builder);
|
||||||
if (ret < 0) return -1;
|
if (ret < 0) return -1;
|
||||||
|
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(builder, 200);
|
||||||
http_response_header(res, HTTP_STR("Content-Type: text/plain"));
|
http_response_builder_header(builder, HTTP_STR("Content-Type: text/plain"));
|
||||||
http_response_body(res, HTTP_STR("Hello"));
|
http_response_builder_body(builder, HTTP_STR("Hello"));
|
||||||
http_response_body(res, HTTP_STR(", world!"));
|
http_response_builder_body(builder, HTTP_STR(", world!"));
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
http_server_free(server);
|
http_server_free(server);
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ int main(void)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
HTTP_Request *req;
|
HTTP_Request *req;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder builder;
|
||||||
ret = http_server_wait(server, &req, &res);
|
ret = http_server_wait(server, &req, &builder);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -98,24 +98,24 @@ int main(void)
|
|||||||
|
|
||||||
if (http_streq(host, HTTP_STR("websiteB.com"))) {
|
if (http_streq(host, HTTP_STR("websiteB.com"))) {
|
||||||
|
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(builder, 200);
|
||||||
http_response_body(res, HTTP_STR("Hello from websiteB.com!"));
|
http_response_builder_body(builder, HTTP_STR("Hello from websiteB.com!"));
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
|
|
||||||
} else if (http_streq(host, HTTP_STR("websiteC.com"))) {
|
} else if (http_streq(host, HTTP_STR("websiteC.com"))) {
|
||||||
|
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(builder, 200);
|
||||||
http_response_body(res, HTTP_STR("Hello from websiteC.com!"));
|
http_response_builder_body(builder, HTTP_STR("Hello from websiteC.com!"));
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Serve websiteA.com by default to be consistent
|
// Serve websiteA.com by default to be consistent
|
||||||
// with the certificate setup
|
// with the certificate setup
|
||||||
|
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(builder, 200);
|
||||||
http_response_body(res, HTTP_STR("Hello from websiteA.com!"));
|
http_response_builder_body(builder, HTTP_STR("Hello from websiteA.com!"));
|
||||||
http_response_done(res);
|
http_response_builder_done(builder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-7
@@ -230,7 +230,7 @@ int http_client_wait(HTTP_Client *client, HTTP_Response **result, void **user_da
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClientConnection *builder2conn(HTTP_RequestBuilder handle)
|
static ClientConnection *client_builder_to_conn(HTTP_RequestBuilder handle)
|
||||||
{
|
{
|
||||||
if (handle.data0 == NULL)
|
if (handle.data0 == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -250,7 +250,7 @@ static ClientConnection *builder2conn(HTTP_RequestBuilder handle)
|
|||||||
|
|
||||||
void http_request_builder_user_data(HTTP_RequestBuilder builder, void *user_data)
|
void http_request_builder_user_data(HTTP_RequestBuilder builder, void *user_data)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(builder);
|
ClientConnection *conn = client_builder_to_conn(builder);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -261,7 +261,7 @@ void http_request_builder_user_data(HTTP_RequestBuilder builder, void *user_data
|
|||||||
|
|
||||||
void http_request_builder_trace(HTTP_RequestBuilder builder, bool trace)
|
void http_request_builder_trace(HTTP_RequestBuilder builder, bool trace)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(builder);
|
ClientConnection *conn = client_builder_to_conn(builder);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -272,7 +272,7 @@ void http_request_builder_trace(HTTP_RequestBuilder builder, bool trace)
|
|||||||
|
|
||||||
void http_request_builder_line(HTTP_RequestBuilder builder, HTTP_Method method, HTTP_String url)
|
void http_request_builder_line(HTTP_RequestBuilder builder, HTTP_Method method, HTTP_String url)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(builder);
|
ClientConnection *conn = client_builder_to_conn(builder);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -320,7 +320,7 @@ void http_request_builder_line(HTTP_RequestBuilder builder, HTTP_Method method,
|
|||||||
|
|
||||||
void http_request_builder_header(HTTP_RequestBuilder handle, HTTP_String str)
|
void http_request_builder_header(HTTP_RequestBuilder handle, HTTP_String str)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(handle);
|
ClientConnection *conn = client_builder_to_conn(handle);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -331,7 +331,7 @@ void http_request_builder_header(HTTP_RequestBuilder handle, HTTP_String str)
|
|||||||
|
|
||||||
void http_request_builder_body(HTTP_RequestBuilder handle, HTTP_String str)
|
void http_request_builder_body(HTTP_RequestBuilder handle, HTTP_String str)
|
||||||
{
|
{
|
||||||
ClientConnection *conn = builder2conn(handle);
|
ClientConnection *conn = client_builder_to_conn(handle);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT)
|
if (conn->state != CLIENT_CONNECTION_INIT)
|
||||||
@@ -343,7 +343,7 @@ void http_request_builder_body(HTTP_RequestBuilder handle, HTTP_String str)
|
|||||||
void http_request_builder_submit(HTTP_RequestBuilder handle)
|
void http_request_builder_submit(HTTP_RequestBuilder handle)
|
||||||
{
|
{
|
||||||
HTTP_Client *client = handle.data0;
|
HTTP_Client *client = handle.data0;
|
||||||
ClientConnection *conn = builder2conn(handle);
|
ClientConnection *conn = client_builder_to_conn(handle);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
if (conn->state != CLIENT_CONNECTION_INIT &&
|
if (conn->state != CLIENT_CONNECTION_INIT &&
|
||||||
|
|||||||
+26
-26
@@ -301,7 +301,7 @@ static int file_read(File file, char *dst, int max)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoint, HTTP_String base_path, HTTP_String endpoint)
|
static int serve_file_or_index(HTTP_ResponseBuilder res, HTTP_String base_endpoint, HTTP_String base_path, HTTP_String endpoint)
|
||||||
{
|
{
|
||||||
char mem[1<<12];
|
char mem[1<<12];
|
||||||
int ret = swap_parents(base_endpoint, base_path, endpoint, mem, sizeof(mem));
|
int ret = swap_parents(base_endpoint, base_path, endpoint, mem, sizeof(mem));
|
||||||
@@ -313,8 +313,8 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
File file;
|
File file;
|
||||||
ret = file_open(path.ptr, &file, &size);
|
ret = file_open(path.ptr, &file, &size);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
@@ -323,8 +323,8 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
|
|
||||||
char index[] = "index.html";
|
char index[] = "index.html";
|
||||||
if (path.len + sizeof(index) + 1 > sizeof(mem)) {
|
if (path.len + sizeof(index) + 1 > sizeof(mem)) {
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
path.ptr[path.len++] = '/';
|
path.ptr[path.len++] = '/';
|
||||||
@@ -333,8 +333,8 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
|
|
||||||
ret = file_open(path.ptr, &file, &size);
|
ret = file_open(path.ptr, &file, &size);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (ret == 1)
|
if (ret == 1)
|
||||||
@@ -344,9 +344,9 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
|
|
||||||
int cap;
|
int cap;
|
||||||
char *dst;
|
char *dst;
|
||||||
http_response_status(res, 200);
|
http_response_builder_status(res, 200);
|
||||||
http_response_bodycap(res, size);
|
http_response_builder_bodycap(res, size);
|
||||||
dst = http_response_bodybuf(res, &cap);
|
dst = http_response_builder_bodybuf(res, &cap);
|
||||||
if (dst) {
|
if (dst) {
|
||||||
int copied = 0;
|
int copied = 0;
|
||||||
while (copied < size) {
|
while (copied < size) {
|
||||||
@@ -356,28 +356,28 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin
|
|||||||
copied += ret;
|
copied += ret;
|
||||||
}
|
}
|
||||||
if (copied < size) goto err;
|
if (copied < size) goto err;
|
||||||
http_response_bodyack(res, size);
|
http_response_builder_bodyack(res, size);
|
||||||
}
|
}
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
file_close(file);
|
file_close(file);
|
||||||
return 1;
|
return 1;
|
||||||
err:
|
err:
|
||||||
http_response_bodyack(res, 0);
|
http_response_builder_bodyack(res, 0);
|
||||||
http_response_undo(res);
|
http_response_builder_undo(res);
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
file_close(file);
|
file_close(file);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int serve_dynamic_route(Route *route, HTTP_Request *req, HTTP_ResponseHandle res)
|
static int serve_dynamic_route(Route *route, HTTP_Request *req, HTTP_ResponseBuilder res)
|
||||||
{
|
{
|
||||||
char path_mem[1<<12];
|
char path_mem[1<<12];
|
||||||
int path_len = sanitize_path(req->url.path, path_mem, (int) sizeof(path_mem));
|
int path_len = sanitize_path(req->url.path, path_mem, (int) sizeof(path_mem));
|
||||||
if (path_len < 0) {
|
if (path_len < 0) {
|
||||||
http_response_status(res, 400);
|
http_response_builder_status(res, 400);
|
||||||
http_response_body(res, HTTP_STR("Invalid path"));
|
http_response_builder_body(res, HTTP_STR("Invalid path"));
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
HTTP_String path = {path_mem, path_len};
|
HTTP_String path = {path_mem, path_len};
|
||||||
@@ -389,7 +389,7 @@ static int serve_dynamic_route(Route *route, HTTP_Request *req, HTTP_ResponseHan
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_router_resolve(HTTP_Router *router, HTTP_Request *req, HTTP_ResponseHandle res)
|
void http_router_resolve(HTTP_Router *router, HTTP_Request *req, HTTP_ResponseBuilder res)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < router->num_routes; i++) {
|
for (int i = 0; i < router->num_routes; i++) {
|
||||||
Route *route = &router->routes[i];
|
Route *route = &router->routes[i];
|
||||||
@@ -408,13 +408,13 @@ void http_router_resolve(HTTP_Router *router, HTTP_Request *req, HTTP_ResponseHa
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
http_response_status(res, 500);
|
http_response_builder_status(res, 500);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
http_response_status(res, 404);
|
http_response_builder_status(res, 404);
|
||||||
http_response_done(res);
|
http_response_builder_done(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
int http_serve(char *addr, int port, HTTP_Router *router)
|
int http_serve(char *addr, int port, HTTP_Router *router)
|
||||||
@@ -429,7 +429,7 @@ int http_serve(char *addr, int port, HTTP_Router *router)
|
|||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
HTTP_Request *req;
|
HTTP_Request *req;
|
||||||
HTTP_ResponseHandle res;
|
HTTP_ResponseBuilder res;
|
||||||
ret = http_server_wait(server, &req, &res);
|
ret = http_server_wait(server, &req, &res);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
http_server_free(server);
|
http_server_free(server);
|
||||||
|
|||||||
+2
-2
@@ -6,11 +6,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct HTTP_Router HTTP_Router;
|
typedef struct HTTP_Router HTTP_Router;
|
||||||
typedef void (*HTTP_RouterFunc)(HTTP_Request*, HTTP_ResponseHandle, void*);;
|
typedef void (*HTTP_RouterFunc)(HTTP_Request*, HTTP_ResponseBuilder, void*);;
|
||||||
|
|
||||||
HTTP_Router* http_router_init (void);
|
HTTP_Router* http_router_init (void);
|
||||||
void http_router_free (HTTP_Router *router);
|
void http_router_free (HTTP_Router *router);
|
||||||
void http_router_resolve (HTTP_Router *router, HTTP_Request *req, HTTP_ResponseHandle res);
|
void http_router_resolve (HTTP_Router *router, HTTP_Request *req, HTTP_ResponseBuilder res);
|
||||||
void http_router_dir (HTTP_Router *router, HTTP_String endpoint, HTTP_String path);
|
void http_router_dir (HTTP_Router *router, HTTP_String endpoint, HTTP_String path);
|
||||||
void http_router_func (HTTP_Router *router, HTTP_Method method, HTTP_String endpoint, HTTP_RouterFunc func, void*);
|
void http_router_func (HTTP_Router *router, HTTP_Method method, HTTP_String endpoint, HTTP_RouterFunc func, void*);
|
||||||
int http_serve (char *addr, int port, HTTP_Router *router);
|
int http_serve (char *addr, int port, HTTP_Router *router);
|
||||||
|
|||||||
+23
-23
@@ -95,7 +95,7 @@ static void* server_memfunc(HTTP_MemoryFuncTag tag, void *ptr, int len, void *da
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandle *handle)
|
int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseBuilder *builder)
|
||||||
{
|
{
|
||||||
while (server->ready_count == 0) {
|
while (server->ready_count == 0) {
|
||||||
|
|
||||||
@@ -196,63 +196,63 @@ int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandl
|
|||||||
server->ready_count--;
|
server->ready_count--;
|
||||||
|
|
||||||
*req = http_engine_getreq(&server->conns[index].engine);
|
*req = http_engine_getreq(&server->conns[index].engine);
|
||||||
*handle = (HTTP_ResponseHandle) { server, index, server->conns[index].gen };
|
*builder = (HTTP_ResponseBuilder) { server, index, server->conns[index].gen };
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Connection*
|
static Connection*
|
||||||
handle2conn(HTTP_ResponseHandle handle)
|
server_builder_to_conn(HTTP_ResponseBuilder builder)
|
||||||
{
|
{
|
||||||
HTTP_Server *server = handle.data0;
|
HTTP_Server *server = builder.data0;
|
||||||
if (handle.data1 >= MAX_CONNS)
|
if (builder.data1 >= MAX_CONNS)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
Connection *conn = &server->conns[handle.data1];
|
Connection *conn = &server->conns[builder.data1];
|
||||||
if (conn->gen != handle.data2)
|
if (conn->gen != builder.data2)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_status(HTTP_ResponseHandle res, int status)
|
void http_response_builder_status(HTTP_ResponseBuilder res, int status)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_status(&conn->engine, status);
|
http_engine_status(&conn->engine, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_header(HTTP_ResponseHandle res, HTTP_String str)
|
void http_response_builder_header(HTTP_ResponseBuilder res, HTTP_String str)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_header(&conn->engine, str);
|
http_engine_header(&conn->engine, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_body(HTTP_ResponseHandle res, HTTP_String str)
|
void http_response_builder_body(HTTP_ResponseBuilder res, HTTP_String str)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_body(&conn->engine, str);
|
http_engine_body(&conn->engine, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_bodycap(HTTP_ResponseHandle res, int mincap)
|
void http_response_builder_bodycap(HTTP_ResponseBuilder res, int mincap)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_bodycap(&conn->engine, mincap);
|
http_engine_bodycap(&conn->engine, mincap);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *http_response_bodybuf(HTTP_ResponseHandle res, int *cap)
|
char *http_response_builder_bodybuf(HTTP_ResponseBuilder res, int *cap)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL) {
|
if (conn == NULL) {
|
||||||
*cap = 0;
|
*cap = 0;
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -261,28 +261,28 @@ char *http_response_bodybuf(HTTP_ResponseHandle res, int *cap)
|
|||||||
return http_engine_bodybuf(&conn->engine, cap);
|
return http_engine_bodybuf(&conn->engine, cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_bodyack(HTTP_ResponseHandle res, int num)
|
void http_response_builder_bodyack(HTTP_ResponseBuilder res, int num)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_bodyack(&conn->engine, num);
|
http_engine_bodyack(&conn->engine, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_undo(HTTP_ResponseHandle res)
|
void http_response_builder_undo(HTTP_ResponseBuilder res)
|
||||||
{
|
{
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
http_engine_undo(&conn->engine);
|
http_engine_undo(&conn->engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_response_done(HTTP_ResponseHandle res)
|
void http_response_builder_done(HTTP_ResponseBuilder res)
|
||||||
{
|
{
|
||||||
HTTP_Server *server = res.data0;
|
HTTP_Server *server = res.data0;
|
||||||
Connection *conn = handle2conn(res);
|
Connection *conn = server_builder_to_conn(res);
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
+10
-10
@@ -11,7 +11,7 @@ typedef struct {
|
|||||||
void *data0;
|
void *data0;
|
||||||
int data1;
|
int data1;
|
||||||
int data2;
|
int data2;
|
||||||
} HTTP_ResponseHandle;
|
} HTTP_ResponseBuilder;
|
||||||
|
|
||||||
typedef struct HTTP_Server HTTP_Server;
|
typedef struct HTTP_Server HTTP_Server;
|
||||||
|
|
||||||
@@ -21,15 +21,15 @@ HTTP_Server *http_server_init_ex(HTTP_String addr, uint16_t port,
|
|||||||
uint16_t secure_port, HTTP_String cert_key, HTTP_String private_key);
|
uint16_t secure_port, HTTP_String cert_key, HTTP_String private_key);
|
||||||
|
|
||||||
void http_server_free (HTTP_Server *server);
|
void http_server_free (HTTP_Server *server);
|
||||||
int http_server_wait (HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandle *handle);
|
int http_server_wait (HTTP_Server *server, HTTP_Request **req, HTTP_ResponseBuilder *handle);
|
||||||
int http_server_add_website (HTTP_Server *server, HTTP_String domain, HTTP_String cert_file, HTTP_String key_file);
|
int http_server_add_website (HTTP_Server *server, HTTP_String domain, HTTP_String cert_file, HTTP_String key_file);
|
||||||
void http_response_status (HTTP_ResponseHandle res, int status);
|
void http_response_builder_status (HTTP_ResponseBuilder res, int status);
|
||||||
void http_response_header (HTTP_ResponseHandle res, HTTP_String str);
|
void http_response_builder_header (HTTP_ResponseBuilder res, HTTP_String str);
|
||||||
void http_response_body (HTTP_ResponseHandle res, HTTP_String str);
|
void http_response_builder_body (HTTP_ResponseBuilder res, HTTP_String str);
|
||||||
void http_response_bodycap (HTTP_ResponseHandle res, int mincap);
|
void http_response_builder_bodycap (HTTP_ResponseBuilder res, int mincap);
|
||||||
char* http_response_bodybuf (HTTP_ResponseHandle res, int *cap);
|
char* http_response_builder_bodybuf (HTTP_ResponseBuilder res, int *cap);
|
||||||
void http_response_bodyack (HTTP_ResponseHandle res, int num);
|
void http_response_builder_bodyack (HTTP_ResponseBuilder res, int num);
|
||||||
void http_response_undo (HTTP_ResponseHandle res);
|
void http_response_builder_undo (HTTP_ResponseBuilder res);
|
||||||
void http_response_done (HTTP_ResponseHandle res);
|
void http_response_builder_done (HTTP_ResponseBuilder res);
|
||||||
|
|
||||||
#endif // HTTP_SERVER_INCLUDED
|
#endif // HTTP_SERVER_INCLUDED
|
||||||
Reference in New Issue
Block a user