diff --git a/README.md b/README.md index 831aa19..89570cb 100644 --- a/README.md +++ b/README.md @@ -41,13 +41,13 @@ int main(void) for (;;) { HTTP_Request *req; - HTTP_ResponseHandle res; - http_server_wait(server, &req, &res); + HTTP_ResponseBuilder builder; + http_server_wait(server, &req, &builder); - http_response_status(res, 200); - http_response_header(res, "Content-Type: text/plain"); - http_response_body(res, HTTP_STR("Hello, world!")); - http_response_done(res); + http_response_builder_status(builder, 200); + http_response_builder_header(builder, "Content-Type: text/plain"); + http_response_builder_body(builder, HTTP_STR("Hello, world!")); + http_response_builder_done(builder); } http_server_free(server); diff --git a/chttp.c b/chttp.c index 6d96682..6a80fd9 100644 --- a/chttp.c +++ b/chttp.c @@ -4279,7 +4279,7 @@ int http_client_wait(HTTP_Client *client, HTTP_Response **result, void **user_da return 0; } -static ClientConnection *builder2conn(HTTP_RequestBuilder handle) +static ClientConnection *client_builder_to_conn(HTTP_RequestBuilder handle) { if (handle.data0 == 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) { - ClientConnection *conn = builder2conn(builder); + ClientConnection *conn = client_builder_to_conn(builder); if (conn == NULL) return; 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) { - ClientConnection *conn = builder2conn(builder); + ClientConnection *conn = client_builder_to_conn(builder); if (conn == NULL) return; 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) { - ClientConnection *conn = builder2conn(builder); + ClientConnection *conn = client_builder_to_conn(builder); if (conn == NULL) return; 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) { - ClientConnection *conn = builder2conn(handle); + ClientConnection *conn = client_builder_to_conn(handle); if (conn == NULL) return; 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) { - ClientConnection *conn = builder2conn(handle); + ClientConnection *conn = client_builder_to_conn(handle); if (conn == NULL) return; 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) { HTTP_Client *client = handle.data0; - ClientConnection *conn = builder2conn(handle); + ClientConnection *conn = client_builder_to_conn(handle); if (conn == NULL) return; 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; } -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) { @@ -4701,63 +4701,63 @@ int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandl server->ready_count--; *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; } static Connection* -handle2conn(HTTP_ResponseHandle handle) +server_builder_to_conn(HTTP_ResponseBuilder builder) { - HTTP_Server *server = handle.data0; - if (handle.data1 >= MAX_CONNS) + HTTP_Server *server = builder.data0; + if (builder.data1 >= MAX_CONNS) return NULL; - Connection *conn = &server->conns[handle.data1]; - if (conn->gen != handle.data2) + Connection *conn = &server->conns[builder.data1]; + if (conn->gen != builder.data2) return NULL; 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) return; 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) return; 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) return; 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) return; 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) { *cap = 0; return NULL; @@ -4766,28 +4766,28 @@ char *http_response_bodybuf(HTTP_ResponseHandle res, int *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) return; 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) return; 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; - Connection *conn = handle2conn(res); + Connection *conn = server_builder_to_conn(res); if (conn == NULL) return; @@ -5117,7 +5117,7 @@ static int file_read(File file, char *dst, int max) #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]; 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; ret = file_open(path.ptr, &file, &size); if (ret == -1) { - http_response_status(res, 500); - http_response_done(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); return 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"; if (path.len + sizeof(index) + 1 > sizeof(mem)) { - http_response_status(res, 500); - http_response_done(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); return 1; } 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); if (ret == -1) { - http_response_status(res, 500); - http_response_done(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); return 1; } if (ret == 1) @@ -5160,9 +5160,9 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin int cap; char *dst; - http_response_status(res, 200); - http_response_bodycap(res, size); - dst = http_response_bodybuf(res, &cap); + http_response_builder_status(res, 200); + http_response_builder_bodycap(res, size); + dst = http_response_builder_bodybuf(res, &cap); if (dst) { int copied = 0; while (copied < size) { @@ -5172,28 +5172,28 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin copied += ret; } 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); return 1; err: - http_response_bodyack(res, 0); - http_response_undo(res); - http_response_status(res, 500); - http_response_done(res); + http_response_builder_bodyack(res, 0); + http_response_builder_undo(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); file_close(file); 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]; int path_len = sanitize_path(req->url.path, path_mem, (int) sizeof(path_mem)); if (path_len < 0) { - http_response_status(res, 400); - http_response_body(res, HTTP_STR("Invalid path")); - http_response_done(res); + http_response_builder_status(res, 400); + http_response_builder_body(res, HTTP_STR("Invalid path")); + http_response_builder_done(res); return 1; } 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; } -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++) { Route *route = &router->routes[i]; @@ -5224,13 +5224,13 @@ void http_router_resolve(HTTP_Router *router, HTTP_Request *req, HTTP_ResponseHa break; default: - http_response_status(res, 500); - http_response_done(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); return; } } - http_response_status(res, 404); - http_response_done(res); + http_response_builder_status(res, 404); + http_response_builder_done(res); } 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 (;;) { HTTP_Request *req; - HTTP_ResponseHandle res; + HTTP_ResponseBuilder res; ret = http_server_wait(server, &req, &res); if (ret < 0) { http_server_free(server); diff --git a/chttp.h b/chttp.h index a8bc68d..9c5c144 100644 --- a/chttp.h +++ b/chttp.h @@ -471,7 +471,7 @@ typedef struct { void *data0; int data1; int data2; -} HTTP_ResponseHandle; +} HTTP_ResponseBuilder; typedef struct HTTP_Server HTTP_Server; @@ -480,17 +480,17 @@ HTTP_Server *http_server_init(HTTP_String addr, uint16_t port); HTTP_Server *http_server_init_ex(HTTP_String addr, uint16_t port, uint16_t secure_port, HTTP_String cert_key, HTTP_String private_key); -void http_server_free (HTTP_Server *server); -int http_server_wait (HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandle *handle); -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_header (HTTP_ResponseHandle res, HTTP_String str); -void http_response_body (HTTP_ResponseHandle res, HTTP_String str); -void http_response_bodycap (HTTP_ResponseHandle res, int mincap); -char* http_response_bodybuf (HTTP_ResponseHandle res, int *cap); -void http_response_bodyack (HTTP_ResponseHandle res, int num); -void http_response_undo (HTTP_ResponseHandle res); -void http_response_done (HTTP_ResponseHandle res); +void http_server_free (HTTP_Server *server); +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); +void http_response_builder_status (HTTP_ResponseBuilder res, int status); +void http_response_builder_header (HTTP_ResponseBuilder res, HTTP_String str); +void http_response_builder_body (HTTP_ResponseBuilder res, HTTP_String str); +void http_response_builder_bodycap (HTTP_ResponseBuilder res, int mincap); +char* http_response_builder_bodybuf (HTTP_ResponseBuilder res, int *cap); +void http_response_builder_bodyack (HTTP_ResponseBuilder res, int num); +void http_response_builder_undo (HTTP_ResponseBuilder res); +void http_response_builder_done (HTTP_ResponseBuilder res); #endif // HTTP_SERVER_INCLUDED @@ -507,11 +507,11 @@ void http_response_done (HTTP_ResponseHandle res); #endif 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); 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_func (HTTP_Router *router, HTTP_Method method, HTTP_String endpoint, HTTP_RouterFunc func, void*); int http_serve (char *addr, int port, HTTP_Router *router); diff --git a/examples/server/000_http_server.c b/examples/server/000_http_server.c index bfed2e6..6b98969 100644 --- a/examples/server/000_http_server.c +++ b/examples/server/000_http_server.c @@ -30,10 +30,10 @@ int main(void) for (;;) { HTTP_Request *req; - HTTP_ResponseHandle res; + HTTP_ResponseBuilder builder; // 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 // on error. By "error" I mean an unrecoverable @@ -70,19 +70,19 @@ int main(void) // order. // First the status code - http_response_status(res, 200); + http_response_builder_status(builder, 200); // 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 - http_response_body(res, HTTP_STR("Hello")); - http_response_body(res, HTTP_STR(", world!")); + http_response_builder_body(builder, HTTP_STR("Hello")); + http_response_builder_body(builder, HTTP_STR(", world!")); // 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 // something goes wrong, the server will send a code 4xx or 5xx to // the client or abort the TCP connection entirely. diff --git a/examples/server/010_zero_copy_api.c b/examples/server/010_zero_copy_api.c index b04b4e9..02440ab 100644 --- a/examples/server/010_zero_copy_api.c +++ b/examples/server/010_zero_copy_api.c @@ -9,7 +9,7 @@ int main(void) http_global_init(); // 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. HTTP_Server *server = http_server_init(HTTP_STR("127.0.0.1"), 8080); @@ -19,19 +19,19 @@ int main(void) for (;;) { 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; - http_response_status(res, 200); - http_response_header(res, HTTP_STR("Content-Type: text/plain")); + http_response_builder_status(builder, 200); + http_response_builder_header(builder, HTTP_STR("Content-Type: text/plain")); // The previous example used the *_body function to // write the response body in chunks: // - // http_response_body(res, HTTP_STR("Hello")); - // http_response_body(res, HTTP_STR(", world!")); + // http_response_builder_body(builder, HTTP_STR("Hello")); + // http_response_builder_body(builder, HTTP_STR(", world!")); // // This function reads from an user buffer and copies // 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; // 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; char *dst; @@ -62,7 +62,7 @@ int main(void) // output parameter [cap] is the capacity of the region // and is equal or larger than the data we requested // with *_bodycap - dst = http_response_bodybuf(res, &cap); + dst = http_response_builder_bodybuf(builder, &cap); // Write the data directly into the output buffer. In // 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 // 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 // [dst] pointer is that if an error occurred internally @@ -84,7 +84,7 @@ int main(void) // as nothing bad happened. // 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 // interface. It's more like an N-1 copy interface as in diff --git a/examples/server/020_response_undo.c b/examples/server/020_response_undo.c index 9616119..f751494 100644 --- a/examples/server/020_response_undo.c +++ b/examples/server/020_response_undo.c @@ -15,15 +15,15 @@ int main(void) for (;;) { 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; // Say we are building a request.. - http_response_status(res, 200); - http_response_header(res, HTTP_STR("Content-Type: text/plain")); + http_response_builder_status(builder, 200); + http_response_builder_header(builder, HTTP_STR("Content-Type: text/plain")); // .. and in the middle of building an error condition // occurs. Maybe a file was missing or an allocation fails. @@ -37,19 +37,19 @@ int main(void) bool error_occurred = true; if (error_occurred) { - http_response_undo(res); + http_response_builder_undo(builder); // Now we are back to setting the status code - http_response_status(res, 500); - http_response_header(res, HTTP_STR("Content-Type: text/plain")); - http_response_body(res, HTTP_STR("An error occurred!")); - http_response_done(res); + http_response_builder_status(builder, 500); + http_response_builder_header(builder, HTTP_STR("Content-Type: text/plain")); + http_response_builder_body(builder, HTTP_STR("An error occurred!")); + http_response_builder_done(builder); } else { // If no error occures, we finish as planned - http_response_body(res, HTTP_STR("Hello, world!")); - http_response_done(res); + http_response_builder_body(builder, HTTP_STR("Hello, world!")); + http_response_builder_done(builder); } } diff --git a/examples/server/030_using_workers.c b/examples/server/030_using_workers.c index 89fbc60..925d38f 100644 --- a/examples/server/030_using_workers.c +++ b/examples/server/030_using_workers.c @@ -52,7 +52,7 @@ typedef enum { typedef struct { JobType type; - HTTP_ResponseHandle res; + HTTP_ResponseBuilder builder; } Job; // Maximum number of jobs that can be buffered at once @@ -100,15 +100,15 @@ ThreadReturn worker(void*) break; case JOB_A: - http_response_status(job.res, 200); - http_response_body(job.res, HTTP_STR("Job A completed")); - http_response_done(job.res); + http_response_builder_status(job.builder, 200); + http_response_builder_body(job.builder, HTTP_STR("Job A completed")); + http_response_builder_done(job.builder); break; case JOB_B: - http_response_status(job.res, 200); - http_response_body(job.res, HTTP_STR("Job B completed")); - http_response_done(job.res); + http_response_builder_status(job.builder, 200); + http_response_builder_body(job.builder, HTTP_STR("Job B completed")); + http_response_builder_done(job.builder); break; } } @@ -131,9 +131,9 @@ int main(void) for (;;) { 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 (http_streq(req->url.path, HTTP_STR("/endpoint_A"))) { @@ -143,7 +143,7 @@ int main(void) Job job; job.type = JOB_A; - job.res = res; + job.builder = builder; push_job(job, true); } else if (http_streq(req->url.path, HTTP_STR("/endpoint_B"))) { @@ -155,18 +155,18 @@ int main(void) Job job; job.type = JOB_B; - job.res = res; + job.builder = builder; if (!push_job(job, false)) { - http_response_status(res, 503); - http_response_done(res); + http_response_builder_status(builder, 503); + http_response_builder_done(builder); } } else { // Other endpoints may resolve immediately - http_response_status(res, 404); - http_response_done(res); + http_response_builder_status(builder, 404); + http_response_builder_done(builder); } } diff --git a/examples/server/050_https_server.c b/examples/server/050_https_server.c index 0a5f2c3..75b9059 100644 --- a/examples/server/050_https_server.c +++ b/examples/server/050_https_server.c @@ -60,16 +60,16 @@ int main(void) for (;;) { 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; - http_response_status(res, 200); - http_response_header(res, HTTP_STR("Content-Type: text/plain")); - http_response_body(res, HTTP_STR("Hello")); - http_response_body(res, HTTP_STR(", world!")); - http_response_done(res); + http_response_builder_status(builder, 200); + http_response_builder_header(builder, HTTP_STR("Content-Type: text/plain")); + http_response_builder_body(builder, HTTP_STR("Hello")); + http_response_builder_body(builder, HTTP_STR(", world!")); + http_response_builder_done(builder); } http_server_free(server); diff --git a/examples/server/060_virtual_hosts_over_https.c b/examples/server/060_virtual_hosts_over_https.c index 70a6746..746c246 100644 --- a/examples/server/060_virtual_hosts_over_https.c +++ b/examples/server/060_virtual_hosts_over_https.c @@ -87,8 +87,8 @@ int main(void) for (;;) { HTTP_Request *req; - HTTP_ResponseHandle res; - ret = http_server_wait(server, &req, &res); + HTTP_ResponseBuilder builder; + ret = http_server_wait(server, &req, &builder); if (ret < 0) break; @@ -98,24 +98,24 @@ int main(void) if (http_streq(host, HTTP_STR("websiteB.com"))) { - http_response_status(res, 200); - http_response_body(res, HTTP_STR("Hello from websiteB.com!")); - http_response_done(res); + http_response_builder_status(builder, 200); + http_response_builder_body(builder, HTTP_STR("Hello from websiteB.com!")); + http_response_builder_done(builder); } else if (http_streq(host, HTTP_STR("websiteC.com"))) { - http_response_status(res, 200); - http_response_body(res, HTTP_STR("Hello from websiteC.com!")); - http_response_done(res); + http_response_builder_status(builder, 200); + http_response_builder_body(builder, HTTP_STR("Hello from websiteC.com!")); + http_response_builder_done(builder); } else { // Serve websiteA.com by default to be consistent // with the certificate setup - http_response_status(res, 200); - http_response_body(res, HTTP_STR("Hello from websiteA.com!")); - http_response_done(res); + http_response_builder_status(builder, 200); + http_response_builder_body(builder, HTTP_STR("Hello from websiteA.com!")); + http_response_builder_done(builder); } } diff --git a/src/client.c b/src/client.c index f213c78..d61e555 100644 --- a/src/client.c +++ b/src/client.c @@ -230,7 +230,7 @@ int http_client_wait(HTTP_Client *client, HTTP_Response **result, void **user_da return 0; } -static ClientConnection *builder2conn(HTTP_RequestBuilder handle) +static ClientConnection *client_builder_to_conn(HTTP_RequestBuilder handle) { if (handle.data0 == 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) { - ClientConnection *conn = builder2conn(builder); + ClientConnection *conn = client_builder_to_conn(builder); if (conn == NULL) return; 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) { - ClientConnection *conn = builder2conn(builder); + ClientConnection *conn = client_builder_to_conn(builder); if (conn == NULL) return; 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) { - ClientConnection *conn = builder2conn(builder); + ClientConnection *conn = client_builder_to_conn(builder); if (conn == NULL) return; 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) { - ClientConnection *conn = builder2conn(handle); + ClientConnection *conn = client_builder_to_conn(handle); if (conn == NULL) return; 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) { - ClientConnection *conn = builder2conn(handle); + ClientConnection *conn = client_builder_to_conn(handle); if (conn == NULL) return; 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) { HTTP_Client *client = handle.data0; - ClientConnection *conn = builder2conn(handle); + ClientConnection *conn = client_builder_to_conn(handle); if (conn == NULL) return; if (conn->state != CLIENT_CONNECTION_INIT && diff --git a/src/router.c b/src/router.c index 70d45f5..71c7ab9 100644 --- a/src/router.c +++ b/src/router.c @@ -301,7 +301,7 @@ static int file_read(File file, char *dst, int max) #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]; 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; ret = file_open(path.ptr, &file, &size); if (ret == -1) { - http_response_status(res, 500); - http_response_done(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); return 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"; if (path.len + sizeof(index) + 1 > sizeof(mem)) { - http_response_status(res, 500); - http_response_done(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); return 1; } 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); if (ret == -1) { - http_response_status(res, 500); - http_response_done(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); return 1; } if (ret == 1) @@ -344,9 +344,9 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin int cap; char *dst; - http_response_status(res, 200); - http_response_bodycap(res, size); - dst = http_response_bodybuf(res, &cap); + http_response_builder_status(res, 200); + http_response_builder_bodycap(res, size); + dst = http_response_builder_bodybuf(res, &cap); if (dst) { int copied = 0; while (copied < size) { @@ -356,28 +356,28 @@ static int serve_file_or_index(HTTP_ResponseHandle res, HTTP_String base_endpoin copied += ret; } 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); return 1; err: - http_response_bodyack(res, 0); - http_response_undo(res); - http_response_status(res, 500); - http_response_done(res); + http_response_builder_bodyack(res, 0); + http_response_builder_undo(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); file_close(file); 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]; int path_len = sanitize_path(req->url.path, path_mem, (int) sizeof(path_mem)); if (path_len < 0) { - http_response_status(res, 400); - http_response_body(res, HTTP_STR("Invalid path")); - http_response_done(res); + http_response_builder_status(res, 400); + http_response_builder_body(res, HTTP_STR("Invalid path")); + http_response_builder_done(res); return 1; } 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; } -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++) { Route *route = &router->routes[i]; @@ -408,13 +408,13 @@ void http_router_resolve(HTTP_Router *router, HTTP_Request *req, HTTP_ResponseHa break; default: - http_response_status(res, 500); - http_response_done(res); + http_response_builder_status(res, 500); + http_response_builder_done(res); return; } } - http_response_status(res, 404); - http_response_done(res); + http_response_builder_status(res, 404); + http_response_builder_done(res); } 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 (;;) { HTTP_Request *req; - HTTP_ResponseHandle res; + HTTP_ResponseBuilder res; ret = http_server_wait(server, &req, &res); if (ret < 0) { http_server_free(server); diff --git a/src/router.h b/src/router.h index 1d41da1..ebce19f 100644 --- a/src/router.h +++ b/src/router.h @@ -6,11 +6,11 @@ #endif 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); 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_func (HTTP_Router *router, HTTP_Method method, HTTP_String endpoint, HTTP_RouterFunc func, void*); int http_serve (char *addr, int port, HTTP_Router *router); diff --git a/src/server.c b/src/server.c index fa19741..51bd369 100644 --- a/src/server.c +++ b/src/server.c @@ -95,7 +95,7 @@ static void* server_memfunc(HTTP_MemoryFuncTag tag, void *ptr, int len, void *da 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) { @@ -196,63 +196,63 @@ int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandl server->ready_count--; *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; } static Connection* -handle2conn(HTTP_ResponseHandle handle) +server_builder_to_conn(HTTP_ResponseBuilder builder) { - HTTP_Server *server = handle.data0; - if (handle.data1 >= MAX_CONNS) + HTTP_Server *server = builder.data0; + if (builder.data1 >= MAX_CONNS) return NULL; - Connection *conn = &server->conns[handle.data1]; - if (conn->gen != handle.data2) + Connection *conn = &server->conns[builder.data1]; + if (conn->gen != builder.data2) return NULL; 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) return; 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) return; 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) return; 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) return; 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) { *cap = 0; return NULL; @@ -261,28 +261,28 @@ char *http_response_bodybuf(HTTP_ResponseHandle res, int *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) return; 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) return; 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; - Connection *conn = handle2conn(res); + Connection *conn = server_builder_to_conn(res); if (conn == NULL) return; diff --git a/src/server.h b/src/server.h index e4ae4af..2a21262 100644 --- a/src/server.h +++ b/src/server.h @@ -11,7 +11,7 @@ typedef struct { void *data0; int data1; int data2; -} HTTP_ResponseHandle; +} HTTP_ResponseBuilder; typedef struct HTTP_Server HTTP_Server; @@ -20,16 +20,16 @@ HTTP_Server *http_server_init(HTTP_String addr, uint16_t port); HTTP_Server *http_server_init_ex(HTTP_String addr, uint16_t port, uint16_t secure_port, HTTP_String cert_key, HTTP_String private_key); -void http_server_free (HTTP_Server *server); -int http_server_wait (HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandle *handle); -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_header (HTTP_ResponseHandle res, HTTP_String str); -void http_response_body (HTTP_ResponseHandle res, HTTP_String str); -void http_response_bodycap (HTTP_ResponseHandle res, int mincap); -char* http_response_bodybuf (HTTP_ResponseHandle res, int *cap); -void http_response_bodyack (HTTP_ResponseHandle res, int num); -void http_response_undo (HTTP_ResponseHandle res); -void http_response_done (HTTP_ResponseHandle res); +void http_server_free (HTTP_Server *server); +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); +void http_response_builder_status (HTTP_ResponseBuilder res, int status); +void http_response_builder_header (HTTP_ResponseBuilder res, HTTP_String str); +void http_response_builder_body (HTTP_ResponseBuilder res, HTTP_String str); +void http_response_builder_bodycap (HTTP_ResponseBuilder res, int mincap); +char* http_response_builder_bodybuf (HTTP_ResponseBuilder res, int *cap); +void http_response_builder_bodyack (HTTP_ResponseBuilder res, int num); +void http_response_builder_undo (HTTP_ResponseBuilder res); +void http_response_builder_done (HTTP_ResponseBuilder res); #endif // HTTP_SERVER_INCLUDED \ No newline at end of file