annotate http.c @ 38:48834441dc86

pasterd: generate smaller identifiers, closes #2480 @1h
author David Demelier <markand@malikania.fr>
date Wed, 12 Feb 2020 20:55:00 +0100
parents f4e8a7920b94
children 07b6887d3557
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>
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
5 *
1
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.
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
9 *
1
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>
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
20 #include <sys/stat.h>
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <assert.h>
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
22 #include <ctype.h>
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <limits.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <stdarg.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <stdint.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <stdio.h>
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <stdlib.h>
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
28 #include <string.h>
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include <unistd.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 <kcgi.h>
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
32 #include <kcgihtml.h>
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include "config.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include "database.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include "http.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #include "log.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 #include "paste.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 #include "util.h"
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 static void page_index(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 static void page_new(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 static void page_fork(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 static void page_paste(struct kreq *);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 static void page_download(struct kreq *);
25
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
46 static void page_search(struct kreq *);
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
47 static void page_static(struct kreq *);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 enum page {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 PAGE_INDEX,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 PAGE_NEW,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 PAGE_FORK,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 PAGE_PASTE,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 PAGE_DOWNLOAD,
25
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
55 PAGE_SEARCH,
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
56 PAGE_STATIC,
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 PAGE_LAST /* Not used. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 static const char *pages[] = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 [PAGE_INDEX] = "",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 [PAGE_NEW] = "new",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 [PAGE_FORK] = "fork",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 [PAGE_PASTE] = "paste",
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 [PAGE_DOWNLOAD] = "download",
25
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
66 [PAGE_SEARCH] = "search",
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
67 [PAGE_STATIC] = "static"
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 static void (*handlers[])(struct kreq *req) = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 [PAGE_INDEX] = page_index,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 [PAGE_NEW] = page_new,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 [PAGE_FORK] = page_fork,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 [PAGE_PASTE] = page_paste,
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
75 [PAGE_DOWNLOAD] = page_download,
25
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
76 [PAGE_SEARCH] = page_search,
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
77 [PAGE_STATIC] = page_static
1
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_index {
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 pastes[10];
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 size_t count;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 size_t current;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 };
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 struct tmpl_paste {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 struct kreq *req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 struct paste paste;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
92 static const char *tmpl_index_keywords[] = {
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
93 "pastes"
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
94 };
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
95
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
96 static const char *tmpl_index_pastes_keywords[] = {
38
48834441dc86 pasterd: generate smaller identifiers, closes #2480 @1h
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
97 "id",
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
98 "name",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
99 "author",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
100 "language",
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
101 "expiration",
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
102 "date"
2
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
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
105 static const char *tmpl_paste_keywords[] = {
38
48834441dc86 pasterd: generate smaller identifiers, closes #2480 @1h
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
106 "id",
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
107 "title",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
108 "author",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
109 "language",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
110 "code",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
111 "timestamp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
112 "visible",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
113 "duration"
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
114 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
115
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
116 static const char *tmpl_new_keywords[] = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
117 "title", /* /fork only */
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
118 "author", /* /fork only */
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
119 "code", /* /fork only */
8
0f1d65d5ea89 pasterd: bring visibility into /fork
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
120 "private", /* /fork only */
10
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
121 "languages",
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
122 "durations"
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
123 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
124
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
125 static const char *languages[] = {
7
39defd15564e paster: initial import
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
126 "nohighlight",
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
127 "1c",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
128 "abnf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
129 "accesslog",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
130 "actionscript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
131 "ada",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
132 "apache",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
133 "applescript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
134 "arduino",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
135 "armasm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
136 "asciidoc",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
137 "aspectj",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
138 "autohotkey",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
139 "autoit",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
140 "avrasm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
141 "awk",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
142 "axapta",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
143 "bash",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
144 "basic",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
145 "bnf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
146 "brainfuck",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
147 "cal",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
148 "capnproto",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
149 "ceylon",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
150 "clean",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
151 "clojure",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
152 "clojure-repl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
153 "cmake",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
154 "coffeescript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
155 "coq",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
156 "cos",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
157 "cpp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
158 "crmsh",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
159 "crystal",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
160 "cs",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
161 "csp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
162 "css",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
163 "dart",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
164 "delphi",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
165 "diff",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
166 "django",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
167 "d",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
168 "dns",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
169 "dockerfile",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
170 "dos",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
171 "dsconfig",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
172 "dts",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
173 "dust",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
174 "ebnf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
175 "elixir",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
176 "elm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
177 "erb",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
178 "erlang",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
179 "erlang-repl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
180 "excel",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
181 "fix",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
182 "flix",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
183 "fortran",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
184 "fsharp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
185 "gams",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
186 "gauss",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
187 "gcode",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
188 "gherkin",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
189 "glsl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
190 "go",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
191 "golo",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
192 "gradle",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
193 "groovy",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
194 "haml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
195 "handlebars",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
196 "haskell",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
197 "haxe",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
198 "hsp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
199 "htmlbars",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
200 "http",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
201 "hy",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
202 "inform7",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
203 "ini",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
204 "irpf90",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
205 "java",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
206 "javascript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
207 "jboss-cli",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
208 "json",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
209 "julia",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
210 "julia-repl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
211 "kotlin",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
212 "lasso",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
213 "ldif",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
214 "leaf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
215 "less",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
216 "lisp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
217 "livecodeserver",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
218 "livescript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
219 "llvm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
220 "lsl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
221 "lua",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
222 "makefile",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
223 "markdown",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
224 "mathematica",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
225 "matlab",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
226 "maxima",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
227 "mel",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
228 "mercury",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
229 "mipsasm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
230 "mizar",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
231 "mojolicious",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
232 "monkey",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
233 "moonscript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
234 "n1ql",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
235 "nginx",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
236 "nimrod",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
237 "nix",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
238 "nsis",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
239 "objectivec",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
240 "ocaml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
241 "openscad",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
242 "oxygene",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
243 "parser3",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
244 "perl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
245 "pf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
246 "php",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
247 "pony",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
248 "powershell",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
249 "processing",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
250 "profile",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
251 "prolog",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
252 "protobuf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
253 "puppet",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
254 "purebasic",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
255 "python",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
256 "q",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
257 "qml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
258 "rib",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
259 "r",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
260 "roboconf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
261 "routeros",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
262 "rsl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
263 "ruby",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
264 "ruleslanguage",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
265 "rust",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
266 "scala",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
267 "scheme",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
268 "scilab",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
269 "scss",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
270 "shell",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
271 "smali",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
272 "smalltalk",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
273 "sml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
274 "sqf",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
275 "sql",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
276 "stan",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
277 "stata",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
278 "step21",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
279 "stylus",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
280 "subunit",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
281 "swift",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
282 "taggerscript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
283 "tap",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
284 "tcl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
285 "tex",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
286 "thrift",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
287 "tp",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
288 "twig",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
289 "typescript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
290 "vala",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
291 "vbnet",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
292 "vbscript-html",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
293 "vbscript",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
294 "verilog",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
295 "vhdl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
296 "vim",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
297 "x86asm",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
298 "xl",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
299 "xml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
300 "xquery",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
301 "yaml",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
302 "zephir",
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
303 NULL
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
304 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
305
10
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
306 static const struct {
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
307 const char *title;
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
308 long long int secs;
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
309 } durations[] = {
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
310 { "month", PASTE_MONTH },
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
311 { "week", PASTE_WEEK },
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
312 { "day", PASTE_DAY },
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
313 { "hour", PASTE_HOUR },
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
314 { NULL, -1 }
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
315 };
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
316
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 static const char *
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 template(const char *filename)
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 /* Build path to the template file. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 static char path[PATH_MAX];
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 snprintf(path, sizeof (path), "%s/%s", config.themedir, filename);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
324
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 return path;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
327
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
328 static long long int
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
329 duration(const char *val)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
330 {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
331 if (strcmp(val, "hour") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
332 return PASTE_HOUR;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
333 if (strcmp(val, "day") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
334 return PASTE_DAY;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
335 if (strcmp(val, "week") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
336 return PASTE_WEEK;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
337 if (strcmp(val, "month") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
338 return PASTE_MONTH;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
339
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
340 /* Default to month. */
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
341 return PASTE_MONTH;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
342 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
343
10
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
344 static const char *
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
345 ttl(time_t timestamp, long long int duration)
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
346 {
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
347 const time_t now = time(NULL);
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
348 const long long int left = duration - difftime(now, timestamp);
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
349
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
350 if (left < PASTE_HOUR)
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
351 return bprintf("%lld minute(s)", left / 60);
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
352 if (left < PASTE_DAY)
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
353 return bprintf("%lld hour(s)", left / 3600);
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
354
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
355 /* Other in days. */
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
356 return bprintf("%lld day(s)", left / 86400);
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
357 }
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
358
9
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
359 static void
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
360 replace(char **dst, const char *s)
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
361 {
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
362 assert(dst);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
363 assert(s);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
364
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
365 /* Trim leading spaces. */
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
366 while (*s && isspace(*s))
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
367 s++;
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
368
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
369 if (*s) {
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
370 free(*dst);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
371 *dst = estrdup(s);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
372 }
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
373 }
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
374
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
375 static void
9
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
376 render_languages(struct kreq *req, const struct paste *paste)
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
377 {
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
378 for (const char **l = languages; *l != NULL; ++l) {
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
379 const char *line;
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
380
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
381 if (paste->language && strcmp(paste->language, *l) == 0)
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
382 line = bprintf("<option value=\"%s\" selected>%s</option>", *l, *l);
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
383 else
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
384 line = bprintf("<option value=\"%s\">%s</option>", *l, *l);
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
385
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
386 khttp_puts(req, line);
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
387 }
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
388 }
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
389
10
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
390 static void
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
391 render_durations(struct kreq *req, const struct paste *paste)
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
392 {
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
393 for (size_t i = 0; durations[i].title != NULL; ++i) {
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
394 const char *line;
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
395
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
396 if (paste->duration == durations[i].secs)
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
397 line = bprintf("<option value=\"%s\" selected>%s</option>",
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
398 durations[i].title, durations[i].title);
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
399 else
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
400 line = bprintf("<option value=\"%s\">%s</option>",
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
401 durations[i].title, durations[i].title);
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
402
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
403 khttp_puts(req, line);
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
404 }
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
405 }
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
406
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 static int
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 tmpl_paste(size_t index, void *arg)
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 struct tmpl_paste *data = arg;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 struct paste *paste = &data->paste;
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
412 struct khtmlreq htmlreq;
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
413
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
414 khtml_open(&htmlreq, data->req, KHTML_PRETTY);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
415
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 switch (index) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 case 0:
38
48834441dc86 pasterd: generate smaller identifiers, closes #2480 @1h
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
418 khtml_puts(&htmlreq, paste->id);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 case 1:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
421 khtml_puts(&htmlreq, paste->title);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 case 2:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
424 khtml_puts(&htmlreq, paste->author);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 case 3:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
427 khtml_puts(&htmlreq, paste->language);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 case 4:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
430 khtml_puts(&htmlreq, paste->code);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 case 5:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
433 khtml_puts(&htmlreq, bstrftime("%c", localtime(&paste->timestamp)));
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
434 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 case 6:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
436 khtml_puts(&htmlreq, bprintf("%s", paste->visible ? "Yes" : "No"));
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
438 case 7:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
439 khtml_puts(&htmlreq, ttl(paste->timestamp, paste->duration));
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
440 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 default:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
444
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
445 khtml_close(&htmlreq);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
446
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
447 return true;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
448 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
449
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
450 static int
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
451 tmpl_index_pastes(size_t index, void *arg)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
452 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
453 struct tmpl_index *data = arg;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
454 struct paste *paste = &data->pastes[data->current];
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
455 struct khtmlreq htmlreq;
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
456
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
457 khtml_open(&htmlreq, data->req, KHTML_PRETTY);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
458
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
459 switch (index) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
460 case 0:
38
48834441dc86 pasterd: generate smaller identifiers, closes #2480 @1h
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
461 khtml_puts(&htmlreq, paste->id);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
462 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 case 1:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
464 khtml_puts(&htmlreq, paste->title);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
465 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
466 case 2:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
467 khtml_puts(&htmlreq, paste->author);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
468 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
469 case 3:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
470 khtml_puts(&htmlreq, paste->language);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
471 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
472 case 4:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
473 khtml_puts(&htmlreq, ttl(paste->timestamp, paste->duration));
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
474 break;
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
475 case 5:
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
476 khtml_puts(&htmlreq, bstrftime("%c", localtime(&paste->timestamp)));
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
477 break;
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
478 default:
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
479 break;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
480 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
481
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
482 khtml_close(&htmlreq);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
483
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
484 return true;
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
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
487 static int
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
488 tmpl_index(size_t index, void *arg)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
489 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
490 /* No check, only one index. */
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
491 (void)index;
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
492
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
493 struct tmpl_index *data = arg;
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
494 const struct ktemplate kt = {
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
495 .key = tmpl_index_pastes_keywords,
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
496 .keysz = 6,
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
497 .arg = data,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
498 .cb = tmpl_index_pastes
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
499 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
500
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
501 for (size_t i = 0; i < data->count; ++i) {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
502 khttp_template(data->req, &kt, template("index-paste.html"));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
503 data->current++;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
504 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
505
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
506 return true;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
507 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
508
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
509 static int
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
510 tmpl_new(size_t index, void *arg)
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
511 {
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
512 struct tmpl_paste *data = arg;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
513 struct paste *paste = &data->paste;
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
514 struct khtmlreq htmlreq;
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
515
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
516 khtml_open(&htmlreq, data->req, KHTML_PRETTY);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
517
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
518 switch (index) {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
519 case 0:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
520 if (paste->title)
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
521 khtml_puts(&htmlreq, paste->title);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
522 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
523 case 1:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
524 if (paste->author)
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
525 khtml_puts(&htmlreq, paste->author);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
526 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
527 case 2:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
528 if (paste->code)
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
529 khtml_puts(&htmlreq, paste->code);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
530 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
531 case 3:
8
0f1d65d5ea89 pasterd: bring visibility into /fork
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
532 /* Add checked attribute to combobox. */
0f1d65d5ea89 pasterd: bring visibility into /fork
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
533 if (!paste->visible)
0f1d65d5ea89 pasterd: bring visibility into /fork
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
534 khttp_puts(data->req, "checked");
9
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
535 break;
8
0f1d65d5ea89 pasterd: bring visibility into /fork
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
536 case 4:
9
e8f61741aaec pasterd: bring language into /fork
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
537 render_languages(data->req, paste);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
538 break;
10
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
539 case 5:
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
540 render_durations(data->req, paste);
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
541 break;
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
542 default:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
543 break;
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
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
546 khtml_close(&htmlreq);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
547
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
548 return true;
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
549 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
550
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
551 static void
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
552 page_header(struct kreq *req)
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
553 {
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
554 khttp_template(req, NULL, template("header.html"));
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
555 }
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
556
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
557 static void
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
558 page_footer(struct kreq *req)
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
559 {
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
560 khttp_template(req, NULL, template("footer.html"));
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
561 }
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
562
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
563 static void
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
564 page(struct kreq *req, const struct ktemplate *tmpl, enum khttp status, const char *file)
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
565 {
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
566 khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_TEXT_HTML]);
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
567 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[status]);
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
568 khttp_body(req);
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
569 page_header(req);
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
570 khttp_template(req, tmpl, template(file));
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
571 page_footer(req);
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
572 khttp_free(req);
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
573 }
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
574
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
575 static void
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
576 page_index_get(struct kreq *req)
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
577 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
578 struct tmpl_index data = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
579 .req = req,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
580 .count = 10
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
581 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
582
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
583 if (!database_recents(data.pastes, &data.count))
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
584 page(req, NULL, KHTTP_500, "500.html");
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
585 else {
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
586 struct ktemplate kt = {
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
587 .key = tmpl_index_keywords,
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
588 .keysz = 1,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
589 .arg = &data,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
590 .cb = tmpl_index
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
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
593 page(req, &kt, KHTTP_200, "index.html");
1
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
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
596 for (size_t i = 0; i < data.count; ++i)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
597 paste_finish(&data.pastes[i]);
1
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
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
600 static void
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
601 page_index(struct kreq *req)
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
602 {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
603 switch (req->method) {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
604 case KMETHOD_GET:
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
605 page_index_get(req);
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
606 break;
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
607 default:
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
608 page(req, NULL, KHTTP_400, "400.html");
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
609 break;
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
610 }
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
611 }
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
612
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
613 static void
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
614 page_new_get(struct kreq *req)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
615 {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
616 struct tmpl_paste data = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
617 .req = req
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
618 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
619 const struct ktemplate kt = {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
620 .key = tmpl_new_keywords,
10
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
621 .keysz = 6,
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
622 .cb = tmpl_new,
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
623 .arg = &data
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
624 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
625
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
626 page(req, &kt, KHTTP_200, "new.html");
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
627 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
628
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
629 static void
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
630 page_new_post(struct kreq *req)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
631 {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
632 struct paste paste = {
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
633 .author = estrdup("Anonymous"),
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
634 .title = estrdup("Untitled"),
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
635 .language = estrdup("nohighlight"),
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
636 .visible = true
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
637 };
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
638
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
639 for (size_t i = 0; i < req->fieldsz; ++i) {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
640 const char *key = req->fields[i].key;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
641 const char *val = req->fields[i].val;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
642
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
643 if (strcmp(key, "title") == 0)
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
644 replace(&paste.title, val);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
645 else if (strcmp(key, "author") == 0)
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
646 replace(&paste.author, val);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
647 else if (strcmp(key, "language") == 0)
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
648 replace(&paste.language, val);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
649 else if (strcmp(key, "duration") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
650 paste.duration = duration(val);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
651 else if (strcmp(key, "code") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
652 paste.code = estrdup(val);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
653 else if (strcmp(key, "private") == 0)
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
654 paste.visible = strcmp(val, "on") != 0;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
655 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
656
22
8d274b012d28 pasterd: fix if code is empty
David Demelier <markand@malikania.fr>
parents: 21
diff changeset
657 /* Add empty string if needed. */
8d274b012d28 pasterd: fix if code is empty
David Demelier <markand@malikania.fr>
parents: 21
diff changeset
658 if (!paste.code)
8d274b012d28 pasterd: fix if code is empty
David Demelier <markand@malikania.fr>
parents: 21
diff changeset
659 paste.code = estrdup("");
8d274b012d28 pasterd: fix if code is empty
David Demelier <markand@malikania.fr>
parents: 21
diff changeset
660
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
661 if (!database_insert(&paste))
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
662 page(req, NULL, KHTTP_500, "500.html");
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
663 else {
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
664 /* Redirect to paste details. */
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
665 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_302]);
38
48834441dc86 pasterd: generate smaller identifiers, closes #2480 @1h
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
666 khttp_head(req, kresps[KRESP_LOCATION], "/paste/%s", paste.id);
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
667 khttp_body(req);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
668 khttp_free(req);
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
669 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
670
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
671 paste_finish(&paste);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
672 }
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
673
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
674 static void
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
675 page_new(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
676 {
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
677 switch (req->method) {
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
678 case KMETHOD_GET:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
679 page_new_get(req);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
680 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
681 case KMETHOD_POST:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
682 page_new_post(req);
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
683 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
684 default:
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
685 break;
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
686 }
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
687 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
688
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
689 static void
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
690 page_fork_get(struct kreq *req)
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
691 {
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
692 struct tmpl_paste data = {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
693 .req = req
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
694 };
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
695
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
696 if (!database_get(&data.paste, req->path))
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
697 page(req, NULL, KHTTP_404, "404.html");
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
698 else {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
699 const struct ktemplate kt = {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
700 .key = tmpl_new_keywords,
10
75cfe3795de3 pasterd: improve time left on index
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
701 .keysz = 6,
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
702 .cb = tmpl_new,
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
703 .arg = &data
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
704 };
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
705
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
706 page(req, &kt, KHTTP_200, "new.html");
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
707 paste_finish(&data.paste);
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
708 }
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
709 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
710
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
711 static void
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
712 page_fork(struct kreq *req)
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
713 {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
714 switch (req->method) {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
715 case KMETHOD_GET:
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
716 page_fork_get(req);
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
717 break;
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
718 default:
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
719 page(req, NULL, KHTTP_400, "400.html");
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
720 break;
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
721 }
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
722 }
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
723
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
724 static void
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
725 page_paste_get(struct kreq *req)
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
726 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
727 struct tmpl_paste data = {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
728 .req = req
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
729 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
730
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
731 if (!database_get(&data.paste, req->path))
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
732 page(req, NULL, KHTTP_404, "404.html");
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
733 else {
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
734 const struct ktemplate kt = {
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
735 .key = tmpl_paste_keywords,
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
736 .keysz = 8,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
737 .cb = tmpl_paste,
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
738 .arg = &data
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
739 };
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
740
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
741 page(req, &kt, KHTTP_200, "paste.html");
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
742 paste_finish(&data.paste);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
743 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
744 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
745
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
746 static void
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
747 page_paste(struct kreq *req)
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
748 {
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
749 switch (req->method) {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
750 case KMETHOD_GET:
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
751 page_paste_get(req);
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
752 break;
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
753 default:
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
754 page(req, NULL, KHTTP_400, "400.html");
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
755 break;
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
756 }
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
757 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
758
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
759 static void
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
760 page_download_get(struct kreq *req)
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
761 {
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
762 struct paste paste;
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
763
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
764 if (!database_get(&paste, req->path))
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
765 page(req, NULL, KHTTP_404, "404.html");
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
766 else {
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
767 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
768 #if 0
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
769 /* TODO: this seems to generated truncated files. */
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
770 khttp_head(req, kresps[KRESP_CONTENT_LENGTH], "%zu", strlen(paste.code));
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
771 #endif
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
772 khttp_head(req, kresps[KRESP_CONNECTION], "keep-alive");
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
773 khttp_head(req, kresps[KRESP_CONTENT_DISPOSITION],
38
48834441dc86 pasterd: generate smaller identifiers, closes #2480 @1h
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
774 "attachment; filename=\"%s.%s\"", paste.id, paste.language);
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
775 khttp_body(req);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
776 khttp_puts(req, paste.code);
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
777 khttp_free(req);
3
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
778 paste_finish(&paste);
80d67d8dbfb2 pasterd: implement /download
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
779 }
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
780 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
781
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
782 static void
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
783 page_download(struct kreq *req)
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
784 {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
785 switch (req->method) {
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
786 case KMETHOD_GET:
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
787 page_download_get(req);
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
788 break;
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
789 default:
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
790 page(req, NULL, KHTTP_400, "400.html");
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
791 break;
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
792 }
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
793 }
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
794
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 4
diff changeset
795 static void
25
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
796 page_search_get(struct kreq *req)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
797 {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
798 /* We re-use the /new form with an empty paste. */
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
799 struct tmpl_paste data = {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
800 .req = req
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
801 };
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
802 const struct ktemplate kt = {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
803 .key = tmpl_new_keywords,
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
804 .keysz = 6,
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
805 .cb = tmpl_new,
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
806 .arg = &data
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
807 };
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
808
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
809 page(req, &kt, KHTTP_200, "search.html");
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
810 }
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
811
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
812 static void
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
813 page_search_post(struct kreq *req)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
814 {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
815 struct tmpl_index data = {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
816 .req = req,
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
817 .count = 10
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
818 };
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
819
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
820 const char *title = NULL;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
821 const char *author = NULL;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
822 const char *language = NULL;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
823
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
824 for (size_t i = 0; i < req->fieldsz; ++i) {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
825 const char *key = req->fields[i].key;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
826 const char *val = req->fields[i].val;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
827
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
828 if (strcmp(key, "title") == 0)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
829 title = val;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
830 else if (strcmp(key, "author") == 0)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
831 author = val;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
832 else if (strcmp(key, "language") == 0)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
833 language = val;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
834 }
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
835
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
836 /* Sets to null if they are empty. */
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
837 if (title && strlen(title) == 0)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
838 title = NULL;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
839 if (author && strlen(author) == 0)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
840 author = NULL;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
841 if (language && strlen(language) == 0)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
842 language = NULL;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
843
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
844 if (!database_search(data.pastes, &data.count, title, author, language))
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
845 page(req, NULL, KHTTP_500, "500.html");
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
846 else {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
847 struct ktemplate kt = {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
848 .key = tmpl_index_keywords,
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
849 .keysz = 1,
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
850 .arg = &data,
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
851 .cb = tmpl_index
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
852 };
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
853
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
854 page(req, &kt, KHTTP_200, "index.html");
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
855 }
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
856
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
857 for (size_t i = 0; i < data.count; ++i)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
858 paste_finish(&data.pastes[i]);
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
859 }
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
860
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
861 static void
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
862 page_search(struct kreq *req)
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
863 {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
864 switch (req->method) {
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
865 case KMETHOD_GET:
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
866 page_search_get(req);
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
867 break;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
868 case KMETHOD_POST:
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
869 page_search_post(req);
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
870 break;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
871 default:
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
872 page(req, NULL, KHTTP_400, "400.html");
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
873 break;
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
874 }
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
875 }
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
876
f4e8a7920b94 pasterd: implement search, closes #2474 @30m
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
877 static void
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
878 page_static_get(struct kreq *req)
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
879 {
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
880 struct stat st;
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
881 char path[PATH_MAX];
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
882
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
883 snprintf(path, sizeof (path), "%s%s", config.themedir, req->fullpath);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
884
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
885 if (stat(path, &st) < 0)
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
886 page(req, NULL, KHTTP_404, "404.html");
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
887 else {
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
888 khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
889 khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[req->mime]);
16
29033b4fe558 pasterd: use default values and fix Content-Length
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
890 khttp_head(req, kresps[KRESP_CONTENT_LENGTH],
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
891 "%llu", (unsigned long long)(st.st_size));
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
892 khttp_body(req);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
893 khttp_template(req, NULL, path);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
894 khttp_free(req);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
895 }
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
896 }
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
897
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
898 static void
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
899 page_static(struct kreq *req)
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
900 {
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
901 switch (req->method) {
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
902 case KMETHOD_GET:
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
903 page_static_get(req);
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
904 break;
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
905 default:
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
906 page(req, NULL, KHTTP_400, "400.html");
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
907 break;
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
908 }
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
909 }
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
910
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
911 static void
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
912 process(struct kreq *req)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
913 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
914 assert(req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
915
21
21c103c33ac9 pasterd: improve verbosity, closes #2472
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
916 log_debug("http: accessing page '%s'", req->path);
21c103c33ac9 pasterd: improve verbosity, closes #2472
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
917
12
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
918 if (req->page == PAGE_LAST)
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
919 page(req, NULL, KHTTP_404, "404.html");
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
920 else
93f0440d452e pasterd: add siimple theme
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
921 handlers[req->page](req);
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
922 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
923
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
924 void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
925 http_fcgi_run(void)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
926 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
927 struct kreq req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
928 struct kfcgi *fcgi;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
929
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
930 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
931 return;
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
932
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
933 while (khttp_fcgi_parse(fcgi, &req) == KCGI_OK)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
934 process(&req);
4
ca5b8abc2d44 pasterd: refactor a bit
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
935
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
936 khttp_fcgi_free(fcgi);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
937 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
938
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
939 void
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
940 http_cgi_run(void)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
941 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
942 struct kreq req;
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
943
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
944 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
945 process(&req);
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
diff changeset
946 }