Mercurial > sci
view scid/http.c @ 41:00b9af607524
scid: implement /jobresults/id page
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 09 Aug 2022 14:52:34 +0200 |
parents | 96008a1953ba |
children | 576f4b1ec79f |
line wrap: on
line source
/* * http.c -- HTTP parsing and rendering * * Copyright (c) 2021-2022 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 <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <kcgi.h> #include "http.h" #include "log.h" #include "page-api-jobresults.h" #include "page-api-jobs.h" #include "page-api-projects.h" #include "page-api-todo.h" #include "page-api-workers.h" #include "page-index.h" #include "page-jobresults.h" #include "page-static.h" #include "pageutil.h" enum page { PAGE_INDEX, /* Job results at index. */ PAGE_JOBRESULTS, /* List of jobresult for one job. */ PAGE_API, PAGE_STATIC, PAGE_LAST /* Not used. */ }; static void dispatch_api(struct kreq *req) { static const struct { const char *prefix; void (*handler)(struct kreq *); } apis[] = { { "v1/jobresults", page_api_v1_jobresults }, { "v1/jobs", page_api_v1_jobs }, { "v1/projects", page_api_v1_projects }, { "v1/todo", page_api_v1_todo }, { "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); pageutil_status(req, KHTTP_404); } static const char *pages[] = { [PAGE_INDEX] = "", [PAGE_JOBRESULTS] = "jobresults", [PAGE_API] = "api", [PAGE_STATIC] = "static" }; static void (*handlers[])(struct kreq *req) = { [PAGE_INDEX] = page_index, [PAGE_JOBRESULTS] = page_jobresults, [PAGE_API] = dispatch_api, [PAGE_STATIC] = page_static }; static void process(struct kreq *req) { assert(req); log_debug("http: accessing page '%s'", req->fullpath); if (req->page == PAGE_LAST) pageutil_status(req, KHTTP_404); 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); }