diff options
author | Vincent Douillet <vincent@vdouillet.fr> | 2024-09-06 12:21:06 +0200 |
---|---|---|
committer | Vincent Douillet <vincent@vdouillet.fr> | 2024-09-06 12:22:20 +0200 |
commit | d7edafe299d44a0bec9d29e2b3a4ca853ffa1a80 (patch) | |
tree | 9f4de85662fbfd997bf5ee96671a2f776f2c53a6 /upload.c | |
parent | 35a145fd161fb4d4f19aa9820b50438695b94414 (diff) |
upload: add form
Diffstat (limited to 'upload.c')
-rw-r--r-- | upload.c | 122 |
1 files changed, 122 insertions, 0 deletions
@@ -30,9 +30,13 @@ #include <stdlib.h> #include <kcgi.h> +#include <kcgihtml.h> #include <limits.h> #include <string.h> +#include "cgi.h" +#include "http.h" +#include "template.h" #include "upload.h" #include "url.h" @@ -64,3 +68,121 @@ build_upload_url(const struct kreq * r, struct file * file) } return action_url_len; } + +/* + * data required in the template functions + */ +struct template_data { + struct kreq *r; + struct khtmlreq *html; + struct file *f; +}; + +static const char *const header_template_keys[] = {"path", "submit_url"}; + +static int +header_template_callback(size_t index, void *arg) +{ + struct kreq *r; + struct khtmlreq *html; + struct template_data *data; + + if (arg == NULL) { + kutil_warn(NULL, NULL, + "Invalid data for upload header template"); + return 0; + } + data = arg; + r = data->r; + html = data->html; + + switch (index) { + case 0: + /* path */ + K_OK(khtml_puts(html, data->f->path), r); + break; + case 1: + /* submit_url */ + K_OK(khtml_puts(html, data->f->action_url), r); + break; + default: + kutil_warnx(r, NULL, + "Invalid key index for upload header template: %zd", + index); + return 0; + } + + return 1; +} + +struct http_ret +upload(struct kreq * r) +{ + struct file *file; + struct http_ret ret; + struct khtmlreq html; + struct ktemplate template; + struct page_template *tmpl; + struct template_data data; + + /* initialize vars and return structure for success */ + file = NULL; + tmpl = NULL; + ret = (struct http_ret) { + KHTTP_200, "" + }; + + /* build file and submit url */ + file = file_new(r->path); + if (file == NULL) { + ret = (struct http_ret) { + KHTTP_404, + "upload: Unable to build data file" + }; + goto end; + } + if (build_upload_url(r, file) == 0) { + ret = (struct http_ret) { + KHTTP_500, + "upload: Can't build upload url" + }; + goto end; + } + + /* read template */ + tmpl = page_template_new(UPLOAD_URL); + if (tmpl == NULL) { + ret = (struct http_ret) { + KHTTP_500, + "upload: Unable to read template" + }; + goto end; + } + + http_open(r, KHTTP_200, r->mime); + + K_OK(khttp_puts(r, tmpl->header), r); + K_OK(khtml_open(&html, r, 0), r); + + /* print upload form */ + template.key = header_template_keys; + template.keysz = 2; + template.cb = header_template_callback; + template.arg = &data; + data.r = r; + data.html = &html; + data.f = file; + K_OK(khttp_template_buf(r, &template, tmpl->page_header, + strlen(tmpl->page_header)), r); + + K_OK(khttp_puts(r, tmpl->page_footer), r); + K_OK(khttp_puts(r, tmpl->footer), r); + + K_OK(khtml_close(&html), r); + + /* free allocated memory */ +end: + file_free(file); + page_template_free(tmpl); + return ret; +} |