From 18ce121d4243358bc55a0474a529efe2580a0610 Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Mon, 9 Mar 2020 18:06:10 +0300 Subject: [magi] --- src/response.c | 156 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 101 insertions(+), 55 deletions(-) (limited to 'src/response.c') diff --git a/src/response.c b/src/response.c index 904b855..403e0fe 100644 --- a/src/response.c +++ b/src/response.c @@ -6,86 +6,132 @@ #include -void magi_response_setup(magi_response *response) +void magi_response_status(magi_request *r, int code, const char *description) { - response->cookies = 0; - response->http_params = 0; - response->content_type = 0; - magi_response_content_type(response, "application/xhtml+xml"); - response->content = magi_str_create(0); - response->len = 0; - response->size = 1; + int dlen; + magi_param addon; + if (r->response->head_done || code <= 99 || 600 <= code) { + return; + } + dlen = strlen(description); + addon.name = magi_str_create_copy("Status", 6); + addon.data = malloc(5 + dlen); + addon.data[0] = '0' + code / 100; + addon.data[1] = '0' + code / 10 % 10; + addon.data[2] = '0' + code % 10; + addon.data[3] = ' '; + memcpy(addon.data + 4, description, dlen + 1); + magi_params_set(r->response->head, &addon); } -void magi_response_content_type(magi_response *response, const char *type) +void magi_response_cookie(magi_request *r, const char *name, const char *data) { - static const char *const ct = "Content-Type: "; - static const int ctlen = 15; - const int len = strlen(type); - free(response->content_type); - response->content_type = malloc(ctlen + len + 1); - memcpy(response->content_type, ct, ctlen); - memcpy(response->content_type + ctlen, type, len + 1); + magi_param addon; + if (r->response->head_done) { + return; + } + addon.name = magi_str_create_copy("Set-Cookie", 10); + /* TODO */ + magi_params_add(r->response->head + 1, &addon); } -void magi_response_add(magi_response *r, const char *addon) +void magi_response_cookie_complex(magi_request *r, magi_cookie *c) { - int addon_len; - if (!addon) { + magi_param addon; + if (r->response->head_done) { return; } - addon_len = strlen(addon); - if (r->len + addon_len + 1 >= r->size) { - r->content = realloc(r->content, r->len + addon_len + 1); - } - memcpy(r->content + r->len, addon, addon_len + 1); - r->len += addon_len; + addon.name = magi_str_create_copy("Set-Cookie", 10); + /* TODO */ + magi_params_add(r->response->head + 1, &addon); } -void magi_response_cookie(magi_response *response, magi_cookie *cookie) +void magi_response_cookie_discard(magi_request *r, const char *name) { - magi_cookie_list_add(&response->cookies, cookie); + magi_param addon; + if (r->response->head_done) { + return; + } + addon.name = magi_str_create_copy("Set-Cookie", 10); + /* TODO */ + magi_params_add(r->response->head + 1, &addon); } -void magi_response_cookie_easy(magi_response *response, - const char *name, - const char *value) +void magi_response_header(magi_request *r, const char *name, const char *data) { - magi_cookie cookie = { 0, 0, 0, 0, 0 }; - cookie.name = magi_str_create_copy(name, strlen(name)); - cookie.data = magi_str_create_copy(value, strlen(value)); - magi_cookie_list_add(&response->cookies, &cookie); + magi_param addon; + if (r->response->head_done) { + return; + } + addon.name = magi_str_create_copy(name, strlen(name)); + addon.data = magi_str_create_copy(data, strlen(data)); + magi_params_add(r->response->head + 1, &addon); } -void magi_response_cookie_discard(magi_response *response, const char *name) +void magi_response_content_length(magi_request *r, int length) { - magi_cookie cookie = { 0, 0, 0, 0, 0 }; - cookie.name = magi_str_create_copy(name, strlen(name)); - cookie.max_age = magi_str_create(1); - cookie.max_age[0] = '0'; - magi_cookie_list_add(&response->cookies, &cookie); + magi_param addon; + int len; + if (r->response->head_done) { + return; + } + addon.name = magi_str_create_copy("Content-Length", 14); + len = 1; + addon.data = malloc(len + 1); + *addon.data = '0' + length % 10; + while (length /= 10) { + addon.data = realloc(addon.data, len + 2); + addon.data[len] = '0' + length % 10; + ++len; + } + addon.data[len] = 0; + magi_params_set(r->response->head + 2, &addon); } -void magi_response_http(magi_response *response, - const char *name, - const char *data) +void magi_response_content_type(magi_request *r, const char *type) { - magi_param param = { 0, 0 }; - param.name = magi_str_create_copy(name, strlen(name)); - param.data = magi_str_create_copy(data, strlen(data)); - magi_param_list_add(&response->http_params, ¶m); + magi_param addon; + if (r->response->head_done) { + return; + } + addon.name = magi_str_create_copy("Content-Type", 12); + addon.data = magi_str_create_copy(type, strlen(type)); + magi_params_set(r->response->head + 2, &addon); } +static void response_headers(magi_response_implementation *r, magi_params *p) +{ + for (; p; p = p->next) { + r->methods->head(r->userdata, &p->item); + } +} -void magi_response_destroy(magi_response *response) +void magi_response_head(magi_request *r) { - if (!response) { + magi_params *current; + if (r->response->head_done) { return; } - magi_cookie_list_destroy(response->cookies); - magi_param_list_destroy(response->http_params); - free(response->cookies); - free(response->http_params); - free(response->content_type); - free(response->content); + response_headers(r->response, r->response->head[0]); + response_headers(r->response, r->response->head[1]); + response_headers(r->response, r->response->head[2]); + r->response->head_done = 1; +} + +void magi_response(magi_request *r, const char *addon) +{ + magi_response_head(r); + r->response->methods->body(r->response->userdata, addon, strlen(addon)); +} + +void magi_response_format(magi_request *r, const char *format, ...) +{ + magi_response_head(r); + /* TODO */ +} + +void magi_response_file(magi_request *r, FILE *file) +{ + magi_response_head(r); + r->response->methods->file(r->response->userdata, file); } -- cgit v1.2.3