diff scid/http.c @ 18:600204c31bf0

misc: refactor
author David Demelier <markand@malikania.fr>
date Tue, 12 Jul 2022 20:20:51 +0200
parents http.c@3051ef92173a
children f98ea578b1ef
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scid/http.c	Tue Jul 12 20:20:51 2022 +0200
@@ -0,0 +1,103 @@
+/*
+ * http.c -- HTTP parsing and rendering
+ *
+ * Copyright (c) 2021 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <kcgi.h>
+
+#include "http.h"
+#include "log.h"
+#include "page.h"
+#include "page-api-jobs.h"
+#include "page-api-projects.h"
+#include "page-api-workers.h"
+
+enum page {
+	PAGE_API,
+	PAGE_LAST       /* Not used. */
+};
+
+static void
+dispatch_api(struct kreq *req)
+{
+	static const struct {
+		const char *prefix;
+		void (*handler)(struct kreq *);
+	} apis[] = {
+		{ "v1/jobs",            page_api_v1_jobs        },
+		{ "v1/projects",        page_api_v1_projects    },
+		{ "v1/workers",         page_api_v1_workers     },
+		{ NULL,                 NULL                    }
+	};
+
+	for (size_t i = 0; apis[i].prefix; ++i)
+		if (strncmp(req->path, apis[i].prefix, strlen(apis[i].prefix)) == 0)
+			return apis[i].handler(req);
+
+	page(req, NULL, KHTTP_404, KMIME_TEXT_HTML, "pages/404.html");
+}
+
+static const char *pages[] = {
+	[PAGE_API]              = "api"
+};
+
+static void (*handlers[])(struct kreq *req) = {
+	[PAGE_API]              = dispatch_api
+};
+
+static void
+process(struct kreq *req)
+{
+	assert(req);
+
+	log_debug("http: accessing page '%s'", req->path);
+
+	if (req->page == PAGE_LAST)
+		page(req, NULL, KHTTP_404, KMIME_TEXT_HTML, "pages/404.html");
+	else
+		handlers[req->page](req);
+}
+
+void
+http_fcgi_run(void)
+{
+	struct kreq req;
+	struct kfcgi *fcgi;
+
+	if (khttp_fcgi_init(&fcgi, NULL, 0, pages, PAGE_LAST, 0) != KCGI_OK)
+		return;
+
+	while (khttp_fcgi_parse(fcgi, &req) == KCGI_OK)
+		process(&req);
+
+	khttp_fcgi_free(fcgi);
+}
+
+void
+http_cgi_run(void)
+{
+	struct kreq req;
+
+	if (khttp_parse(&req, NULL, 0, pages, PAGE_LAST, 0) == KCGI_OK)
+		process(&req);
+}