annotate http.c @ 3:80d67d8dbfb2

pasterd: implement /download
author David Demelier <markand@malikania.fr>
date Wed, 05 Feb 2020 09:19:12 +0100
parents 65607ae124b1
children ca5b8abc2d44
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>
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
26 #include <string.h>
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <unistd.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include <kcgi.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include "config.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include "database.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include "http.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include "log.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include "paste.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include "util.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 static void page_index(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 static void page_new(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 static void page_fork(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 static void page_paste(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 static void page_about(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 static void page_download(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 enum page {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 PAGE_INDEX,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 PAGE_NEW,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 PAGE_FORK,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 PAGE_PASTE,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 PAGE_ABOUT,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 PAGE_DOWNLOAD,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 PAGE_LAST /* Not used. */
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
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 static const char *pages[] = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 [PAGE_INDEX] = "",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 [PAGE_NEW] = "new",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 [PAGE_FORK] = "fork",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 [PAGE_PASTE] = "paste",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 [PAGE_ABOUT] = "about",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 [PAGE_DOWNLOAD] = "download",
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
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 static void (*handlers[])(struct kreq *req) = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 [PAGE_INDEX] = page_index,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 [PAGE_NEW] = page_new,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 [PAGE_FORK] = page_fork,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 [PAGE_PASTE] = page_paste,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 [PAGE_ABOUT] = page_about,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 [PAGE_DOWNLOAD] = page_download
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
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 struct tmpl_index {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 struct kreq *req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 struct paste pastes[10];
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 size_t count;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 size_t current;
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
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 struct tmpl_paste {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 struct kreq *req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 struct paste paste;
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
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
85 static const char *tmpl_index_keywords[] = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
86 "uuid",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
87 "name",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
88 "author",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
89 "language",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
90 "expiration"
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
91 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
92
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
93 static const char *tmpl_paste_keywords[] = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
94 "uuid",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
95 "title",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
96 "author",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
97 "language",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
98 "code",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
99 "timestamp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
100 "visible",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
101 "duration"
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
102 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
103
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
104 static const char *tmpl_new_keywords[] = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
105 "title", /* /fork only */
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
106 "author", /* /fork only */
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
107 "code", /* /fork only */
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
108 "languages"
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
109 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
110
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
111 static const char *languages[] = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
112 "1c",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
113 "abnf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
114 "accesslog",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
115 "actionscript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
116 "ada",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
117 "apache",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
118 "applescript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
119 "arduino",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
120 "armasm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
121 "asciidoc",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
122 "aspectj",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
123 "autohotkey",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
124 "autoit",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
125 "avrasm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
126 "awk",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
127 "axapta",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
128 "bash",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
129 "basic",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
130 "bnf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
131 "brainfuck",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
132 "cal",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
133 "capnproto",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
134 "ceylon",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
135 "clean",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
136 "clojure",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
137 "clojure-repl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
138 "cmake",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
139 "coffeescript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
140 "coq",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
141 "cos",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
142 "cpp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
143 "crmsh",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
144 "crystal",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
145 "cs",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
146 "csp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
147 "css",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
148 "dart",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
149 "delphi",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
150 "diff",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
151 "django",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
152 "d",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
153 "dns",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
154 "dockerfile",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
155 "dos",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
156 "dsconfig",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
157 "dts",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
158 "dust",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
159 "ebnf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
160 "elixir",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
161 "elm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
162 "erb",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
163 "erlang",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
164 "erlang-repl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
165 "excel",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
166 "fix",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
167 "flix",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
168 "fortran",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
169 "fsharp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
170 "gams",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
171 "gauss",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
172 "gcode",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
173 "gherkin",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
174 "glsl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
175 "go",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
176 "golo",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
177 "gradle",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
178 "groovy",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
179 "haml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
180 "handlebars",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
181 "haskell",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
182 "haxe",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
183 "hsp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
184 "htmlbars",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
185 "http",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
186 "hy",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
187 "inform7",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
188 "ini",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
189 "irpf90",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
190 "java",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
191 "javascript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
192 "jboss-cli",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
193 "json",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
194 "julia",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
195 "julia-repl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
196 "kotlin",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
197 "lasso",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
198 "ldif",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
199 "leaf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
200 "less",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
201 "lisp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
202 "livecodeserver",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
203 "livescript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
204 "llvm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
205 "lsl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
206 "lua",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
207 "makefile",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
208 "markdown",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
209 "mathematica",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
210 "matlab",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
211 "maxima",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
212 "mel",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
213 "mercury",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
214 "mipsasm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
215 "mizar",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
216 "mojolicious",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
217 "monkey",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
218 "moonscript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
219 "n1ql",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
220 "nginx",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
221 "nimrod",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
222 "nix",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
223 "nohighlight",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
224 "nsis",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
225 "objectivec",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
226 "ocaml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
227 "openscad",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
228 "oxygene",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
229 "parser3",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
230 "perl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
231 "pf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
232 "php",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
233 "pony",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
234 "powershell",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
235 "processing",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
236 "profile",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
237 "prolog",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
238 "protobuf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
239 "puppet",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
240 "purebasic",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
241 "python",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
242 "q",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
243 "qml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
244 "rib",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
245 "r",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
246 "roboconf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
247 "routeros",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
248 "rsl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
249 "ruby",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
250 "ruleslanguage",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
251 "rust",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
252 "scala",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
253 "scheme",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
254 "scilab",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
255 "scss",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
256 "shell",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
257 "smali",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
258 "smalltalk",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
259 "sml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
260 "sqf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
261 "sql",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
262 "stan",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
263 "stata",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
264 "step21",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
265 "stylus",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
266 "subunit",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
267 "swift",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
268 "taggerscript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
269 "tap",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
270 "tcl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
271 "tex",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
272 "thrift",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
273 "tp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
274 "twig",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
275 "typescript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
276 "vala",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
277 "vbnet",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
278 "vbscript-html",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
279 "vbscript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
280 "verilog",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
281 "vhdl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
282 "vim",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
283 "x86asm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
284 "xl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
285 "xml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
286 "xquery",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
287 "yaml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
288 "zephir",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
289 NULL
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
290 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
291
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 static const char *
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 template(const char *filename)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 /* Build path to the template file. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 static char path[PATH_MAX];
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
297
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 snprintf(path, sizeof (path), "%s/%s", config.themedir, filename);
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 return path;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
302
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
303 static void
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
304 page_header(struct kreq *req)
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
305 {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
306 khttp_template(req, NULL, template("header.html"));
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
307 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
308
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
309 static void
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
310 page_footer(struct kreq *req)
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
311 {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
312 khttp_template(req, NULL, template("footer.html"));
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
313 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
314
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
315 static void
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
316 page_error(struct kreq *req, int httpcode, const char *filename)
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
317 {
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
318 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[httpcode]);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
319 khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_TEXT_HTML]);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
320 khttp_body(req);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
321 page_header(req);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
322 khttp_template(req, NULL, template(filename));
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
323 page_footer(req);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
324 }
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
325
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
326 static long long int
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
327 duration(const char *val)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
328 {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
329 if (strcmp(val, "hour") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
330 return PASTE_HOUR;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
331 if (strcmp(val, "day") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
332 return PASTE_DAY;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
333 if (strcmp(val, "week") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
334 return PASTE_WEEK;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
335 if (strcmp(val, "month") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
336 return PASTE_MONTH;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
337
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
338 /* Default to month. */
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
339 return PASTE_MONTH;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
340 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
341
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 static int
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 tmpl_paste(size_t index, void *arg)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 struct tmpl_paste *data = arg;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 struct paste *paste = &data->paste;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
347
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 switch (index) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 case 0:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 khttp_puts(data->req, paste->uuid);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 case 1:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 khttp_puts(data->req, paste->title);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 case 2:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 khttp_puts(data->req, paste->author);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 case 3:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 khttp_puts(data->req, paste->language);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 case 4:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 khttp_puts(data->req, paste->code);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 case 5:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 /* TODO: timestamp here. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 khttp_puts(data->req, "TODO");
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 case 6:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 khttp_puts(data->req, bprintf("%s", paste->visible ? "Yes" : "No"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 case 7:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 /* TODO: convert time left. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 khttp_puts(data->req, "TODO");
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 default:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
378
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 return true;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
381
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 static int
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 tmpl_index_pastes(size_t index, void *arg)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 struct tmpl_index *data = arg;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 struct paste *paste = &data->pastes[data->current];
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
387
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 switch (index) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 case 0:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 khttp_puts(data->req, paste->uuid);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 case 1:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 khttp_puts(data->req, paste->title);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 case 2:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 khttp_puts(data->req, paste->author);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 case 3:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 khttp_puts(data->req, paste->language);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 case 4:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 khttp_puts(data->req, bprintf("%d", paste->duration));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 default:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
406 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
407
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 return true;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
409 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
410
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 static int
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 tmpl_index(size_t index, void *arg)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 /* No check, only one index. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 struct tmpl_index *data = arg;
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
416 const struct ktemplate kt = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
417 .key = tmpl_index_keywords,
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
418 .keysz = 5,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 .arg = data,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 .cb = tmpl_index_pastes
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
422
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 for (size_t i = 0; i < data->count; ++i) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
424 khttp_template(data->req, &kt, template("index-paste.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 data->current++;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
427
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 return true;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
430
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
431 static int
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
432 tmpl_new(size_t index, void *arg)
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 {
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
434 struct tmpl_paste *data = arg;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
435 struct paste *paste = &data->paste;
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
436
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
437 switch (index) {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
438 case 0:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
439 if (paste->title)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
440 khttp_puts(data->req, paste->title);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
441 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
442 case 1:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
443 if (paste->author)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
444 khttp_puts(data->req, paste->author);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
445 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
446 case 2:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
447 if (paste->code)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
448 khttp_puts(data->req, paste->code);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
449 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
450 case 3:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
451 /* TODO: fragment? */
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
452 for (const char **l = languages; *l != NULL; ++l)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
453 khttp_puts(data->req,
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
454 bprintf("<option value=\"%s\">%s</option>", *l, *l));
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
455 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
456 default:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
457 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
458 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
459
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
460 return true;
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
461 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
462
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 page_index(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
465 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
466 struct tmpl_index data = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
467 .req = req,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
468 .count = 10
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
469 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
470
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
471 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
472
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
473 if (!database_recents(data.pastes, &data.count)) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
474 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_500]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
475 khttp_body(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
476 khttp_template(req, NULL, template("500.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
477 } else {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
478 const char *keywords[] = { "pastes" };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
479 struct ktemplate kt = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
480 .key = keywords,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
481 .keysz = 1,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
482 .arg = &data,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
483 .cb = tmpl_index
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
484 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
485
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
486 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
487 khttp_body(req);
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
488 page_header(req);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
489 khttp_template(req, &kt, template("index.html"));
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
490 page_footer(req);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
491 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
492
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
493 for (size_t i = 0; i < data.count; ++i)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
494 paste_finish(&data.pastes[i]);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
495
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
496 khttp_free(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
497 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
498
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
499 static void
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
500 page_new_get(struct kreq *req)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
501 {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
502 struct tmpl_paste data = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
503 .req = req
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
504 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
505 const struct ktemplate kt = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
506 .key = tmpl_new_keywords,
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
507 .keysz = 4,
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
508 .cb = tmpl_new,
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
509 .arg = &data
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
510 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
511
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
512 khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_TEXT_HTML]);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
513 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
514 khttp_body(req);
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
515 page_header(req);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
516 khttp_template(req, &kt, template("new.html"));
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
517 page_footer(req);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
518 khttp_free(req);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
519 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
520
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
521 static void
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
522 page_new_post(struct kreq *req)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
523 {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
524 struct paste paste = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
525 .visible = true
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
526 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
527
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
528 for (size_t i = 0; i < req->fieldsz; ++i) {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
529 const char *key = req->fields[i].key;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
530 const char *val = req->fields[i].val;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
531
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
532 if (strcmp(key, "title") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
533 paste.title = estrdup(val);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
534 else if (strcmp(key, "author") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
535 paste.author = estrdup(val);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
536 else if (strcmp(key, "language") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
537 paste.language = estrdup(val);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
538 else if (strcmp(key, "duration") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
539 paste.duration = duration(val);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
540 else if (strcmp(key, "code") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
541 paste.code = estrdup(val);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
542 else if (strcmp(key, "private") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
543 paste.visible = strcmp(val, "on") != 0;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
544 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
545
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
546 khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_TEXT_HTML]);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
547
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
548 if (!paste.title || !paste.author || !paste.language || !paste.code) {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
549 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_400]);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
550 khttp_body(req);
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
551 page_header(req);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
552 khttp_template(req, NULL, template("400.html"));
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
553 page_footer(req);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
554 } else {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
555 if (!database_insert(&paste)) {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
556 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_500]);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
557 khttp_body(req);
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
558 page_header(req);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
559 khttp_template(req, NULL, template("500.html"));
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
560 page_footer(req);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
561 } else {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
562 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_302]);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
563 khttp_head(req, kresps[KRESP_LOCATION], "/paste/%s", paste.uuid);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
564 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
565 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
566
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
567 khttp_free(req);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
568 paste_finish(&paste);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
569 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
570
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
571 static void
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
572 page_new(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
573 {
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
574 switch (req->method) {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
575 case KMETHOD_GET:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
576 page_new_get(req);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
577 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
578 case KMETHOD_POST:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
579 page_new_post(req);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
580 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
581 default:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
582 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
583 }
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
584 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
585
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
586 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
587 page_fork(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
588 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
589 (void)req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
590 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
591
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
592 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
593 page_paste(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
594 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
595 struct tmpl_paste data = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
596 .req = req
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
597 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
598
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
599 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
600
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
601 if (!database_get(&data.paste, req->path)) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
602 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_404]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
603 khttp_body(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
604 khttp_template(req, NULL, template("404.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
605 } else {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
606 const struct ktemplate kt = {
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
607 .key = tmpl_paste_keywords,
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
608 .keysz = 8,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
609 .cb = tmpl_paste,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
610 .arg = &data
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
611 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
612
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
613 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
614 khttp_body(req);
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
615 page_header(req);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
616 khttp_template(req, &kt, template("paste.html"));
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
617 page_footer(req);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
618 }
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
619
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
620 khttp_free(req);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
621 paste_finish(&data.paste);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
622 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
623
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
624 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
625 page_about(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
626 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
627 (void)req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
628 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
629
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
630 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
631 page_download(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
632 {
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
633 if (req->method != KMETHOD_GET)
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
634 return;
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
635
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
636 struct paste paste;
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
637
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
638 if (!database_get(&paste, req->path))
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
639 page_error(req, KHTTP_404, "404.html");
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
640 else {
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
641 khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_APP_OCTET_STREAM]);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
642 #if 0
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
643 /* TODO: this seems to generated truncated files. */
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
644 khttp_head(req, kresps[KRESP_CONTENT_LENGTH], "%zu", strlen(paste.code));
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
645 #endif
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
646 khttp_head(req, kresps[KRESP_CONNECTION], "keep-alive");
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
647 khttp_head(req, kresps[KRESP_CONTENT_DISPOSITION],
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
648 "attachment; filename=\"%s.%s\"", paste.uuid, paste.language);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
649 khttp_body(req);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
650 khttp_puts(req, paste.code);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
651 paste_finish(&paste);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
652 }
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
653
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
654 khttp_free(req);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
655 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
656
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
657 static void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
658 process(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
659 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
660 assert(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
661
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
662 handlers[req->page](req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
663 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
664
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
665 void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
666 http_fcgi_run(void)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
667 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
668 struct kreq req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
669 struct kfcgi *fcgi;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
670
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
671 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
672 return;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
673
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
674 while (khttp_fcgi_parse(fcgi, &req) == KCGI_OK)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
675 process(&req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
676
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
677 khttp_fcgi_free(fcgi);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
678 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
679
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
680 void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
681 http_cgi_run(void)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
682 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
683 struct kreq req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
684
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
685 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
686 process(&req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
687 }