3 a80e4b65 2022-09-19 op * Copyright (c) 2022 Omar Polo <op@omarpolo.com>
5 a80e4b65 2022-09-19 op * Permission to use, copy, modify, and distribute this software for any
6 a80e4b65 2022-09-19 op * purpose with or without fee is hereby granted, provided that the above
7 a80e4b65 2022-09-19 op * copyright notice and this permission notice appear in all copies.
9 a80e4b65 2022-09-19 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 a80e4b65 2022-09-19 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 a80e4b65 2022-09-19 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 a80e4b65 2022-09-19 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 a80e4b65 2022-09-19 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 a80e4b65 2022-09-19 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 a80e4b65 2022-09-19 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 a80e4b65 2022-09-19 op #include <sys/queue.h>
19 a80e4b65 2022-09-19 op #include <sys/tree.h>
21 a80e4b65 2022-09-19 op #include <netinet/in.h>
22 a80e4b65 2022-09-19 op #include <arpa/inet.h>
24 a80e4b65 2022-09-19 op #include <event.h>
25 a80e4b65 2022-09-19 op #include <limits.h>
26 a80e4b65 2022-09-19 op #include <stdint.h>
27 abe17781 2022-09-20 op #include <stdio.h>
28 54acddc9 2022-09-19 op #include <string.h>
30 a80e4b65 2022-09-19 op #include "galileo.h"
34 a80e4b65 2022-09-19 op {{ define tp_head(struct template *tp, const char *lang,
35 e3c1cbab 2022-09-20 op const char *title) }}
36 e3c1cbab 2022-09-20 op {! struct client *clt = tp->tp_arg; !}
37 e3c1cbab 2022-09-20 op {! struct proxy_config *pc = clt->clt_pc; !}
38 e3c1cbab 2022-09-20 op {! const char *stylesheet = pc->stylesheet; !}
39 e3c1cbab 2022-09-20 op {! const char *path = clt->clt_path_info; !}
40 a80e4b65 2022-09-19 op <!doctype html>
41 a80e4b65 2022-09-19 op <html{{ if *lang != '\0' }}lang="{{ lang }}"{{ end }}>
43 a80e4b65 2022-09-19 op <meta name="viewport" content="initial-scale=1" />
45 5188543c 2022-09-23 op {{ if *stylesheet == '\0' }}
46 5188543c 2022-09-23 op <link rel="stylesheet" href="{{ prfx|urlescape }}/galileo.css" />
48 a80e4b65 2022-09-19 op <link rel="stylesheet" href="{{ stylesheet|urlescape }}" />
52 e3c1cbab 2022-09-20 op {{ if title }}
55 e3c1cbab 2022-09-20 op gemini://{{ pc->proxy_name }}{{ path }}
62 a80e4b65 2022-09-19 op {{ define tp_foot(struct template *tp) }}
63 a80e4b65 2022-09-19 op {! struct client *clt = tp->tp_arg; !}
64 a80e4b65 2022-09-19 op {! struct proxy_config *pc = clt->clt_pc; !}
65 a80e4b65 2022-09-19 op {! const char *host = pc->proxy_name; !}
66 a80e4b65 2022-09-19 op {! const char *path = clt->clt_path_info; !}
71 a80e4b65 2022-09-19 op <dt>Original URL:</dt>
73 a80e4b65 2022-09-19 op <a href="gemini://{{ host | urlescape }}{{ path | urlescape }}">
74 a80e4b65 2022-09-19 op gemini://{{ host }}{{ path }}
83 a80e4b65 2022-09-19 op {{ define tp_figure(struct template *tp, const char *url,
84 a80e4b65 2022-09-19 op const char *label) }}
86 54acddc9 2022-09-19 op struct client *clt = tp->tp_arg;
87 54acddc9 2022-09-19 op const char *path = "";
88 54acddc9 2022-09-19 op int relativify;
90 54acddc9 2022-09-19 op relativify = *url == '/' || strstr(url, "//") == NULL;
91 54acddc9 2022-09-19 op if (relativify) {
92 54acddc9 2022-09-19 op path = clt->clt_script_name;
93 54acddc9 2022-09-19 op url++; /* skip leading / */
97 54acddc9 2022-09-19 op <a href="{{ path | urlescape }}{{ url | urlescape }}">
98 07922252 2022-09-19 op <img src="{{ path | urlescape }}{{ url | urlescape }}" />
102 a80e4b65 2022-09-19 op </figcaption>
106 abe17781 2022-09-20 op {{ define tp_error(struct template *tp, int code, const char *reason) }}
108 abe17781 2022-09-20 op char scode[32];
111 abe17781 2022-09-20 op r = snprintf(scode, sizeof(code), "%d", code);
112 abe17781 2022-09-20 op if (r < 0 || (size_t)r >= sizeof(code))
116 e3c1cbab 2022-09-20 op {{ render tp_head(tp, "en", "Proxy error") }}
118 e3c1cbab 2022-09-20 op <h1>Proxy error</h1>
119 abe17781 2022-09-20 op {{ if code != -1 }}
120 abe17781 2022-09-20 op <p>Request failed with code: <code>{{ scode }}</code>.</p>
121 abe17781 2022-09-20 op <p>The server says: {{ reason }}.</p>
123 abe17781 2022-09-20 op <p>Unable to serve the page due to: {{ reason }}.</p>
126 e3c1cbab 2022-09-20 op {{ render tp_foot(tp) }}
129 8857131d 2022-09-20 op {{ define tp_inputpage(struct template *tp, const char *prompt) }}
130 8857131d 2022-09-20 op {{ render tp_head(tp, "en", "input request") }}
131 9c83d68a 2022-09-22 op <p>The server ask for input: <q>{{ prompt }}</q>.</p>
132 8857131d 2022-09-20 op <form method="post" enctype="{{ FORM_URLENCODED }}">
133 9c83d68a 2022-09-22 op <label for="reply">{{ "response " }}</label>
134 8857131d 2022-09-20 op <input type="text" value="" id="reply" name="q" />
136 9c83d68a 2022-09-22 op <button type="submit">Submit!</button>
138 8857131d 2022-09-20 op {{ render tp_foot(tp) }}