summaryrefslogtreecommitdiff
path: root/upload.c
diff options
context:
space:
mode:
authorVincent Douillet <vincent@vdouillet.fr>2024-09-06 12:21:06 +0200
committerVincent Douillet <vincent@vdouillet.fr>2024-09-06 12:22:20 +0200
commitd7edafe299d44a0bec9d29e2b3a4ca853ffa1a80 (patch)
tree9f4de85662fbfd997bf5ee96671a2f776f2c53a6 /upload.c
parent35a145fd161fb4d4f19aa9820b50438695b94414 (diff)
upload: add form
Diffstat (limited to 'upload.c')
-rw-r--r--upload.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/upload.c b/upload.c
index 03e4169..fef628e 100644
--- a/upload.c
+++ b/upload.c
@@ -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;
+}