test_static.py (1247:9bb7f9cfe39c) test_static.py (1368:b08ca65c6cda)
1import os
2import socket
3import unittest
4from unit.applications.proto import TestApplicationProto
5
6
7class TestStatic(TestApplicationProto):
8 prerequisites = {}
9
10 def setUp(self):
11 super().setUp()
12
13 os.makedirs(self.testdir + '/assets/dir')
14 with open(self.testdir + '/assets/index.html', 'w') as index, \
15 open(self.testdir + '/assets/README', 'w') as readme, \
16 open(self.testdir + '/assets/log.log', 'w') as log, \
17 open(self.testdir + '/assets/dir/file', 'w') as file:
18 index.write('0123456789')
19 readme.write('readme')
20 log.write('[debug]')
21 file.write('blah')
22
23 self._load_conf(
24 {
25 "listeners": {"*:7080": {"pass": "routes"}},
26 "routes": [{"action": {"share": self.testdir + "/assets"}}],
27 "settings": {
28 "http": {
29 "static": {
30 "mime_types": {"text/plain": [".log", "README"]}
31 }
32 }
33 },
34 }
35 )
36
37 def test_static_index(self):
38 self.assertEqual(
39 self.get(url='/index.html')['body'], '0123456789', 'index'
40 )
41 self.assertEqual(self.get(url='/')['body'], '0123456789', 'index 2')
1import os
2import socket
3import unittest
4from unit.applications.proto import TestApplicationProto
5
6
7class TestStatic(TestApplicationProto):
8 prerequisites = {}
9
10 def setUp(self):
11 super().setUp()
12
13 os.makedirs(self.testdir + '/assets/dir')
14 with open(self.testdir + '/assets/index.html', 'w') as index, \
15 open(self.testdir + '/assets/README', 'w') as readme, \
16 open(self.testdir + '/assets/log.log', 'w') as log, \
17 open(self.testdir + '/assets/dir/file', 'w') as file:
18 index.write('0123456789')
19 readme.write('readme')
20 log.write('[debug]')
21 file.write('blah')
22
23 self._load_conf(
24 {
25 "listeners": {"*:7080": {"pass": "routes"}},
26 "routes": [{"action": {"share": self.testdir + "/assets"}}],
27 "settings": {
28 "http": {
29 "static": {
30 "mime_types": {"text/plain": [".log", "README"]}
31 }
32 }
33 },
34 }
35 )
36
37 def test_static_index(self):
38 self.assertEqual(
39 self.get(url='/index.html')['body'], '0123456789', 'index'
40 )
41 self.assertEqual(self.get(url='/')['body'], '0123456789', 'index 2')
42 self.assertEqual(self.get(url='//')['body'], '0123456789', 'index 3')
43 self.assertEqual(self.get(url='/.')['body'], '0123456789', 'index 4')
44 self.assertEqual(self.get(url='/./')['body'], '0123456789', 'index 5')
42 self.assertEqual(
43 self.get(url='/?blah')['body'], '0123456789', 'index vars'
44 )
45 self.assertEqual(
46 self.get(url='/#blah')['body'], '0123456789', 'index anchor'
47 )
48 self.assertEqual(
49 self.get(url='/dir/')['status'], 404, 'index not found'
50 )
51
52 resp = self.get(url='/index.html/')
53 self.assertEqual(resp['status'], 404, 'index not found 2 status')
54 self.assertEqual(
55 resp['headers']['Content-Type'],
56 'text/html',
57 'index not found 2 Content-Type',
58 )
59
60 def test_static_large_file(self):
61 file_size = 32 * 1024 * 1024
62 with open(self.testdir + '/assets/large', 'wb') as f:
63 f.seek(file_size - 1)
64 f.write(b'\0')
65
66 self.assertEqual(
67 len(
68 self.get(url='/large', read_buffer_size=1024 * 1024)['body']
69 ),
70 file_size,
71 'large file',
72 )
73
74 def test_static_etag(self):
75 etag = self.get(url='/')['headers']['ETag']
76 etag_2 = self.get(url='/README')['headers']['ETag']
77
78 self.assertNotEqual(etag, etag_2, 'different ETag')
79 self.assertEqual(
80 etag, self.get(url='/')['headers']['ETag'], 'same ETag'
81 )
82
83 with open(self.testdir + '/assets/index.html', 'w') as f:
84 f.write('blah')
85
86 self.assertNotEqual(
87 etag, self.get(url='/')['headers']['ETag'], 'new ETag'
88 )
89
90 def test_static_redirect(self):
91 resp = self.get(url='/dir')
92 self.assertEqual(resp['status'], 301, 'redirect status')
93 self.assertEqual(
94 resp['headers']['Location'], '/dir/', 'redirect Location'
95 )
96 self.assertNotIn(
97 'Content-Type', resp['headers'], 'redirect Content-Type'
98 )
99
100 def test_static_space_in_name(self):
101 os.rename(
102 self.testdir + '/assets/dir/file',
103 self.testdir + '/assets/dir/fi le',
104 )
105 self.waitforfiles(self.testdir + '/assets/dir/fi le')
106 self.assertEqual(
107 self.get(url='/dir/fi le')['body'], 'blah', 'file name'
108 )
109
110 os.rename(self.testdir + '/assets/dir', self.testdir + '/assets/di r')
111 self.waitforfiles(self.testdir + '/assets/di r/fi le')
112 self.assertEqual(
113 self.get(url='/di r/fi le')['body'], 'blah', 'dir name'
114 )
115
116 os.rename(
117 self.testdir + '/assets/di r', self.testdir + '/assets/ di r '
118 )
119 self.waitforfiles(self.testdir + '/assets/ di r /fi le')
120 self.assertEqual(
121 self.get(url='/ di r /fi le')['body'], 'blah', 'dir name enclosing'
122 )
123
124 self.assertEqual(
125 self.get(url='/%20di%20r%20/fi le')['body'], 'blah', 'dir encoded'
126 )
127 self.assertEqual(
128 self.get(url='/ di r %2Ffi le')['body'], 'blah', 'slash encoded'
129 )
130 self.assertEqual(
131 self.get(url='/ di r /fi%20le')['body'], 'blah', 'file encoded'
132 )
133 self.assertEqual(
134 self.get(url='/%20di%20r%20%2Ffi%20le')['body'], 'blah', 'encoded'
135 )
136 self.assertEqual(
137 self.get(url='/%20%64%69%20%72%20%2F%66%69%20%6C%65')['body'],
138 'blah',
139 'encoded 2',
140 )
141
142 os.rename(
143 self.testdir + '/assets/ di r /fi le',
144 self.testdir + '/assets/ di r / fi le ',
145 )
146 self.waitforfiles(self.testdir + '/assets/ di r / fi le ')
147 self.assertEqual(
148 self.get(url='/%20di%20r%20/%20fi%20le%20')['body'],
149 'blah',
150 'file name enclosing',
151 )
152
153 try:
154 print('файл')
155 utf8 = True
156
157 except:
158 utf8 = False
159
160 if utf8:
161 os.rename(
162 self.testdir + '/assets/ di r / fi le ',
163 self.testdir + '/assets/ di r /фа йл',
164 )
165 self.waitforfiles(self.testdir + '/assets/ di r /фа йл')
166 self.assertEqual(
167 self.get(url='/ di r /фа йл')['body'], 'blah', 'file name 2'
168 )
169
170 os.rename(
171 self.testdir + '/assets/ di r ',
172 self.testdir + '/assets/ди ректория',
173 )
174 self.waitforfiles(self.testdir + '/assets/ди ректория/фа йл')
175 self.assertEqual(
176 self.get(url='/ди ректория/фа йл')['body'], 'blah', 'dir name 2'
177 )
178
179 def test_static_unix_socket(self):
180 sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
181 sock.bind(self.testdir + '/assets/unix_socket')
182
183 self.assertEqual(self.get(url='/unix_socket')['status'], 404, 'socket')
184
185 sock.close()
186
187 def test_static_unix_fifo(self):
188 os.mkfifo(self.testdir + '/assets/fifo')
189
190 self.assertEqual(self.get(url='/fifo')['status'], 404, 'fifo')
191
192 def test_static_symlink(self):
193 os.symlink(self.testdir + '/assets/dir', self.testdir + '/assets/link')
194
195 self.assertEqual(self.get(url='/dir')['status'], 301, 'dir')
196 self.assertEqual(self.get(url='/dir/file')['status'], 200, 'file')
197 self.assertEqual(self.get(url='/link')['status'], 301, 'symlink dir')
198 self.assertEqual(
199 self.get(url='/link/file')['status'], 200, 'symlink file'
200 )
201
45 self.assertEqual(
46 self.get(url='/?blah')['body'], '0123456789', 'index vars'
47 )
48 self.assertEqual(
49 self.get(url='/#blah')['body'], '0123456789', 'index anchor'
50 )
51 self.assertEqual(
52 self.get(url='/dir/')['status'], 404, 'index not found'
53 )
54
55 resp = self.get(url='/index.html/')
56 self.assertEqual(resp['status'], 404, 'index not found 2 status')
57 self.assertEqual(
58 resp['headers']['Content-Type'],
59 'text/html',
60 'index not found 2 Content-Type',
61 )
62
63 def test_static_large_file(self):
64 file_size = 32 * 1024 * 1024
65 with open(self.testdir + '/assets/large', 'wb') as f:
66 f.seek(file_size - 1)
67 f.write(b'\0')
68
69 self.assertEqual(
70 len(
71 self.get(url='/large', read_buffer_size=1024 * 1024)['body']
72 ),
73 file_size,
74 'large file',
75 )
76
77 def test_static_etag(self):
78 etag = self.get(url='/')['headers']['ETag']
79 etag_2 = self.get(url='/README')['headers']['ETag']
80
81 self.assertNotEqual(etag, etag_2, 'different ETag')
82 self.assertEqual(
83 etag, self.get(url='/')['headers']['ETag'], 'same ETag'
84 )
85
86 with open(self.testdir + '/assets/index.html', 'w') as f:
87 f.write('blah')
88
89 self.assertNotEqual(
90 etag, self.get(url='/')['headers']['ETag'], 'new ETag'
91 )
92
93 def test_static_redirect(self):
94 resp = self.get(url='/dir')
95 self.assertEqual(resp['status'], 301, 'redirect status')
96 self.assertEqual(
97 resp['headers']['Location'], '/dir/', 'redirect Location'
98 )
99 self.assertNotIn(
100 'Content-Type', resp['headers'], 'redirect Content-Type'
101 )
102
103 def test_static_space_in_name(self):
104 os.rename(
105 self.testdir + '/assets/dir/file',
106 self.testdir + '/assets/dir/fi le',
107 )
108 self.waitforfiles(self.testdir + '/assets/dir/fi le')
109 self.assertEqual(
110 self.get(url='/dir/fi le')['body'], 'blah', 'file name'
111 )
112
113 os.rename(self.testdir + '/assets/dir', self.testdir + '/assets/di r')
114 self.waitforfiles(self.testdir + '/assets/di r/fi le')
115 self.assertEqual(
116 self.get(url='/di r/fi le')['body'], 'blah', 'dir name'
117 )
118
119 os.rename(
120 self.testdir + '/assets/di r', self.testdir + '/assets/ di r '
121 )
122 self.waitforfiles(self.testdir + '/assets/ di r /fi le')
123 self.assertEqual(
124 self.get(url='/ di r /fi le')['body'], 'blah', 'dir name enclosing'
125 )
126
127 self.assertEqual(
128 self.get(url='/%20di%20r%20/fi le')['body'], 'blah', 'dir encoded'
129 )
130 self.assertEqual(
131 self.get(url='/ di r %2Ffi le')['body'], 'blah', 'slash encoded'
132 )
133 self.assertEqual(
134 self.get(url='/ di r /fi%20le')['body'], 'blah', 'file encoded'
135 )
136 self.assertEqual(
137 self.get(url='/%20di%20r%20%2Ffi%20le')['body'], 'blah', 'encoded'
138 )
139 self.assertEqual(
140 self.get(url='/%20%64%69%20%72%20%2F%66%69%20%6C%65')['body'],
141 'blah',
142 'encoded 2',
143 )
144
145 os.rename(
146 self.testdir + '/assets/ di r /fi le',
147 self.testdir + '/assets/ di r / fi le ',
148 )
149 self.waitforfiles(self.testdir + '/assets/ di r / fi le ')
150 self.assertEqual(
151 self.get(url='/%20di%20r%20/%20fi%20le%20')['body'],
152 'blah',
153 'file name enclosing',
154 )
155
156 try:
157 print('файл')
158 utf8 = True
159
160 except:
161 utf8 = False
162
163 if utf8:
164 os.rename(
165 self.testdir + '/assets/ di r / fi le ',
166 self.testdir + '/assets/ di r /фа йл',
167 )
168 self.waitforfiles(self.testdir + '/assets/ di r /фа йл')
169 self.assertEqual(
170 self.get(url='/ di r /фа йл')['body'], 'blah', 'file name 2'
171 )
172
173 os.rename(
174 self.testdir + '/assets/ di r ',
175 self.testdir + '/assets/ди ректория',
176 )
177 self.waitforfiles(self.testdir + '/assets/ди ректория/фа йл')
178 self.assertEqual(
179 self.get(url='/ди ректория/фа йл')['body'], 'blah', 'dir name 2'
180 )
181
182 def test_static_unix_socket(self):
183 sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
184 sock.bind(self.testdir + '/assets/unix_socket')
185
186 self.assertEqual(self.get(url='/unix_socket')['status'], 404, 'socket')
187
188 sock.close()
189
190 def test_static_unix_fifo(self):
191 os.mkfifo(self.testdir + '/assets/fifo')
192
193 self.assertEqual(self.get(url='/fifo')['status'], 404, 'fifo')
194
195 def test_static_symlink(self):
196 os.symlink(self.testdir + '/assets/dir', self.testdir + '/assets/link')
197
198 self.assertEqual(self.get(url='/dir')['status'], 301, 'dir')
199 self.assertEqual(self.get(url='/dir/file')['status'], 200, 'file')
200 self.assertEqual(self.get(url='/link')['status'], 301, 'symlink dir')
201 self.assertEqual(
202 self.get(url='/link/file')['status'], 200, 'symlink file'
203 )
204
202 def test_static_head(self):
203 resp = self.head(url='/')
204 self.assertEqual(resp['status'], 200, 'status')
205 self.assertEqual(resp['body'], '', 'empty body')
205 def test_static_method(self):
206 resp = self.head()
207 self.assertEqual(resp['status'], 200, 'HEAD status')
208 self.assertEqual(resp['body'], '', 'HEAD empty body')
206
209
210 self.assertEqual(self.delete()['status'], 405, 'DELETE')
211 self.assertEqual(self.post()['status'], 405, 'POST')
212 self.assertEqual(self.put()['status'], 405, 'PUT')
213
214 def test_static_path(self):
215 self.assertEqual(
216 self.get(url='/dir/../dir/file')['status'], 200, 'relative'
217 )
218
219 self.assertEqual(self.get(url='./')['status'], 400, 'path invalid')
220 self.assertEqual(self.get(url='../')['status'], 400, 'path invalid 2')
221 self.assertEqual(self.get(url='/..')['status'], 400, 'path invalid 3')
222 self.assertEqual(
223 self.get(url='../assets/')['status'], 400, 'path invalid 4'
224 )
225 self.assertEqual(
226 self.get(url='/../assets/')['status'], 400, 'path invalid 5'
227 )
228
207 def test_static_two_clients(self):
208 _, sock = self.get(url='/', start=True, no_recv=True)
209 _, sock2 = self.get(url='/', start=True, no_recv=True)
210
211 self.assertEqual(sock.recv(1), b'H', 'client 1')
212 self.assertEqual(sock2.recv(1), b'H', 'client 2')
213 self.assertEqual(sock.recv(1), b'T', 'client 1 again')
214 self.assertEqual(sock2.recv(1), b'T', 'client 2 again')
215
216 sock.close()
217 sock2.close()
218
219 def test_static_mime_types(self):
220 self.assertIn(
221 'success',
222 self.conf(
223 {
224 "text/x-code/x-blah/x-blah": "readme",
225 "text/plain": [".html", ".log", "file"],
226 },
227 'settings/http/static/mime_types',
228 ),
229 'configure mime_types',
230 )
231
232 self.assertEqual(
233 self.get(url='/README')['headers']['Content-Type'],
234 'text/x-code/x-blah/x-blah',
235 'mime_types string case insensitive',
236 )
237 self.assertEqual(
238 self.get(url='/index.html')['headers']['Content-Type'],
239 'text/plain',
240 'mime_types html',
241 )
242 self.assertEqual(
243 self.get(url='/')['headers']['Content-Type'],
244 'text/plain',
245 'mime_types index default',
246 )
247 self.assertEqual(
248 self.get(url='/dir/file')['headers']['Content-Type'],
249 'text/plain',
250 'mime_types file in dir',
251 )
252
253 def test_static_mime_types_partial_match(self):
254 self.assertIn(
255 'success',
256 self.conf(
257 {
258 "text/x-blah": ["ile", "fil", "f", "e", ".file"],
259 },
260 'settings/http/static/mime_types',
261 ),
262 'configure mime_types',
263 )
264 self.assertNotIn(
265 'Content-Type', self.get(url='/dir/file'), 'partial match'
266 )
267
268 def test_static_mime_types_reconfigure(self):
269 self.assertIn(
270 'success',
271 self.conf(
272 {
273 "text/x-code": "readme",
274 "text/plain": [".html", ".log", "file"],
275 },
276 'settings/http/static/mime_types',
277 ),
278 'configure mime_types',
279 )
280
281 self.assertEqual(
282 self.conf_get('settings/http/static/mime_types'),
283 {'text/x-code': 'readme', 'text/plain': ['.html', '.log', 'file']},
284 'mime_types get',
285 )
286 self.assertEqual(
287 self.conf_get('settings/http/static/mime_types/text%2Fx-code'),
288 'readme',
289 'mime_types get string',
290 )
291 self.assertEqual(
292 self.conf_get('settings/http/static/mime_types/text%2Fplain'),
293 ['.html', '.log', 'file'],
294 'mime_types get array',
295 )
296 self.assertEqual(
297 self.conf_get('settings/http/static/mime_types/text%2Fplain/1'),
298 '.log',
299 'mime_types get array element',
300 )
301
302 self.assertIn(
303 'success',
304 self.conf_delete('settings/http/static/mime_types/text%2Fplain/2'),
305 'mime_types remove array element',
306 )
307 self.assertNotIn(
308 'Content-Type',
309 self.get(url='/dir/file')['headers'],
310 'mime_types removed',
311 )
312
313 self.assertIn(
314 'success',
315 self.conf_post(
316 '"file"', 'settings/http/static/mime_types/text%2Fplain'
317 ),
318 'mime_types add array element',
319 )
320 self.assertEqual(
321 self.get(url='/dir/file')['headers']['Content-Type'],
322 'text/plain',
323 'mime_types reverted',
324 )
325
326 self.assertIn(
327 'success',
328 self.conf(
329 '"file"', 'settings/http/static/mime_types/text%2Fplain'
330 ),
331 'configure mime_types update',
332 )
333 self.assertEqual(
334 self.get(url='/dir/file')['headers']['Content-Type'],
335 'text/plain',
336 'mime_types updated',
337 )
338 self.assertNotIn(
339 'Content-Type',
340 self.get(url='/log.log')['headers'],
341 'mime_types updated 2',
342 )
343
344 self.assertIn(
345 'success',
346 self.conf(
347 '".log"', 'settings/http/static/mime_types/text%2Fblahblahblah'
348 ),
349 'configure mime_types create',
350 )
351 self.assertEqual(
352 self.get(url='/log.log')['headers']['Content-Type'],
353 'text/blahblahblah',
354 'mime_types create',
355 )
356
357 def test_static_mime_types_correct(self):
358 self.assertIn(
359 'error',
360 self.conf(
361 {"text/x-code": "readme", "text/plain": "readme"},
362 'settings/http/static/mime_types',
363 ),
364 'mime_types same extensions',
365 )
366 self.assertIn(
367 'error',
368 self.conf(
369 {"text/x-code": [".h", ".c"], "text/plain": ".c"},
370 'settings/http/static/mime_types',
371 ),
372 'mime_types same extensions array',
373 )
374 self.assertIn(
375 'error',
376 self.conf(
377 {
378 "text/x-code": [".h", ".c", "readme"],
379 "text/plain": "README",
380 },
381 'settings/http/static/mime_types',
382 ),
383 'mime_types same extensions case insensitive',
384 )
385
386 @unittest.skip('not yet')
387 def test_static_mime_types_invalid(self):
388 self.assertIn(
389 'error',
390 self.http(
391 b"""PUT /config/settings/http/static/mime_types/%0%00% HTTP/1.1\r
392Host: localhost\r
393Connection: close\r
394Content-Length: 6\r
395\r
396\"blah\"""",
397 raw_resp=True,
398 raw=True,
399 sock_type='unix',
400 addr=self.testdir + '/control.unit.sock',
401 ),
402 'mime_types invalid',
403 )
404
405if __name__ == '__main__':
406 TestStatic.main()
229 def test_static_two_clients(self):
230 _, sock = self.get(url='/', start=True, no_recv=True)
231 _, sock2 = self.get(url='/', start=True, no_recv=True)
232
233 self.assertEqual(sock.recv(1), b'H', 'client 1')
234 self.assertEqual(sock2.recv(1), b'H', 'client 2')
235 self.assertEqual(sock.recv(1), b'T', 'client 1 again')
236 self.assertEqual(sock2.recv(1), b'T', 'client 2 again')
237
238 sock.close()
239 sock2.close()
240
241 def test_static_mime_types(self):
242 self.assertIn(
243 'success',
244 self.conf(
245 {
246 "text/x-code/x-blah/x-blah": "readme",
247 "text/plain": [".html", ".log", "file"],
248 },
249 'settings/http/static/mime_types',
250 ),
251 'configure mime_types',
252 )
253
254 self.assertEqual(
255 self.get(url='/README')['headers']['Content-Type'],
256 'text/x-code/x-blah/x-blah',
257 'mime_types string case insensitive',
258 )
259 self.assertEqual(
260 self.get(url='/index.html')['headers']['Content-Type'],
261 'text/plain',
262 'mime_types html',
263 )
264 self.assertEqual(
265 self.get(url='/')['headers']['Content-Type'],
266 'text/plain',
267 'mime_types index default',
268 )
269 self.assertEqual(
270 self.get(url='/dir/file')['headers']['Content-Type'],
271 'text/plain',
272 'mime_types file in dir',
273 )
274
275 def test_static_mime_types_partial_match(self):
276 self.assertIn(
277 'success',
278 self.conf(
279 {
280 "text/x-blah": ["ile", "fil", "f", "e", ".file"],
281 },
282 'settings/http/static/mime_types',
283 ),
284 'configure mime_types',
285 )
286 self.assertNotIn(
287 'Content-Type', self.get(url='/dir/file'), 'partial match'
288 )
289
290 def test_static_mime_types_reconfigure(self):
291 self.assertIn(
292 'success',
293 self.conf(
294 {
295 "text/x-code": "readme",
296 "text/plain": [".html", ".log", "file"],
297 },
298 'settings/http/static/mime_types',
299 ),
300 'configure mime_types',
301 )
302
303 self.assertEqual(
304 self.conf_get('settings/http/static/mime_types'),
305 {'text/x-code': 'readme', 'text/plain': ['.html', '.log', 'file']},
306 'mime_types get',
307 )
308 self.assertEqual(
309 self.conf_get('settings/http/static/mime_types/text%2Fx-code'),
310 'readme',
311 'mime_types get string',
312 )
313 self.assertEqual(
314 self.conf_get('settings/http/static/mime_types/text%2Fplain'),
315 ['.html', '.log', 'file'],
316 'mime_types get array',
317 )
318 self.assertEqual(
319 self.conf_get('settings/http/static/mime_types/text%2Fplain/1'),
320 '.log',
321 'mime_types get array element',
322 )
323
324 self.assertIn(
325 'success',
326 self.conf_delete('settings/http/static/mime_types/text%2Fplain/2'),
327 'mime_types remove array element',
328 )
329 self.assertNotIn(
330 'Content-Type',
331 self.get(url='/dir/file')['headers'],
332 'mime_types removed',
333 )
334
335 self.assertIn(
336 'success',
337 self.conf_post(
338 '"file"', 'settings/http/static/mime_types/text%2Fplain'
339 ),
340 'mime_types add array element',
341 )
342 self.assertEqual(
343 self.get(url='/dir/file')['headers']['Content-Type'],
344 'text/plain',
345 'mime_types reverted',
346 )
347
348 self.assertIn(
349 'success',
350 self.conf(
351 '"file"', 'settings/http/static/mime_types/text%2Fplain'
352 ),
353 'configure mime_types update',
354 )
355 self.assertEqual(
356 self.get(url='/dir/file')['headers']['Content-Type'],
357 'text/plain',
358 'mime_types updated',
359 )
360 self.assertNotIn(
361 'Content-Type',
362 self.get(url='/log.log')['headers'],
363 'mime_types updated 2',
364 )
365
366 self.assertIn(
367 'success',
368 self.conf(
369 '".log"', 'settings/http/static/mime_types/text%2Fblahblahblah'
370 ),
371 'configure mime_types create',
372 )
373 self.assertEqual(
374 self.get(url='/log.log')['headers']['Content-Type'],
375 'text/blahblahblah',
376 'mime_types create',
377 )
378
379 def test_static_mime_types_correct(self):
380 self.assertIn(
381 'error',
382 self.conf(
383 {"text/x-code": "readme", "text/plain": "readme"},
384 'settings/http/static/mime_types',
385 ),
386 'mime_types same extensions',
387 )
388 self.assertIn(
389 'error',
390 self.conf(
391 {"text/x-code": [".h", ".c"], "text/plain": ".c"},
392 'settings/http/static/mime_types',
393 ),
394 'mime_types same extensions array',
395 )
396 self.assertIn(
397 'error',
398 self.conf(
399 {
400 "text/x-code": [".h", ".c", "readme"],
401 "text/plain": "README",
402 },
403 'settings/http/static/mime_types',
404 ),
405 'mime_types same extensions case insensitive',
406 )
407
408 @unittest.skip('not yet')
409 def test_static_mime_types_invalid(self):
410 self.assertIn(
411 'error',
412 self.http(
413 b"""PUT /config/settings/http/static/mime_types/%0%00% HTTP/1.1\r
414Host: localhost\r
415Connection: close\r
416Content-Length: 6\r
417\r
418\"blah\"""",
419 raw_resp=True,
420 raw=True,
421 sock_type='unix',
422 addr=self.testdir + '/control.unit.sock',
423 ),
424 'mime_types invalid',
425 )
426
427if __name__ == '__main__':
428 TestStatic.main()