0
|
1 /* |
|
2 * http.c -- HTTP parsing and rendering |
|
3 * |
|
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr> |
|
5 * |
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
|
7 * purpose with or without fee is hereby granted, provided that the above |
|
8 * copyright notice and this permission notice appear in all copies. |
|
9 * |
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
17 */ |
|
18 |
|
19 #include <sys/types.h> |
|
20 #include <sys/stat.h> |
|
21 #include <assert.h> |
|
22 #include <ctype.h> |
|
23 #include <limits.h> |
|
24 #include <stdarg.h> |
|
25 #include <stdint.h> |
|
26 #include <stdio.h> |
|
27 #include <stdlib.h> |
|
28 #include <string.h> |
|
29 #include <unistd.h> |
|
30 |
|
31 #include <kcgi.h> |
|
32 #include <kcgihtml.h> |
|
33 |
|
34 #include "config.h" |
|
35 #include "database.h" |
|
36 #include "http.h" |
|
37 #include "log.h" |
|
38 #include "image.h" |
|
39 #include "util.h" |
|
40 |
|
41 #include "page-download.h" |
|
42 #include "page-image.h" |
|
43 #include "page-index.h" |
|
44 #include "page-new.h" |
|
45 #include "page-search.h" |
|
46 #include "page-static.h" |
|
47 #include "page.h" |
|
48 |
|
49 enum page { |
|
50 PAGE_INDEX, |
|
51 PAGE_NEW, |
|
52 PAGE_IMAGE, |
|
53 PAGE_DOWNLOAD, |
|
54 PAGE_SEARCH, |
|
55 PAGE_STATIC, |
|
56 PAGE_NUM /* Not used. */ |
|
57 }; |
|
58 |
|
59 static const char *pages[] = { |
|
60 [PAGE_INDEX] = "", |
|
61 [PAGE_NEW] = "new", |
|
62 [PAGE_IMAGE] = "image", |
|
63 [PAGE_DOWNLOAD] = "download", |
|
64 [PAGE_SEARCH] = "search", |
|
65 [PAGE_STATIC] = "static" |
|
66 }; |
|
67 |
|
68 static void (*handlers[])(struct kreq *req) = { |
|
69 [PAGE_INDEX] = page_index, |
|
70 [PAGE_NEW] = page_new, |
|
71 [PAGE_IMAGE] = page_image, |
|
72 [PAGE_DOWNLOAD] = page_download, |
|
73 [PAGE_SEARCH] = page_search, |
|
74 [PAGE_STATIC] = page_static |
|
75 }; |
|
76 |
|
77 static void |
|
78 process(struct kreq *req) |
|
79 { |
|
80 assert(req); |
|
81 |
|
82 log_debug("http: accessing page '%s'", req->path); |
|
83 |
|
84 if (req->page == PAGE_NUM) |
|
85 page(req, NULL, KHTTP_404, "pages/404.html"); |
|
86 else |
|
87 handlers[req->page](req); |
|
88 } |
|
89 |
|
90 void |
|
91 http_fcgi_run(void) |
|
92 { |
|
93 struct kreq req; |
|
94 struct kfcgi *fcgi; |
|
95 |
|
96 if (khttp_fcgi_init(&fcgi, NULL, 0, pages, PAGE_NUM, 0) != KCGI_OK) |
|
97 return; |
|
98 |
|
99 while (khttp_fcgi_parse(fcgi, &req) == KCGI_OK) |
|
100 process(&req); |
|
101 |
|
102 khttp_fcgi_free(fcgi); |
|
103 } |
|
104 |
|
105 void |
|
106 http_cgi_run(void) |
|
107 { |
|
108 struct kreq req; |
|
109 |
|
110 if (khttp_parse(&req, NULL, 0, pages, PAGE_NUM, 0) == KCGI_OK) |
|
111 process(&req); |
|
112 } |