11596Szelenkov@nginx.comimport pytest 21477Szelenkov@nginx.comimport socket 3730Szelenkov@nginx.comimport time 41477Szelenkov@nginx.com 51019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython 61596Szelenkov@nginx.comimport re 7730Szelenkov@nginx.com 81017Szelenkov@nginx.com 91019Szelenkov@nginx.comclass TestSettings(TestApplicationPython): 101467Szelenkov@nginx.com prerequisites = {'modules': {'python': 'any'}} 11730Szelenkov@nginx.com 12730Szelenkov@nginx.com def test_settings_header_read_timeout(self): 13730Szelenkov@nginx.com self.load('empty') 14730Szelenkov@nginx.com 151017Szelenkov@nginx.com self.conf({'http': {'header_read_timeout': 2}}, 'settings') 16730Szelenkov@nginx.com 171017Szelenkov@nginx.com (resp, sock) = self.http( 181017Szelenkov@nginx.com b"""GET / HTTP/1.1 191017Szelenkov@nginx.com""", 201017Szelenkov@nginx.com start=True, 211017Szelenkov@nginx.com read_timeout=1, 221017Szelenkov@nginx.com raw=True, 231017Szelenkov@nginx.com ) 24730Szelenkov@nginx.com 25730Szelenkov@nginx.com time.sleep(3) 26730Szelenkov@nginx.com 271017Szelenkov@nginx.com resp = self.http( 281017Szelenkov@nginx.com b"""Host: localhost 29730Szelenkov@nginx.comConnection: close 30730Szelenkov@nginx.com 311017Szelenkov@nginx.com""", 321017Szelenkov@nginx.com sock=sock, 331017Szelenkov@nginx.com raw=True, 341017Szelenkov@nginx.com ) 35730Szelenkov@nginx.com 361596Szelenkov@nginx.com assert resp['status'] == 408, 'status header read timeout' 37730Szelenkov@nginx.com 38756Szelenkov@nginx.com def test_settings_header_read_timeout_update(self): 39756Szelenkov@nginx.com self.load('empty') 40756Szelenkov@nginx.com 411017Szelenkov@nginx.com self.conf({'http': {'header_read_timeout': 4}}, 'settings') 42756Szelenkov@nginx.com 431017Szelenkov@nginx.com (resp, sock) = self.http( 441017Szelenkov@nginx.com b"""GET / HTTP/1.1 451017Szelenkov@nginx.com""", 461017Szelenkov@nginx.com start=True, 471017Szelenkov@nginx.com raw=True, 481017Szelenkov@nginx.com no_recv=True, 491017Szelenkov@nginx.com ) 50756Szelenkov@nginx.com 51756Szelenkov@nginx.com time.sleep(2) 52756Szelenkov@nginx.com 531017Szelenkov@nginx.com (resp, sock) = self.http( 541017Szelenkov@nginx.com b"""Host: localhost 551017Szelenkov@nginx.com""", 561017Szelenkov@nginx.com start=True, 571017Szelenkov@nginx.com sock=sock, 581017Szelenkov@nginx.com raw=True, 591017Szelenkov@nginx.com no_recv=True, 601017Szelenkov@nginx.com ) 61759Szelenkov@nginx.com 62759Szelenkov@nginx.com time.sleep(2) 63759Szelenkov@nginx.com 641017Szelenkov@nginx.com (resp, sock) = self.http( 651017Szelenkov@nginx.com b"""X-Blah: blah 661017Szelenkov@nginx.com""", 671017Szelenkov@nginx.com start=True, 681017Szelenkov@nginx.com sock=sock, 691017Szelenkov@nginx.com read_timeout=1, 701017Szelenkov@nginx.com raw=True, 711017Szelenkov@nginx.com ) 72767Szelenkov@nginx.com 73767Szelenkov@nginx.com if len(resp) != 0: 74767Szelenkov@nginx.com sock.close() 75756Szelenkov@nginx.com 76767Szelenkov@nginx.com else: 77767Szelenkov@nginx.com time.sleep(2) 78756Szelenkov@nginx.com 791017Szelenkov@nginx.com resp = self.http( 801017Szelenkov@nginx.com b"""Connection: close 81756Szelenkov@nginx.com 821017Szelenkov@nginx.com""", 831017Szelenkov@nginx.com sock=sock, 841017Szelenkov@nginx.com raw=True, 851017Szelenkov@nginx.com ) 86756Szelenkov@nginx.com 871596Szelenkov@nginx.com assert resp['status'] == 408, 'status header read timeout update' 88756Szelenkov@nginx.com 89730Szelenkov@nginx.com def test_settings_body_read_timeout(self): 90730Szelenkov@nginx.com self.load('empty') 91730Szelenkov@nginx.com 921017Szelenkov@nginx.com self.conf({'http': {'body_read_timeout': 2}}, 'settings') 93730Szelenkov@nginx.com 941017Szelenkov@nginx.com (resp, sock) = self.http( 951017Szelenkov@nginx.com b"""POST / HTTP/1.1 96730Szelenkov@nginx.comHost: localhost 97730Szelenkov@nginx.comContent-Length: 10 98730Szelenkov@nginx.comConnection: close 99730Szelenkov@nginx.com 1001017Szelenkov@nginx.com""", 1011017Szelenkov@nginx.com start=True, 1021017Szelenkov@nginx.com raw_resp=True, 1031017Szelenkov@nginx.com read_timeout=1, 1041017Szelenkov@nginx.com raw=True, 1051017Szelenkov@nginx.com ) 106730Szelenkov@nginx.com 107730Szelenkov@nginx.com time.sleep(3) 108730Szelenkov@nginx.com 109730Szelenkov@nginx.com resp = self.http(b"""0123456789""", sock=sock, raw=True) 110730Szelenkov@nginx.com 1111596Szelenkov@nginx.com assert resp['status'] == 408, 'status body read timeout' 112730Szelenkov@nginx.com 113756Szelenkov@nginx.com def test_settings_body_read_timeout_update(self): 114756Szelenkov@nginx.com self.load('empty') 115756Szelenkov@nginx.com 1161017Szelenkov@nginx.com self.conf({'http': {'body_read_timeout': 4}}, 'settings') 117756Szelenkov@nginx.com 1181017Szelenkov@nginx.com (resp, sock) = self.http( 1191017Szelenkov@nginx.com b"""POST / HTTP/1.1 120756Szelenkov@nginx.comHost: localhost 121756Szelenkov@nginx.comContent-Length: 10 122756Szelenkov@nginx.comConnection: close 123756Szelenkov@nginx.com 1241017Szelenkov@nginx.com""", 1251017Szelenkov@nginx.com start=True, 1261017Szelenkov@nginx.com read_timeout=1, 1271017Szelenkov@nginx.com raw=True, 1281017Szelenkov@nginx.com ) 129756Szelenkov@nginx.com 130756Szelenkov@nginx.com time.sleep(2) 131756Szelenkov@nginx.com 1321017Szelenkov@nginx.com (resp, sock) = self.http( 1331017Szelenkov@nginx.com b"""012""", start=True, sock=sock, read_timeout=1, raw=True 1341017Szelenkov@nginx.com ) 135756Szelenkov@nginx.com 136756Szelenkov@nginx.com time.sleep(2) 137756Szelenkov@nginx.com 1381017Szelenkov@nginx.com (resp, sock) = self.http( 1391017Szelenkov@nginx.com b"""345""", start=True, sock=sock, read_timeout=1, raw=True 1401017Szelenkov@nginx.com ) 141756Szelenkov@nginx.com 142756Szelenkov@nginx.com time.sleep(2) 143756Szelenkov@nginx.com 144756Szelenkov@nginx.com resp = self.http(b"""6789""", sock=sock, raw=True) 145756Szelenkov@nginx.com 1461596Szelenkov@nginx.com assert resp['status'] == 200, 'status body read timeout update' 147756Szelenkov@nginx.com 148730Szelenkov@nginx.com def test_settings_send_timeout(self): 149730Szelenkov@nginx.com self.load('mirror') 150730Szelenkov@nginx.com 151730Szelenkov@nginx.com data_len = 1048576 152730Szelenkov@nginx.com 1531017Szelenkov@nginx.com self.conf({'http': {'send_timeout': 1}}, 'settings') 154730Szelenkov@nginx.com 1551596Szelenkov@nginx.com addr = self.temp_dir + '/sock' 156730Szelenkov@nginx.com 157760Szelenkov@nginx.com self.conf({"unix:" + addr: {'application': 'mirror'}}, 'listeners') 158730Szelenkov@nginx.com 159730Szelenkov@nginx.com sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 160730Szelenkov@nginx.com sock.connect(addr) 161730Szelenkov@nginx.com 162730Szelenkov@nginx.com req = """POST / HTTP/1.1 163730Szelenkov@nginx.comHost: localhost 164730Szelenkov@nginx.comContent-Type: text/html 165730Szelenkov@nginx.comContent-Length: %d 166970Szelenkov@nginx.comConnection: close 167730Szelenkov@nginx.com 1681017Szelenkov@nginx.com""" % data_len + ( 1691017Szelenkov@nginx.com 'X' * data_len 1701017Szelenkov@nginx.com ) 171730Szelenkov@nginx.com 172730Szelenkov@nginx.com sock.sendall(req.encode()) 173730Szelenkov@nginx.com 174730Szelenkov@nginx.com data = sock.recv(16).decode() 175730Szelenkov@nginx.com 176730Szelenkov@nginx.com time.sleep(3) 177730Szelenkov@nginx.com 178738Szelenkov@nginx.com data += self.recvall(sock).decode() 179730Szelenkov@nginx.com 180730Szelenkov@nginx.com sock.close() 181730Szelenkov@nginx.com 1821596Szelenkov@nginx.com assert re.search(r'200 OK', data), 'status send timeout' 1831596Szelenkov@nginx.com assert len(data) < data_len, 'data send timeout' 184730Szelenkov@nginx.com 185730Szelenkov@nginx.com def test_settings_idle_timeout(self): 186730Szelenkov@nginx.com self.load('empty') 187730Szelenkov@nginx.com 1881596Szelenkov@nginx.com assert self.get()['status'] == 200, 'init' 1891029Szelenkov@nginx.com 1901017Szelenkov@nginx.com self.conf({'http': {'idle_timeout': 2}}, 'settings') 191730Szelenkov@nginx.com 1921017Szelenkov@nginx.com (resp, sock) = self.get( 1931017Szelenkov@nginx.com headers={'Host': 'localhost', 'Connection': 'keep-alive'}, 1941017Szelenkov@nginx.com start=True, 1951017Szelenkov@nginx.com read_timeout=1, 1961017Szelenkov@nginx.com ) 197730Szelenkov@nginx.com 198730Szelenkov@nginx.com time.sleep(3) 199730Szelenkov@nginx.com 2001017Szelenkov@nginx.com resp = self.get( 2011017Szelenkov@nginx.com headers={'Host': 'localhost', 'Connection': 'close'}, sock=sock 2021017Szelenkov@nginx.com ) 203730Szelenkov@nginx.com 2041596Szelenkov@nginx.com assert resp['status'] == 408, 'status idle timeout' 205730Szelenkov@nginx.com 206*1606Szelenkov@nginx.com def test_settings_idle_timeout_2(self): 207*1606Szelenkov@nginx.com self.load('empty') 208*1606Szelenkov@nginx.com 209*1606Szelenkov@nginx.com assert self.get()['status'] == 200, 'init' 210*1606Szelenkov@nginx.com 211*1606Szelenkov@nginx.com self.conf({'http': {'idle_timeout': 1}}, 'settings') 212*1606Szelenkov@nginx.com 213*1606Szelenkov@nginx.com _, sock = self.http(b'', start=True, raw=True, no_recv=True) 214*1606Szelenkov@nginx.com 215*1606Szelenkov@nginx.com time.sleep(2) 216*1606Szelenkov@nginx.com 217*1606Szelenkov@nginx.com assert ( 218*1606Szelenkov@nginx.com self.get( 219*1606Szelenkov@nginx.com headers={'Host': 'localhost', 'Connection': 'close'}, sock=sock 220*1606Szelenkov@nginx.com )['status'] 221*1606Szelenkov@nginx.com == 408 222*1606Szelenkov@nginx.com ), 'status idle timeout' 223*1606Szelenkov@nginx.com 224730Szelenkov@nginx.com def test_settings_max_body_size(self): 225730Szelenkov@nginx.com self.load('empty') 226730Szelenkov@nginx.com 2271017Szelenkov@nginx.com self.conf({'http': {'max_body_size': 5}}, 'settings') 228730Szelenkov@nginx.com 2291596Szelenkov@nginx.com assert self.post(body='01234')['status'] == 200, 'status size' 2301596Szelenkov@nginx.com assert self.post(body='012345')['status'] == 413, 'status size max' 231730Szelenkov@nginx.com 2321365Szelenkov@nginx.com def test_settings_max_body_size_large(self): 2331365Szelenkov@nginx.com self.load('mirror') 2341365Szelenkov@nginx.com 2351365Szelenkov@nginx.com self.conf({'http': {'max_body_size': 32 * 1024 * 1024}}, 'settings') 2361365Szelenkov@nginx.com 2371365Szelenkov@nginx.com body = '0123456789abcdef' * 4 * 64 * 1024 2381365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2391596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 4' 2401596Szelenkov@nginx.com assert resp['body'] == body, 'status body 4' 2411365Szelenkov@nginx.com 2421365Szelenkov@nginx.com body = '0123456789abcdef' * 8 * 64 * 1024 2431365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2441596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 8' 2451596Szelenkov@nginx.com assert resp['body'] == body, 'status body 8' 2461365Szelenkov@nginx.com 2471365Szelenkov@nginx.com body = '0123456789abcdef' * 16 * 64 * 1024 2481365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2491596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 16' 2501596Szelenkov@nginx.com assert resp['body'] == body, 'status body 16' 2511365Szelenkov@nginx.com 2521365Szelenkov@nginx.com body = '0123456789abcdef' * 32 * 64 * 1024 2531365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2541596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 32' 2551596Szelenkov@nginx.com assert resp['body'] == body, 'status body 32' 2561365Szelenkov@nginx.com 2571596Szelenkov@nginx.com @pytest.mark.skip('not yet') 258730Szelenkov@nginx.com def test_settings_negative_value(self): 2591596Szelenkov@nginx.com assert 'error' in self.conf( 2601596Szelenkov@nginx.com {'http': {'max_body_size': -1}}, 'settings' 2611596Szelenkov@nginx.com ), 'settings negative value' 262