Mercurial > sci
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); +}