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