aboutsummaryrefslogtreecommitdiff
path: root/src/response.c
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2019-11-29 18:50:04 +0300
committerAleksey Veresov <aleksey@veresov.pro>2019-11-29 18:50:04 +0300
commitb08db17162fddda97e6ee1ac625eae1430d22b64 (patch)
tree2c332f2db57a15c72f58704b9175cfece0ae9698 /src/response.c
parentea25abb295d9b4fbaf0ac23af8ffe71247970f1b (diff)
downloadmagi-b08db17162fddda97e6ee1ac625eae1430d22b64.tar
magi-b08db17162fddda97e6ee1ac625eae1430d22b64.tar.xz
magi-b08db17162fddda97e6ee1ac625eae1430d22b64.zip
[magi] Almost done!
Diffstat (limited to 'src/response.c')
-rw-r--r--src/response.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/response.c b/src/response.c
index e69de29..7e2ec0b 100644
--- a/src/response.c
+++ b/src/response.c
@@ -0,0 +1,107 @@
+#include "response.h"
+
+#include "utils.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int vsnprintf(char * s, size_t n, const char * format, va_list arg);
+
+
+void magi_response_setup(struct magi_response * response)
+{
+ response->cookies = 0;
+ response->http_params = 0;
+ response->content_type = 0;
+ response->content = magi_str_create(0);
+ response->len = 0;
+ response->size = 1;
+}
+
+
+void magi_response_content_type(struct magi_response * response,
+ enum magi_content_type type)
+{
+ const char * const messages[] = {
+ "Content-Type: application/xhtml+xml", /* magi_xhtml */
+ };
+ if (!response->content_type) {
+ const char * end = messages[type] + strlen(messages[type]);
+ response->content_type = magi_str_create_copy(messages[type], end);
+ }
+}
+
+void magi_response_add(struct magi_response * r, const char * addon)
+{
+ int addon_len;
+ if (!addon) {
+ 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;
+}
+
+void magi_response_add_format(struct magi_response * response,
+ const char * addon,
+ ...)
+{
+ char * act_addon;
+ int n;
+ va_list args;
+ va_start(args, addon);
+ n = vsnprintf(0, 0, addon, args);
+ va_end(args);
+ if (n >= 0) {
+ act_addon = malloc(n + 1);
+ va_start(args, addon);
+ vsnprintf(act_addon, n + 1, addon, args);
+ va_end(args);
+ magi_response_add(response, act_addon);
+ free(act_addon);
+ }
+}
+
+void magi_response_cookie(struct magi_response * response,
+ struct magi_cookie * cookie)
+{
+ magi_cookie_list_add(&response->cookies, cookie);
+}
+
+void magi_response_cookie_easy(struct magi_response * response,
+ const char * name,
+ const char * value)
+{
+ struct magi_cookie cookie = { 0, 0, 0, 0, 0 };
+ cookie.name = magi_str_create_copy(name, name + strlen(name));
+ cookie.data = magi_str_create_copy(value, value + strlen(value));
+ magi_cookie_list_add(&response->cookies, &cookie);
+}
+
+void magi_response_http(struct magi_response * response,
+ const char * name,
+ const char * data)
+{
+ struct magi_param param = { 0, 0 };
+ param.name = magi_str_create_copy(name, name + strlen(name));
+ param.data = magi_str_create_copy(data, data + strlen(data));
+ magi_param_list_add(&response->http_params, &param);
+}
+
+
+void magi_response_destroy(struct magi_response * response)
+{
+ if (!response) {
+ 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);
+}