aboutsummaryrefslogtreecommitdiff
path: root/src/response.c
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2020-03-09 18:06:10 +0300
committerAleksey Veresov <aleksey@veresov.pro>2020-03-09 18:06:10 +0300
commit18ce121d4243358bc55a0474a529efe2580a0610 (patch)
tree046805a312734ed2b477b6782d66e754e928f371 /src/response.c
parent8869f95373fa61cd425da31dbc5e2b1b536363d3 (diff)
downloadmagi-18ce121d4243358bc55a0474a529efe2580a0610.tar
magi-18ce121d4243358bc55a0474a529efe2580a0610.tar.xz
magi-18ce121d4243358bc55a0474a529efe2580a0610.zip
[magi]
Diffstat (limited to 'src/response.c')
-rw-r--r--src/response.c156
1 files changed, 101 insertions, 55 deletions
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 <string.h>
-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, &param);
+ 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);
}