annotate http.c @ 1:836a698946f8

pasterd: add basic routes
author David Demelier <markand@malikania.fr>
date Tue, 04 Feb 2020 16:44:43 +0100
parents
children 65607ae124b1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * http.c -- HTTP parsing and rendering
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <sys/types.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <assert.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <limits.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <stdarg.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <stdint.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <stdio.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <stdlib.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <unistd.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <kcgi.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include "config.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include "database.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include "http.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include "log.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include "paste.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include "util.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 static void page_index(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 static void page_new(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 static void page_fork(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 static void page_paste(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 static void page_about(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 static void page_download(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 enum page {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 PAGE_INDEX,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 PAGE_NEW,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 PAGE_FORK,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 PAGE_PASTE,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 PAGE_ABOUT,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 PAGE_DOWNLOAD,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 PAGE_LAST /* Not used. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 static const char *pages[] = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 [PAGE_INDEX] = "",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 [PAGE_NEW] = "new",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 [PAGE_FORK] = "fork",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 [PAGE_PASTE] = "paste",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 [PAGE_ABOUT] = "about",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 [PAGE_DOWNLOAD] = "download",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 static void (*handlers[])(struct kreq *req) = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 [PAGE_INDEX] = page_index,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 [PAGE_NEW] = page_new,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 [PAGE_FORK] = page_fork,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 [PAGE_PASTE] = page_paste,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 [PAGE_ABOUT] = page_about,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 [PAGE_DOWNLOAD] = page_download
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 struct tmpl_index {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 struct kreq *req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 struct paste pastes[10];
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 size_t count;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 size_t current;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 struct tmpl_paste {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 struct kreq *req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 struct paste paste;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 static const char *
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 template(const char *filename)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 /* Build path to the template file. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 static char path[PATH_MAX];
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 snprintf(path, sizeof (path), "%s/%s", config.themedir, filename);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 return path;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 static int
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 tmpl_paste(size_t index, void *arg)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 struct tmpl_paste *data = arg;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 struct paste *paste = &data->paste;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 switch (index) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 case 0:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 khttp_puts(data->req, paste->uuid);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 case 1:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 khttp_puts(data->req, paste->title);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 case 2:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 khttp_puts(data->req, paste->author);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 case 3:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 khttp_puts(data->req, paste->language);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 case 4:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 khttp_puts(data->req, paste->code);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 case 5:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 /* TODO: timestamp here. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 khttp_puts(data->req, "TODO");
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 case 6:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 khttp_puts(data->req, bprintf("%s", paste->visible ? "Yes" : "No"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 case 7:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 /* TODO: convert time left. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 khttp_puts(data->req, "TODO");
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 default:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 return true;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
134
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 static int
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 tmpl_index_pastes(size_t index, void *arg)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 struct tmpl_index *data = arg;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 struct paste *paste = &data->pastes[data->current];
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 switch (index) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 case 0:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 khttp_puts(data->req, paste->uuid);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 case 1:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 khttp_puts(data->req, paste->title);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 case 2:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 khttp_puts(data->req, paste->author);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 case 3:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 khttp_puts(data->req, paste->language);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 case 4:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 khttp_puts(data->req, bprintf("%d", paste->duration));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 default:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
160
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 return true;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 static int
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 tmpl_index(size_t index, void *arg)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 /* No check, only one index. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 struct tmpl_index *data = arg;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 const char *keywords[] = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 "uuid",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 "name",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 "author",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 "language",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 "expiration"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 struct ktemplate kt = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 .key = keywords,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 .keysz = 5,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 .arg = data,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 .cb = tmpl_index_pastes
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
182
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 for (size_t i = 0; i < data->count; ++i) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 khttp_template(data->req, &kt, template("index-paste.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 data->current++;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
187
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 return true;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 header(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 khttp_template(req, NULL, template("header.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 footer(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 khttp_template(req, NULL, template("footer.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 page_index(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 struct tmpl_index data = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 .req = req,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 .count = 10
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_TEXT_HTML]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
212
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 if (!database_recents(data.pastes, &data.count)) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_500]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 khttp_body(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 khttp_template(req, NULL, template("500.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 } else {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 const char *keywords[] = { "pastes" };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 struct ktemplate kt = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 .key = keywords,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 .keysz = 1,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 .arg = &data,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 .cb = tmpl_index
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
225
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 khttp_body(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 header(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 khttp_template(req, &kt, template("index.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 footer(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
232
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 khttp_free(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
235
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 page_new(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 (void)req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
241
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 page_fork(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 (void)req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
247
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 page_paste(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 struct tmpl_paste data = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 .req = req
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
254
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_TEXT_HTML]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
256
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 if (!database_get(&data.paste, req->path)) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_404]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 khttp_body(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 khttp_template(req, NULL, template("404.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 } else {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 const char *keywords[] = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 "uuid",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 "title",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 "author",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 "language",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 "code",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 "timestamp",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 "visible",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 "duration"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 const struct ktemplate kt = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 .key = keywords,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 .keysz = 8,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 .cb = tmpl_paste,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 .arg = &data
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
278
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 khttp_body(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 header(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 khttp_template(req, &kt, template("paste.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 footer(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 khttp_free(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
287
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 page_about(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 (void)req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 page_download(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 (void)req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
299
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 process(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 assert(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
304
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 handlers[req->page](req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
307
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 http_fcgi_run(void)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 struct kreq req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 struct kfcgi *fcgi;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
313
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 if (khttp_fcgi_init(&fcgi, NULL, 0, pages, PAGE_LAST, 0) != KCGI_OK)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 return;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
316
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 while (khttp_fcgi_parse(fcgi, &req) == KCGI_OK)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 process(&req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
319
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 khttp_fcgi_free(fcgi);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
322
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 http_cgi_run(void)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 struct kreq req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
327
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 if (khttp_parse(&req, NULL, 0, pages, PAGE_LAST, 0) == KCGI_OK)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 process(&req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 }