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