Blame


1 5c2e310e 2021-01-22 op #!/bin/sh
2 5c2e310e 2021-01-22 op
3 5c2e310e 2021-01-22 op set -e
4 5c2e310e 2021-01-22 op
5 5c2e310e 2021-01-22 op # usage: config <global config> <stuff for localhost>
6 5c2e310e 2021-01-22 op # generates a configuration file reg.conf
7 5c2e310e 2021-01-22 op config() {
8 5c2e310e 2021-01-22 op cat <<EOF > reg.conf
9 5c2e310e 2021-01-22 op ipv6 off
10 5c2e310e 2021-01-22 op port 10965
11 5c2e310e 2021-01-22 op $1
12 5c2e310e 2021-01-22 op server "localhost" {
13 6ff23c67 2021-02-01 op cert "$PWD/cert.pem"
14 6ff23c67 2021-02-01 op key "$PWD/key.pem"
15 6ff23c67 2021-02-01 op root "$PWD/testdata"
16 5c2e310e 2021-01-22 op $2
17 5c2e310e 2021-01-22 op }
18 5c2e310e 2021-01-22 op EOF
19 5c2e310e 2021-01-22 op }
20 5c2e310e 2021-01-22 op
21 5c2e310e 2021-01-22 op checkconf() {
22 5c2e310e 2021-01-22 op ./../gmid -n -c reg.conf
23 5c2e310e 2021-01-22 op }
24 5c2e310e 2021-01-22 op
25 5c2e310e 2021-01-22 op # usage: get <path>
26 5c2e310e 2021-01-22 op # return the body of the request on stdout
27 5c2e310e 2021-01-22 op get() {
28 31a4993a 2021-01-23 op ./../gg -b "gemini://localhost:10965/$1"
29 5c2e310e 2021-01-22 op }
30 5c2e310e 2021-01-22 op
31 5c2e310e 2021-01-22 op # usage: head <path>
32 5c2e310e 2021-01-22 op # return the meta response line on stdout
33 5c2e310e 2021-01-22 op head() {
34 31a4993a 2021-01-23 op ./../gg -h "gemini://localhost:10965/$1"
35 5c2e310e 2021-01-22 op }
36 5c2e310e 2021-01-22 op
37 31a4993a 2021-01-23 op # usage: raw <path>
38 31a4993a 2021-01-23 op # return both header and body
39 31a4993a 2021-01-23 op raw() {
40 31a4993a 2021-01-23 op ./../gg "gemini://localhost:10965/$1"
41 31a4993a 2021-01-23 op }
42 31a4993a 2021-01-23 op
43 5c2e310e 2021-01-22 op run() {
44 5c2e310e 2021-01-22 op # filter out logs for GET requests
45 46af8c6c 2021-01-27 op (./../gmid -f -c reg.conf 2>&1 | grep -v GET) >&2 &
46 5c2e310e 2021-01-22 op pid=$!
47 31a4993a 2021-01-23 op # give gmid time to bind the port, otherwise we end up
48 31a4993a 2021-01-23 op # executing gg when gmid isn't ready yet.
49 31a4993a 2021-01-23 op sleep 1
50 5c2e310e 2021-01-22 op }
51 5c2e310e 2021-01-22 op
52 5c2e310e 2021-01-22 op # usage: check [exit-message]
53 5c2e310e 2021-01-22 op # check if gmid is still running
54 5c2e310e 2021-01-22 op check() {
55 5c2e310e 2021-01-22 op if ! ps $pid >/dev/null; then
56 5c2e310e 2021-01-22 op echo ${1:-"gmid crashed?"}
57 5c2e310e 2021-01-22 op exit 1
58 5c2e310e 2021-01-22 op fi
59 5c2e310e 2021-01-22 op }
60 5c2e310e 2021-01-22 op
61 afc025ff 2021-02-06 op restart() {
62 afc025ff 2021-02-06 op pkill -SIGHUP gmid
63 afc025ff 2021-02-06 op sleep 1
64 afc025ff 2021-02-06 op }
65 afc025ff 2021-02-06 op
66 5c2e310e 2021-01-22 op # quit gmid
67 5c2e310e 2021-01-22 op quit() {
68 5c2e310e 2021-01-22 op pkill gmid || true
69 5c2e310e 2021-01-22 op wait || true
70 5c2e310e 2021-01-22 op }
71 5c2e310e 2021-01-22 op
72 5c2e310e 2021-01-22 op # usage: eq a b errmsg
73 5c2e310e 2021-01-22 op # if a and b aren't equal strings, exit with errmsg
74 5c2e310e 2021-01-22 op eq() {
75 5c2e310e 2021-01-22 op if ! [ "$1" = "$2" ]; then
76 5c2e310e 2021-01-22 op echo "$3: \"$1\" not equal \"$2\""
77 5c2e310e 2021-01-22 op exit 1
78 5c2e310e 2021-01-22 op fi
79 5c2e310e 2021-01-22 op }
80 5c2e310e 2021-01-22 op
81 5c2e310e 2021-01-22 op onexit() {
82 5c2e310e 2021-01-22 op rm -f bigfile bigfile.sha
83 5c2e310e 2021-01-22 op quit
84 5c2e310e 2021-01-22 op }
85 5c2e310e 2021-01-22 op
86 5c2e310e 2021-01-22 op # tests
87 5c2e310e 2021-01-22 op
88 5c2e310e 2021-01-22 op trap 'onexit' INT TERM EXIT
89 5c2e310e 2021-01-22 op
90 5c2e310e 2021-01-22 op endl=`printf "\r\n"`
91 5c2e310e 2021-01-22 op lf=`echo`
92 5c2e310e 2021-01-22 op
93 5c2e310e 2021-01-22 op config "" ""
94 5c2e310e 2021-01-22 op checkconf
95 5c2e310e 2021-01-22 op run
96 5c2e310e 2021-01-22 op
97 5c2e310e 2021-01-22 op eq "$(head /)" "20 text/gemini" "Unexpected head for /"
98 5c2e310e 2021-01-22 op eq "$(get /)" "# hello world$ln" "Unexpected body for /"
99 5c2e310e 2021-01-22 op echo OK GET /
100 5c2e310e 2021-01-22 op
101 5c2e310e 2021-01-22 op eq "$(head /foo)" "51 not found" "Unexpected head /foo"
102 5c2e310e 2021-01-22 op eq "$(get /foo)" "" "Unexpected body /foo"
103 5c2e310e 2021-01-22 op echo OK GET /foo
104 5c2e310e 2021-01-22 op
105 5c2e310e 2021-01-22 op # should redirect if asked for a directory but without the trailing /
106 5c2e310e 2021-01-22 op eq "$(head /dir)" "30 /dir/" "Unexpected redirect for /dir"
107 5c2e310e 2021-01-22 op eq "$(get /dir)" "" "Unexpected body for redirect"
108 5c2e310e 2021-01-22 op echo OK GET /dir
109 5c2e310e 2021-01-22 op
110 5c2e310e 2021-01-22 op # 51 for a directory without index.gmi
111 5c2e310e 2021-01-22 op eq "$(head /dir/)" "51 not found" "Unexpected head for /"
112 5c2e310e 2021-01-22 op eq "$(get /dir/)" "" "Unexpected body for error"
113 5c2e310e 2021-01-22 op echo OK GET /dir/
114 5c2e310e 2021-01-22 op
115 5c2e310e 2021-01-22 op eq "$(head /dir/foo.gmi)" "20 text/gemini" "Unexpected head for /dir/foo.gmi"
116 5c2e310e 2021-01-22 op eq "$(get /dir/foo.gmi)" "# hello world$ln" "Unexpected body for /dir/foo.gmi"
117 5c2e310e 2021-01-22 op echo OK GET /dir/foo.gmi
118 5c2e310e 2021-01-22 op
119 5c2e310e 2021-01-22 op # try a big file
120 5c2e310e 2021-01-22 op eq "$(head /bigfile)" "20 application/octet-stream" "Unexpected head for /bigfile"
121 5c2e310e 2021-01-22 op get /bigfile > bigfile
122 5c2e310e 2021-01-22 op ./sha bigfile bigfile.sha
123 5c2e310e 2021-01-22 op eq "$(cat bigfile.sha)" "$(cat testdata/bigfile.sha)" "Unexpected sha for /bigfile"
124 5c2e310e 2021-01-22 op echo OK GET /bigfile
125 5c2e310e 2021-01-22 op
126 5c2e310e 2021-01-22 op # shouldn't be executing cgi scripts
127 5c2e310e 2021-01-22 op eq "$(head /hello)" "20 application/octet-stream" "Unexpected head for /hello"
128 5c2e310e 2021-01-22 op echo OK GET /hello
129 5c2e310e 2021-01-22 op
130 5c2e310e 2021-01-22 op check "should be running"
131 5c2e310e 2021-01-22 op
132 5c2e310e 2021-01-22 op # try with custom mime
133 5c2e310e 2021-01-22 op config 'mime "text/x-funny-text" "gmi"' 'default type "application/x-trash"'
134 5c2e310e 2021-01-22 op checkconf
135 afc025ff 2021-02-06 op restart
136 5c2e310e 2021-01-22 op
137 5c2e310e 2021-01-22 op eq "$(head /)" "20 text/x-funny-text" "Unexpected head for /"
138 5c2e310e 2021-01-22 op echo OK GET / with custom mime
139 5c2e310e 2021-01-22 op
140 5c2e310e 2021-01-22 op eq "$(head /hello)" "20 application/x-trash" "Unexpected head for /hello"
141 5c2e310e 2021-01-22 op echo OK GET /hello with custom mime
142 5c2e310e 2021-01-22 op
143 5c2e310e 2021-01-22 op check "should be running"
144 5c2e310e 2021-01-22 op
145 5c2e310e 2021-01-22 op # try with custom lang
146 5c2e310e 2021-01-22 op config '' 'lang "it"'
147 5c2e310e 2021-01-22 op checkconf
148 afc025ff 2021-02-06 op restart
149 5c2e310e 2021-01-22 op
150 5c2e310e 2021-01-22 op eq "$(head /)" "20 text/gemini; lang=it" "Unexpected head for /"
151 5c2e310e 2021-01-22 op echo OK GET / with custom lang
152 5c2e310e 2021-01-22 op
153 5c2e310e 2021-01-22 op check "should be running"
154 5c2e310e 2021-01-22 op
155 5c2e310e 2021-01-22 op # finally try with CGI scripts
156 87f2b68b 2021-02-02 op config '' 'cgi "*"'
157 5c2e310e 2021-01-22 op checkconf
158 afc025ff 2021-02-06 op restart
159 5c2e310e 2021-01-22 op
160 5c2e310e 2021-01-22 op eq "$(head /hello)" "20 text/gemini" "Unexpected head for /hello"
161 5c2e310e 2021-01-22 op eq "$(get /hello)" "# hello world$ln" "Unexpected body for /hello"
162 5c2e310e 2021-01-22 op echo OK GET /hello with cgi
163 5c2e310e 2021-01-22 op
164 5c2e310e 2021-01-22 op eq "$(head /slow)" "20 text/gemini" "Unexpected head for /slow"
165 5c2e310e 2021-01-22 op eq "$(get /slow)" "# hello world$ln" "Unexpected body for /slow"
166 5c2e310e 2021-01-22 op echo OK GET /slow with cgi
167 5c2e310e 2021-01-22 op
168 35744950 2021-02-01 op eq "$(head /err)" "42 CGI error" "Unexpected head for /err"
169 5c2e310e 2021-01-22 op eq "$(get /err)" "" "Unexpected body for /err"
170 5c2e310e 2021-01-22 op echo OK GET /err with cgi
171 5c2e310e 2021-01-22 op
172 6cdecad8 2021-01-23 op eq "$(raw /invalid | wc -c | xargs)" 2048 "Unexpected body for /invalid"
173 3309ef97 2021-01-23 op echo OK GET /invalid with cgi
174 3309ef97 2021-01-23 op
175 7b31a638 2021-01-24 op # try a big file
176 7b31a638 2021-01-24 op eq "$(head /serve-bigfile)" "20 application/octet-stream" "Unexpected head for /serve-bigfile"
177 7b31a638 2021-01-24 op get /bigfile > bigfile
178 7b31a638 2021-01-24 op ./sha bigfile bigfile.sha
179 7b31a638 2021-01-24 op eq "$(cat bigfile.sha)" "$(cat testdata/bigfile.sha)" "Unexpected sha for /serve-bigfile"
180 7b31a638 2021-01-24 op echo OK GET /serve-bigfile with cgi
181 7b31a638 2021-01-24 op
182 5c2e310e 2021-01-22 op check "should be running"
183 e7a2a99b 2021-01-24 op
184 e7a2a99b 2021-01-24 op config '' 'index "foo.gmi"'
185 e7a2a99b 2021-01-24 op checkconf
186 afc025ff 2021-02-06 op restart
187 e7a2a99b 2021-01-24 op
188 e7a2a99b 2021-01-24 op eq "$(head /dir/)" "20 text/gemini" "Unexpected head for /"
189 e7a2a99b 2021-01-24 op eq "$(get /dir/)" "# hello world$ln" "Unexpected body for error"
190 e7a2a99b 2021-01-24 op echo OK GET /dir/ with custom index
191 e7a2a99b 2021-01-24 op
192 e7a2a99b 2021-01-24 op check "should be running"
193 c8b74339 2021-01-24 op
194 c8b74339 2021-01-24 op config '' 'location "/dir/" { default type "text/plain" index "hello" }'
195 c8b74339 2021-01-24 op checkconf
196 afc025ff 2021-02-06 op restart
197 c8b74339 2021-01-24 op
198 c8b74339 2021-01-24 op eq "$(head /dir/hello)" "20 text/plain" "Unexpected head for /"
199 c8b74339 2021-01-24 op echo OK GET /dir/hello with location and default type
200 c8b74339 2021-01-24 op
201 252908e6 2021-01-24 op eq "$(head /dir/)" "20 text/plain" "Unexpected head for /dir/"
202 c8b74339 2021-01-24 op eq "$(get /dir/|tail -1)" 'echo "# hello world"' "Unexpected body for /dir/"
203 c8b74339 2021-01-24 op echo OK GET /dir/ with location and custom index
204 c8b74339 2021-01-24 op
205 c8b74339 2021-01-24 op check "should be running"
206 252908e6 2021-01-24 op
207 252908e6 2021-01-24 op config '' 'location "/dir/" { auto index on }'
208 252908e6 2021-01-24 op checkconf
209 afc025ff 2021-02-06 op restart
210 252908e6 2021-01-24 op
211 252908e6 2021-01-24 op eq "$(head /)" "20 text/gemini" "Unexpected head for /"
212 252908e6 2021-01-24 op eq "$(get /)" "# hello world$ln" "Unexpected body for /"
213 252908e6 2021-01-24 op echo OK GET / with auto index
214 252908e6 2021-01-24 op
215 252908e6 2021-01-24 op eq "$(head /dir)" "30 /dir/" "Unexpected head for /dir"
216 252908e6 2021-01-24 op eq "$(head /dir/)" "20 text/gemini" "Unexpected head for /dir/"
217 5f715ce4 2021-02-02 op eq "$(get /dir/|wc -l|xargs)" "5" "Unexpected body for /dir/"
218 252908e6 2021-01-24 op echo OK GET /dir/ with auto index on
219 252908e6 2021-01-24 op
220 252908e6 2021-01-24 op check "should be running"
221 6abda252 2021-02-06 op
222 6abda252 2021-02-06 op # test block return and strip
223 6abda252 2021-02-06 op
224 6abda252 2021-02-06 op config '' 'location "*" { block }'
225 6abda252 2021-02-06 op checkconf
226 afc025ff 2021-02-06 op restart
227 6abda252 2021-02-06 op
228 6abda252 2021-02-06 op eq "$(head /)" "40 temporary failure" "Unexpected head for /"
229 6abda252 2021-02-06 op eq "$(get /)" "" "Unexpected body for /"
230 6abda252 2021-02-06 op echo OK GET / with block
231 6abda252 2021-02-06 op
232 6abda252 2021-02-06 op eq "$(head /nonexists)" "40 temporary failure" "Unexpected head for /nonexists"
233 6abda252 2021-02-06 op eq "$(get /nonexists)" "" "Unexpected body for /nonexists"
234 6abda252 2021-02-06 op echo OK GET /nonexists with block
235 6abda252 2021-02-06 op
236 6abda252 2021-02-06 op check "should be running"
237 6abda252 2021-02-06 op
238 6abda252 2021-02-06 op config '' '
239 6abda252 2021-02-06 op location "/dir" {
240 6abda252 2021-02-06 op strip 1
241 6abda252 2021-02-06 op block return 40 "%% %p %q %P %N test"
242 6abda252 2021-02-06 op }
243 6abda252 2021-02-06 op location "*" {
244 6abda252 2021-02-06 op strip 99
245 6abda252 2021-02-06 op block return 40 "%% %p %q %P %N test"
246 6abda252 2021-02-06 op }'
247 6abda252 2021-02-06 op checkconf
248 afc025ff 2021-02-06 op restart
249 6abda252 2021-02-06 op
250 6abda252 2021-02-06 op eq "$(head /dir/foo.gmi)" "40 % /foo.gmi 10965 localhost test"
251 6abda252 2021-02-06 op echo OK GET /dir/foo.gmi with strip and block
252 6abda252 2021-02-06 op
253 6abda252 2021-02-06 op eq "$(head /bigfile)" "40 % 10965 localhost test"
254 6abda252 2021-02-06 op echo OK GET /bigfile with strip and block
255 6abda252 2021-02-06 op
256 6abda252 2021-02-06 op check "should be running"
257 e3ddf390 2021-02-06 op
258 e3ddf390 2021-02-06 op # test the entrypoint
259 e3ddf390 2021-02-06 op
260 e3ddf390 2021-02-06 op config '' 'entrypoint "/env"'
261 e3ddf390 2021-02-06 op checkconf
262 e3ddf390 2021-02-06 op restart
263 afc025ff 2021-02-06 op
264 e3ddf390 2021-02-06 op eq "$(head /foo/bar)" "20 text/plain; lang=en" "Unknown head for /foo/bar"
265 e3ddf390 2021-02-06 op eq "$(get /foo/bar|grep PATH_INFO)" "PATH_INFO=/foo/bar" "Unexpected PATH_INFO"
266 e3ddf390 2021-02-06 op echo OK GET /foo/bar with entrypoint
267 e3ddf390 2021-02-06 op
268 6abda252 2021-02-06 op quit