11635Szelenkov@nginx.comimport re 21477Szelenkov@nginx.comimport socket 3730Szelenkov@nginx.comimport time 41477Szelenkov@nginx.com 51635Szelenkov@nginx.comimport pytest 61848Szelenkov@nginx.com 71019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython 8*1877Szelenkov@nginx.comfrom unit.utils import sysctl 9730Szelenkov@nginx.com 101017Szelenkov@nginx.com 111019Szelenkov@nginx.comclass TestSettings(TestApplicationPython): 121467Szelenkov@nginx.com prerequisites = {'modules': {'python': 'any'}} 13730Szelenkov@nginx.com 14730Szelenkov@nginx.com def test_settings_header_read_timeout(self): 15730Szelenkov@nginx.com self.load('empty') 16730Szelenkov@nginx.com 171017Szelenkov@nginx.com self.conf({'http': {'header_read_timeout': 2}}, 'settings') 18730Szelenkov@nginx.com 191017Szelenkov@nginx.com (resp, sock) = self.http( 201017Szelenkov@nginx.com b"""GET / HTTP/1.1 211017Szelenkov@nginx.com""", 221017Szelenkov@nginx.com start=True, 231017Szelenkov@nginx.com read_timeout=1, 241017Szelenkov@nginx.com raw=True, 251017Szelenkov@nginx.com ) 26730Szelenkov@nginx.com 27730Szelenkov@nginx.com time.sleep(3) 28730Szelenkov@nginx.com 291017Szelenkov@nginx.com resp = self.http( 301017Szelenkov@nginx.com b"""Host: localhost 31730Szelenkov@nginx.comConnection: close 32730Szelenkov@nginx.com 331017Szelenkov@nginx.com""", 341017Szelenkov@nginx.com sock=sock, 351017Szelenkov@nginx.com raw=True, 361017Szelenkov@nginx.com ) 37730Szelenkov@nginx.com 381596Szelenkov@nginx.com assert resp['status'] == 408, 'status header read timeout' 39730Szelenkov@nginx.com 40756Szelenkov@nginx.com def test_settings_header_read_timeout_update(self): 41756Szelenkov@nginx.com self.load('empty') 42756Szelenkov@nginx.com 431017Szelenkov@nginx.com self.conf({'http': {'header_read_timeout': 4}}, 'settings') 44756Szelenkov@nginx.com 451017Szelenkov@nginx.com (resp, sock) = self.http( 461017Szelenkov@nginx.com b"""GET / HTTP/1.1 471017Szelenkov@nginx.com""", 481017Szelenkov@nginx.com start=True, 491017Szelenkov@nginx.com raw=True, 501017Szelenkov@nginx.com no_recv=True, 511017Szelenkov@nginx.com ) 52756Szelenkov@nginx.com 53756Szelenkov@nginx.com time.sleep(2) 54756Szelenkov@nginx.com 551017Szelenkov@nginx.com (resp, sock) = self.http( 561017Szelenkov@nginx.com b"""Host: localhost 571017Szelenkov@nginx.com""", 581017Szelenkov@nginx.com start=True, 591017Szelenkov@nginx.com sock=sock, 601017Szelenkov@nginx.com raw=True, 611017Szelenkov@nginx.com no_recv=True, 621017Szelenkov@nginx.com ) 63759Szelenkov@nginx.com 64759Szelenkov@nginx.com time.sleep(2) 65759Szelenkov@nginx.com 661017Szelenkov@nginx.com (resp, sock) = self.http( 671017Szelenkov@nginx.com b"""X-Blah: blah 681017Szelenkov@nginx.com""", 691017Szelenkov@nginx.com start=True, 701017Szelenkov@nginx.com sock=sock, 711017Szelenkov@nginx.com read_timeout=1, 721017Szelenkov@nginx.com raw=True, 731017Szelenkov@nginx.com ) 74767Szelenkov@nginx.com 75767Szelenkov@nginx.com if len(resp) != 0: 76767Szelenkov@nginx.com sock.close() 77756Szelenkov@nginx.com 78767Szelenkov@nginx.com else: 79767Szelenkov@nginx.com time.sleep(2) 80756Szelenkov@nginx.com 811017Szelenkov@nginx.com resp = self.http( 821017Szelenkov@nginx.com b"""Connection: close 83756Szelenkov@nginx.com 841017Szelenkov@nginx.com""", 851017Szelenkov@nginx.com sock=sock, 861017Szelenkov@nginx.com raw=True, 871017Szelenkov@nginx.com ) 88756Szelenkov@nginx.com 891596Szelenkov@nginx.com assert resp['status'] == 408, 'status header read timeout update' 90756Szelenkov@nginx.com 91730Szelenkov@nginx.com def test_settings_body_read_timeout(self): 92730Szelenkov@nginx.com self.load('empty') 93730Szelenkov@nginx.com 941017Szelenkov@nginx.com self.conf({'http': {'body_read_timeout': 2}}, 'settings') 95730Szelenkov@nginx.com 961017Szelenkov@nginx.com (resp, sock) = self.http( 971017Szelenkov@nginx.com b"""POST / HTTP/1.1 98730Szelenkov@nginx.comHost: localhost 99730Szelenkov@nginx.comContent-Length: 10 100730Szelenkov@nginx.comConnection: close 101730Szelenkov@nginx.com 1021017Szelenkov@nginx.com""", 1031017Szelenkov@nginx.com start=True, 1041017Szelenkov@nginx.com raw_resp=True, 1051017Szelenkov@nginx.com read_timeout=1, 1061017Szelenkov@nginx.com raw=True, 1071017Szelenkov@nginx.com ) 108730Szelenkov@nginx.com 109730Szelenkov@nginx.com time.sleep(3) 110730Szelenkov@nginx.com 111730Szelenkov@nginx.com resp = self.http(b"""0123456789""", sock=sock, raw=True) 112730Szelenkov@nginx.com 1131596Szelenkov@nginx.com assert resp['status'] == 408, 'status body read timeout' 114730Szelenkov@nginx.com 115756Szelenkov@nginx.com def test_settings_body_read_timeout_update(self): 116756Szelenkov@nginx.com self.load('empty') 117756Szelenkov@nginx.com 1181017Szelenkov@nginx.com self.conf({'http': {'body_read_timeout': 4}}, 'settings') 119756Szelenkov@nginx.com 1201017Szelenkov@nginx.com (resp, sock) = self.http( 1211017Szelenkov@nginx.com b"""POST / HTTP/1.1 122756Szelenkov@nginx.comHost: localhost 123756Szelenkov@nginx.comContent-Length: 10 124756Szelenkov@nginx.comConnection: close 125756Szelenkov@nginx.com 1261017Szelenkov@nginx.com""", 1271017Szelenkov@nginx.com start=True, 1281017Szelenkov@nginx.com read_timeout=1, 1291017Szelenkov@nginx.com raw=True, 1301017Szelenkov@nginx.com ) 131756Szelenkov@nginx.com 132756Szelenkov@nginx.com time.sleep(2) 133756Szelenkov@nginx.com 1341017Szelenkov@nginx.com (resp, sock) = self.http( 1351017Szelenkov@nginx.com b"""012""", start=True, sock=sock, read_timeout=1, raw=True 1361017Szelenkov@nginx.com ) 137756Szelenkov@nginx.com 138756Szelenkov@nginx.com time.sleep(2) 139756Szelenkov@nginx.com 1401017Szelenkov@nginx.com (resp, sock) = self.http( 1411017Szelenkov@nginx.com b"""345""", start=True, sock=sock, read_timeout=1, raw=True 1421017Szelenkov@nginx.com ) 143756Szelenkov@nginx.com 144756Szelenkov@nginx.com time.sleep(2) 145756Szelenkov@nginx.com 146756Szelenkov@nginx.com resp = self.http(b"""6789""", sock=sock, raw=True) 147756Szelenkov@nginx.com 1481596Szelenkov@nginx.com assert resp['status'] == 200, 'status body read timeout update' 149756Szelenkov@nginx.com 1501654Szelenkov@nginx.com def test_settings_send_timeout(self, temp_dir): 151*1877Szelenkov@nginx.com self.load('body_generate') 152730Szelenkov@nginx.com 153*1877Szelenkov@nginx.com sysctl_out = sysctl() 154*1877Szelenkov@nginx.com values = re.findall( 155*1877Szelenkov@nginx.com r'net.core.[rw]mem_(?:max|default).*?(\d+)', sysctl_out 156*1877Szelenkov@nginx.com ) 157*1877Szelenkov@nginx.com values = [int(v) for v in values] 158*1877Szelenkov@nginx.com 159*1877Szelenkov@nginx.com data_len = 1048576 if len(values) == 0 else 10 * max(values) 160730Szelenkov@nginx.com 1611017Szelenkov@nginx.com self.conf({'http': {'send_timeout': 1}}, 'settings') 162730Szelenkov@nginx.com 1631654Szelenkov@nginx.com addr = temp_dir + '/sock' 164730Szelenkov@nginx.com 165*1877Szelenkov@nginx.com self.conf( 166*1877Szelenkov@nginx.com {"unix:" + addr: {'application': 'body_generate'}}, 'listeners' 167*1877Szelenkov@nginx.com ) 168730Szelenkov@nginx.com 169730Szelenkov@nginx.com sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 170730Szelenkov@nginx.com sock.connect(addr) 171730Szelenkov@nginx.com 172*1877Szelenkov@nginx.com req = ( 173*1877Szelenkov@nginx.com """GET / HTTP/1.1 174730Szelenkov@nginx.comHost: localhost 175*1877Szelenkov@nginx.comX-Length: %d 176970Szelenkov@nginx.comConnection: close 177730Szelenkov@nginx.com 178*1877Szelenkov@nginx.com""" 179*1877Szelenkov@nginx.com % data_len 1801017Szelenkov@nginx.com ) 181730Szelenkov@nginx.com 182730Szelenkov@nginx.com sock.sendall(req.encode()) 183730Szelenkov@nginx.com 184730Szelenkov@nginx.com data = sock.recv(16).decode() 185730Szelenkov@nginx.com 186730Szelenkov@nginx.com time.sleep(3) 187730Szelenkov@nginx.com 188738Szelenkov@nginx.com data += self.recvall(sock).decode() 189730Szelenkov@nginx.com 190730Szelenkov@nginx.com sock.close() 191730Szelenkov@nginx.com 1921596Szelenkov@nginx.com assert re.search(r'200 OK', data), 'status send timeout' 1931596Szelenkov@nginx.com assert len(data) < data_len, 'data send timeout' 194730Szelenkov@nginx.com 195730Szelenkov@nginx.com def test_settings_idle_timeout(self): 196730Szelenkov@nginx.com self.load('empty') 197730Szelenkov@nginx.com 1981596Szelenkov@nginx.com assert self.get()['status'] == 200, 'init' 1991029Szelenkov@nginx.com 2001017Szelenkov@nginx.com self.conf({'http': {'idle_timeout': 2}}, 'settings') 201730Szelenkov@nginx.com 2021017Szelenkov@nginx.com (resp, sock) = self.get( 2031017Szelenkov@nginx.com headers={'Host': 'localhost', 'Connection': 'keep-alive'}, 2041017Szelenkov@nginx.com start=True, 2051017Szelenkov@nginx.com read_timeout=1, 2061017Szelenkov@nginx.com ) 207730Szelenkov@nginx.com 208730Szelenkov@nginx.com time.sleep(3) 209730Szelenkov@nginx.com 2101017Szelenkov@nginx.com resp = self.get( 2111017Szelenkov@nginx.com headers={'Host': 'localhost', 'Connection': 'close'}, sock=sock 2121017Szelenkov@nginx.com ) 213730Szelenkov@nginx.com 2141596Szelenkov@nginx.com assert resp['status'] == 408, 'status idle timeout' 215730Szelenkov@nginx.com 2161606Szelenkov@nginx.com def test_settings_idle_timeout_2(self): 2171606Szelenkov@nginx.com self.load('empty') 2181606Szelenkov@nginx.com 2191606Szelenkov@nginx.com assert self.get()['status'] == 200, 'init' 2201606Szelenkov@nginx.com 2211606Szelenkov@nginx.com self.conf({'http': {'idle_timeout': 1}}, 'settings') 2221606Szelenkov@nginx.com 2231606Szelenkov@nginx.com _, sock = self.http(b'', start=True, raw=True, no_recv=True) 2241606Szelenkov@nginx.com 2251613Szelenkov@nginx.com time.sleep(3) 2261606Szelenkov@nginx.com 2271606Szelenkov@nginx.com assert ( 2281606Szelenkov@nginx.com self.get( 2291606Szelenkov@nginx.com headers={'Host': 'localhost', 'Connection': 'close'}, sock=sock 2301606Szelenkov@nginx.com )['status'] 2311606Szelenkov@nginx.com == 408 2321606Szelenkov@nginx.com ), 'status idle timeout' 2331606Szelenkov@nginx.com 234730Szelenkov@nginx.com def test_settings_max_body_size(self): 235730Szelenkov@nginx.com self.load('empty') 236730Szelenkov@nginx.com 2371017Szelenkov@nginx.com self.conf({'http': {'max_body_size': 5}}, 'settings') 238730Szelenkov@nginx.com 2391596Szelenkov@nginx.com assert self.post(body='01234')['status'] == 200, 'status size' 2401596Szelenkov@nginx.com assert self.post(body='012345')['status'] == 413, 'status size max' 241730Szelenkov@nginx.com 2421365Szelenkov@nginx.com def test_settings_max_body_size_large(self): 2431365Szelenkov@nginx.com self.load('mirror') 2441365Szelenkov@nginx.com 2451365Szelenkov@nginx.com self.conf({'http': {'max_body_size': 32 * 1024 * 1024}}, 'settings') 2461365Szelenkov@nginx.com 2471365Szelenkov@nginx.com body = '0123456789abcdef' * 4 * 64 * 1024 2481365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2491596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 4' 2501596Szelenkov@nginx.com assert resp['body'] == body, 'status body 4' 2511365Szelenkov@nginx.com 2521365Szelenkov@nginx.com body = '0123456789abcdef' * 8 * 64 * 1024 2531365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2541596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 8' 2551596Szelenkov@nginx.com assert resp['body'] == body, 'status body 8' 2561365Szelenkov@nginx.com 2571365Szelenkov@nginx.com body = '0123456789abcdef' * 16 * 64 * 1024 2581365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2591596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 16' 2601596Szelenkov@nginx.com assert resp['body'] == body, 'status body 16' 2611365Szelenkov@nginx.com 2621365Szelenkov@nginx.com body = '0123456789abcdef' * 32 * 64 * 1024 2631365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2641596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 32' 2651596Szelenkov@nginx.com assert resp['body'] == body, 'status body 32' 2661365Szelenkov@nginx.com 2671596Szelenkov@nginx.com @pytest.mark.skip('not yet') 268730Szelenkov@nginx.com def test_settings_negative_value(self): 2691596Szelenkov@nginx.com assert 'error' in self.conf( 2701596Szelenkov@nginx.com {'http': {'max_body_size': -1}}, 'settings' 2711596Szelenkov@nginx.com ), 'settings negative value' 2721702Szelenkov@nginx.com 2731702Szelenkov@nginx.com def test_settings_body_buffer_size(self): 2741702Szelenkov@nginx.com self.load('mirror') 2751702Szelenkov@nginx.com 2761702Szelenkov@nginx.com assert 'success' in self.conf( 2771702Szelenkov@nginx.com { 2781702Szelenkov@nginx.com 'http': { 2791702Szelenkov@nginx.com 'max_body_size': 64 * 1024 * 1024, 2801702Szelenkov@nginx.com 'body_buffer_size': 32 * 1024 * 1024, 2811702Szelenkov@nginx.com } 2821702Szelenkov@nginx.com }, 2831702Szelenkov@nginx.com 'settings', 2841702Szelenkov@nginx.com ) 2851702Szelenkov@nginx.com 2861702Szelenkov@nginx.com body = '0123456789abcdef' 2871702Szelenkov@nginx.com resp = self.post(body=body) 2881702Szelenkov@nginx.com assert bool(resp), 'response from application' 2891702Szelenkov@nginx.com assert resp['status'] == 200, 'status' 2901702Szelenkov@nginx.com assert resp['body'] == body, 'body' 2911702Szelenkov@nginx.com 2921702Szelenkov@nginx.com body = '0123456789abcdef' * 1024 * 1024 2931702Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2941702Szelenkov@nginx.com assert bool(resp), 'response from application 2' 2951702Szelenkov@nginx.com assert resp['status'] == 200, 'status 2' 2961702Szelenkov@nginx.com assert resp['body'] == body, 'body 2' 2971702Szelenkov@nginx.com 2981702Szelenkov@nginx.com body = '0123456789abcdef' * 2 * 1024 * 1024 2991702Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 3001702Szelenkov@nginx.com assert bool(resp), 'response from application 3' 3011702Szelenkov@nginx.com assert resp['status'] == 200, 'status 3' 3021702Szelenkov@nginx.com assert resp['body'] == body, 'body 3' 3031702Szelenkov@nginx.com 3041702Szelenkov@nginx.com body = '0123456789abcdef' * 3 * 1024 * 1024 3051702Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 3061702Szelenkov@nginx.com assert bool(resp), 'response from application 4' 3071702Szelenkov@nginx.com assert resp['status'] == 200, 'status 4' 3081702Szelenkov@nginx.com assert resp['body'] == body, 'body 4' 309