From ea3e7bc2c7c115161918e352e68c1c7e67dfdae3 Mon Sep 17 00:00:00 2001 From: spl3g Date: Tue, 18 Mar 2025 11:37:42 +0300 Subject: Improve the headers interface --- lib/http.c | 44 +++++++++++++++++++++++++++++++++++--------- lib/http.h | 2 +- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/lib/http.c b/lib/http.c index bf75021..0c2efa9 100644 --- a/lib/http.c +++ b/lib/http.c @@ -98,6 +98,25 @@ void *get_context_value(context *ctx, const_string key) { return NULL; } +void resp_set_code(struct response* resp, response_code code) { + resp->code = code; +} + +void resp_set_json(arena *arena, struct response* resp, const_string json) { + const_string len_str = arena_cs_init(arena, snprintf(NULL, 0, "%d", json.len+2)); + sprintf(len_str.data, "%d", json.len+2); + arena_da_append(arena, &resp->headers, ((KV){CS("Content-Length"), len_str})); + arena_da_append(arena, &resp->headers, ((KV){CS("Content-Type"), CS("application/json")})); + resp->body = json; +} +void resp_set_body(arena *arena, struct response* resp, const_string body) { + const_string len_str = arena_cs_init(arena, snprintf(NULL, 0, "%d", body.len)); + sprintf(len_str.data, "%d", body.len); + arena_da_append(arena, &resp->headers, ((KV){CS("Content-Length"), len_str})); + arena_da_append(arena, &resp->headers, ((KV){CS("Content-Type"), CS("application/text")})); + resp->body = body; +} + int init_server(arena *arena, struct server *serv, char *addr, char *port) { // serv initialization struct addrinfo hints, *res; @@ -177,21 +196,28 @@ void compose_response(arena *arena, struct response *resp) { arena_da_append(arena, &header_da, get_response_string(INTERNAL_SERVER_ERROR)); } - const_string header = arena_cs_concat(arena, header_da, CS(" ")); + const_string_da resp_da= {0}; - const_string str; + const_string http_header = arena_cs_concat(arena, header_da, CS(" ")); + arena_da_append(arena, &resp_da, http_header); + + for (size_t i = 0; i < resp->headers.len; i++) { + KV *header = (resp->headers.data + i); + const_string header_str = {0}; + header_str = arena_cs_append(arena, header_str, header->key); + header_str = arena_cs_append(arena, header_str, CS(": ")); + header_str = arena_cs_append(arena, header_str, header->value); + arena_da_append(arena, &resp_da, header_str); + } + if (resp->body.len != 0) { - const_string_da resp_da= {0}; - - arena_da_append(arena, &resp_da, header); arena_da_append(arena, &resp_da, CS("")); arena_da_append(arena, &resp_da, resp->body); - - str = arena_cs_concat(arena, resp_da, CS("\r\n")); - } else { - str = arena_cs_append(arena, header, CS("\r\n\r\n")); } + arena_da_append(arena, &resp_da, CS("")); + const_string str = arena_cs_concat(arena, resp_da, CS("\r\n")); + resp->string = str; } diff --git a/lib/http.h b/lib/http.h index 883054b..489775e 100644 --- a/lib/http.h +++ b/lib/http.h @@ -51,7 +51,7 @@ struct request { struct response { size_t code; - const_string headers; + header_da headers; const_string body; const_string string; }; -- cgit v1.2.3