11635Szelenkov@nginx.comimport re 21477Szelenkov@nginx.comimport socket 3730Szelenkov@nginx.comimport time 41477Szelenkov@nginx.com 51635Szelenkov@nginx.comimport pytest 61019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython 71877Szelenkov@nginx.comfrom unit.utils import sysctl 8730Szelenkov@nginx.com 91017Szelenkov@nginx.com 101019Szelenkov@nginx.comclass TestSettings(TestApplicationPython): 111467Szelenkov@nginx.com prerequisites = {'modules': {'python': 'any'}} 12730Szelenkov@nginx.com 13730Szelenkov@nginx.com def test_settings_header_read_timeout(self): 14730Szelenkov@nginx.com self.load('empty') 15730Szelenkov@nginx.com 161878Szelenkov@nginx.com def req(): 171878Szelenkov@nginx.com (resp, sock) = self.http( 181878Szelenkov@nginx.com b"""GET / HTTP/1.1 191017Szelenkov@nginx.com""", 201878Szelenkov@nginx.com start=True, 211878Szelenkov@nginx.com read_timeout=1, 221878Szelenkov@nginx.com raw=True, 231878Szelenkov@nginx.com ) 24730Szelenkov@nginx.com 251878Szelenkov@nginx.com time.sleep(3) 26730Szelenkov@nginx.com 271878Szelenkov@nginx.com return self.http( 281878Szelenkov@nginx.com b"""Host: localhost 29730Szelenkov@nginx.comConnection: close 30730Szelenkov@nginx.com 311878Szelenkov@nginx.com """, 321878Szelenkov@nginx.com sock=sock, 331878Szelenkov@nginx.com raw=True, 341878Szelenkov@nginx.com ) 351878Szelenkov@nginx.com 361878Szelenkov@nginx.com assert 'success' in self.conf( 371878Szelenkov@nginx.com {'http': {'header_read_timeout': 2}}, 'settings' 381017Szelenkov@nginx.com ) 391878Szelenkov@nginx.com assert req()['status'] == 408, 'status header read timeout' 40730Szelenkov@nginx.com 411878Szelenkov@nginx.com assert 'success' in self.conf( 421878Szelenkov@nginx.com {'http': {'header_read_timeout': 7}}, 'settings' 431878Szelenkov@nginx.com ) 441878Szelenkov@nginx.com assert req()['status'] == 200, 'status header read timeout 2' 45730Szelenkov@nginx.com 46756Szelenkov@nginx.com def test_settings_header_read_timeout_update(self): 47756Szelenkov@nginx.com self.load('empty') 48756Szelenkov@nginx.com 491878Szelenkov@nginx.com assert 'success' in self.conf( 501878Szelenkov@nginx.com {'http': {'header_read_timeout': 4}}, 'settings' 511878Szelenkov@nginx.com ) 52756Szelenkov@nginx.com 531017Szelenkov@nginx.com (resp, sock) = self.http( 541017Szelenkov@nginx.com b"""GET / HTTP/1.1 551017Szelenkov@nginx.com""", 561017Szelenkov@nginx.com start=True, 571017Szelenkov@nginx.com raw=True, 581017Szelenkov@nginx.com no_recv=True, 591017Szelenkov@nginx.com ) 60756Szelenkov@nginx.com 61756Szelenkov@nginx.com time.sleep(2) 62756Szelenkov@nginx.com 631017Szelenkov@nginx.com (resp, sock) = self.http( 641017Szelenkov@nginx.com b"""Host: localhost 651017Szelenkov@nginx.com""", 661017Szelenkov@nginx.com start=True, 671017Szelenkov@nginx.com sock=sock, 681017Szelenkov@nginx.com raw=True, 691017Szelenkov@nginx.com no_recv=True, 701017Szelenkov@nginx.com ) 71759Szelenkov@nginx.com 72759Szelenkov@nginx.com time.sleep(2) 73759Szelenkov@nginx.com 741017Szelenkov@nginx.com (resp, sock) = self.http( 751017Szelenkov@nginx.com b"""X-Blah: blah 761017Szelenkov@nginx.com""", 771017Szelenkov@nginx.com start=True, 781017Szelenkov@nginx.com sock=sock, 791017Szelenkov@nginx.com read_timeout=1, 801017Szelenkov@nginx.com raw=True, 811017Szelenkov@nginx.com ) 82767Szelenkov@nginx.com 83767Szelenkov@nginx.com if len(resp) != 0: 84767Szelenkov@nginx.com sock.close() 85756Szelenkov@nginx.com 86767Szelenkov@nginx.com else: 87767Szelenkov@nginx.com time.sleep(2) 88756Szelenkov@nginx.com 891017Szelenkov@nginx.com resp = self.http( 901017Szelenkov@nginx.com b"""Connection: close 91756Szelenkov@nginx.com 921017Szelenkov@nginx.com""", 931017Szelenkov@nginx.com sock=sock, 941017Szelenkov@nginx.com raw=True, 951017Szelenkov@nginx.com ) 96756Szelenkov@nginx.com 971596Szelenkov@nginx.com assert resp['status'] == 408, 'status header read timeout update' 98756Szelenkov@nginx.com 99730Szelenkov@nginx.com def test_settings_body_read_timeout(self): 100730Szelenkov@nginx.com self.load('empty') 101730Szelenkov@nginx.com 1021878Szelenkov@nginx.com def req(): 1031878Szelenkov@nginx.com (resp, sock) = self.http( 1041878Szelenkov@nginx.com b"""POST / HTTP/1.1 105730Szelenkov@nginx.comHost: localhost 106730Szelenkov@nginx.comContent-Length: 10 107730Szelenkov@nginx.comConnection: close 108730Szelenkov@nginx.com 1091017Szelenkov@nginx.com""", 1101878Szelenkov@nginx.com start=True, 1111878Szelenkov@nginx.com raw_resp=True, 1121878Szelenkov@nginx.com read_timeout=1, 1131878Szelenkov@nginx.com raw=True, 1141878Szelenkov@nginx.com ) 1151878Szelenkov@nginx.com 1161878Szelenkov@nginx.com time.sleep(3) 1171878Szelenkov@nginx.com 1181878Szelenkov@nginx.com return self.http(b"""0123456789""", sock=sock, raw=True) 119730Szelenkov@nginx.com 1201878Szelenkov@nginx.com assert 'success' in self.conf( 1211878Szelenkov@nginx.com {'http': {'body_read_timeout': 2}}, 'settings' 1221878Szelenkov@nginx.com ) 1231878Szelenkov@nginx.com assert req()['status'] == 408, 'status body read timeout' 124730Szelenkov@nginx.com 1251878Szelenkov@nginx.com assert 'success' in self.conf( 1261878Szelenkov@nginx.com {'http': {'body_read_timeout': 7}}, 'settings' 1271878Szelenkov@nginx.com ) 1281878Szelenkov@nginx.com assert req()['status'] == 200, 'status body read timeout 2' 129730Szelenkov@nginx.com 130756Szelenkov@nginx.com def test_settings_body_read_timeout_update(self): 131756Szelenkov@nginx.com self.load('empty') 132756Szelenkov@nginx.com 1331878Szelenkov@nginx.com assert 'success' in self.conf( 1341878Szelenkov@nginx.com {'http': {'body_read_timeout': 4}}, 'settings' 1351878Szelenkov@nginx.com ) 136756Szelenkov@nginx.com 1371017Szelenkov@nginx.com (resp, sock) = self.http( 1381017Szelenkov@nginx.com b"""POST / HTTP/1.1 139756Szelenkov@nginx.comHost: localhost 140756Szelenkov@nginx.comContent-Length: 10 141756Szelenkov@nginx.comConnection: close 142756Szelenkov@nginx.com 1431017Szelenkov@nginx.com""", 1441017Szelenkov@nginx.com start=True, 1451017Szelenkov@nginx.com read_timeout=1, 1461017Szelenkov@nginx.com raw=True, 1471017Szelenkov@nginx.com ) 148756Szelenkov@nginx.com 149756Szelenkov@nginx.com time.sleep(2) 150756Szelenkov@nginx.com 1511017Szelenkov@nginx.com (resp, sock) = self.http( 1521017Szelenkov@nginx.com b"""012""", start=True, sock=sock, read_timeout=1, raw=True 1531017Szelenkov@nginx.com ) 154756Szelenkov@nginx.com 155756Szelenkov@nginx.com time.sleep(2) 156756Szelenkov@nginx.com 1571017Szelenkov@nginx.com (resp, sock) = self.http( 1581017Szelenkov@nginx.com b"""345""", start=True, sock=sock, read_timeout=1, raw=True 1591017Szelenkov@nginx.com ) 160756Szelenkov@nginx.com 161756Szelenkov@nginx.com time.sleep(2) 162756Szelenkov@nginx.com 163756Szelenkov@nginx.com resp = self.http(b"""6789""", sock=sock, raw=True) 164756Szelenkov@nginx.com 1651596Szelenkov@nginx.com assert resp['status'] == 200, 'status body read timeout update' 166756Szelenkov@nginx.com 1671654Szelenkov@nginx.com def test_settings_send_timeout(self, temp_dir): 1681877Szelenkov@nginx.com self.load('body_generate') 169730Szelenkov@nginx.com 1701878Szelenkov@nginx.com def req(addr, data_len): 1711878Szelenkov@nginx.com sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 1721878Szelenkov@nginx.com sock.connect(addr) 1731878Szelenkov@nginx.com 1741878Szelenkov@nginx.com req = ( 1751878Szelenkov@nginx.com """GET / HTTP/1.1 1761878Szelenkov@nginx.comHost: localhost 1771878Szelenkov@nginx.comX-Length: %d 1781878Szelenkov@nginx.comConnection: close 1791878Szelenkov@nginx.com 1801878Szelenkov@nginx.com""" 1811878Szelenkov@nginx.com % data_len 1821878Szelenkov@nginx.com ) 1831878Szelenkov@nginx.com 1841878Szelenkov@nginx.com sock.sendall(req.encode()) 1851878Szelenkov@nginx.com 1861878Szelenkov@nginx.com data = sock.recv(16).decode() 1871878Szelenkov@nginx.com 1881878Szelenkov@nginx.com time.sleep(3) 1891878Szelenkov@nginx.com 1901878Szelenkov@nginx.com data += self.recvall(sock).decode() 1911878Szelenkov@nginx.com 1921878Szelenkov@nginx.com sock.close() 1931878Szelenkov@nginx.com 1941878Szelenkov@nginx.com return data 1951878Szelenkov@nginx.com 1961877Szelenkov@nginx.com sysctl_out = sysctl() 1971877Szelenkov@nginx.com values = re.findall( 1981877Szelenkov@nginx.com r'net.core.[rw]mem_(?:max|default).*?(\d+)', sysctl_out 1991877Szelenkov@nginx.com ) 2001877Szelenkov@nginx.com values = [int(v) for v in values] 2011877Szelenkov@nginx.com 2021877Szelenkov@nginx.com data_len = 1048576 if len(values) == 0 else 10 * max(values) 203730Szelenkov@nginx.com 2041654Szelenkov@nginx.com addr = temp_dir + '/sock' 205730Szelenkov@nginx.com 2061878Szelenkov@nginx.com assert 'success' in self.conf( 2071877Szelenkov@nginx.com {"unix:" + addr: {'application': 'body_generate'}}, 'listeners' 2081877Szelenkov@nginx.com ) 209730Szelenkov@nginx.com 210*2073Szelenkov@nginx.com assert 'success' in self.conf({'http': {'send_timeout': 1}}, 'settings') 211730Szelenkov@nginx.com 2121878Szelenkov@nginx.com data = req(addr, data_len) 2131878Szelenkov@nginx.com assert re.search(r'200 OK', data), 'send timeout status' 2141878Szelenkov@nginx.com assert len(data) < data_len, 'send timeout data ' 215730Szelenkov@nginx.com 2161878Szelenkov@nginx.com self.conf({'http': {'send_timeout': 7}}, 'settings') 217730Szelenkov@nginx.com 2181878Szelenkov@nginx.com data = req(addr, data_len) 2191878Szelenkov@nginx.com assert re.search(r'200 OK', data), 'send timeout status 2' 2201878Szelenkov@nginx.com assert len(data) > data_len, 'send timeout data 2' 221730Szelenkov@nginx.com 222730Szelenkov@nginx.com def test_settings_idle_timeout(self): 223730Szelenkov@nginx.com self.load('empty') 224730Szelenkov@nginx.com 2251878Szelenkov@nginx.com def req(): 2261878Szelenkov@nginx.com (resp, sock) = self.get( 2271878Szelenkov@nginx.com headers={'Host': 'localhost', 'Connection': 'keep-alive'}, 2281878Szelenkov@nginx.com start=True, 2291878Szelenkov@nginx.com read_timeout=1, 2301878Szelenkov@nginx.com ) 2311878Szelenkov@nginx.com 2321878Szelenkov@nginx.com time.sleep(3) 2331878Szelenkov@nginx.com 2341878Szelenkov@nginx.com return self.get(sock=sock) 2351878Szelenkov@nginx.com 2361596Szelenkov@nginx.com assert self.get()['status'] == 200, 'init' 2371029Szelenkov@nginx.com 238*2073Szelenkov@nginx.com assert 'success' in self.conf({'http': {'idle_timeout': 2}}, 'settings') 2391878Szelenkov@nginx.com assert req()['status'] == 408, 'status idle timeout' 240730Szelenkov@nginx.com 241*2073Szelenkov@nginx.com assert 'success' in self.conf({'http': {'idle_timeout': 7}}, 'settings') 2421878Szelenkov@nginx.com assert req()['status'] == 200, 'status idle timeout 2' 243730Szelenkov@nginx.com 2441606Szelenkov@nginx.com def test_settings_idle_timeout_2(self): 2451606Szelenkov@nginx.com self.load('empty') 2461606Szelenkov@nginx.com 2471878Szelenkov@nginx.com def req(): 2481878Szelenkov@nginx.com _, sock = self.http(b'', start=True, raw=True, no_recv=True) 2491878Szelenkov@nginx.com 2501878Szelenkov@nginx.com time.sleep(3) 2511878Szelenkov@nginx.com 2521878Szelenkov@nginx.com return self.get(sock=sock) 2531878Szelenkov@nginx.com 2541606Szelenkov@nginx.com assert self.get()['status'] == 200, 'init' 2551606Szelenkov@nginx.com 256*2073Szelenkov@nginx.com assert 'success' in self.conf({'http': {'idle_timeout': 1}}, 'settings') 2571878Szelenkov@nginx.com assert req()['status'] == 408, 'status idle timeout' 2581606Szelenkov@nginx.com 259*2073Szelenkov@nginx.com assert 'success' in self.conf({'http': {'idle_timeout': 7}}, 'settings') 2601878Szelenkov@nginx.com assert req()['status'] == 200, 'status idle timeout 2' 2611606Szelenkov@nginx.com 262730Szelenkov@nginx.com def test_settings_max_body_size(self): 263730Szelenkov@nginx.com self.load('empty') 264730Szelenkov@nginx.com 2651878Szelenkov@nginx.com assert 'success' in self.conf( 2661878Szelenkov@nginx.com {'http': {'max_body_size': 5}}, 'settings' 2671878Szelenkov@nginx.com ) 268730Szelenkov@nginx.com 2691596Szelenkov@nginx.com assert self.post(body='01234')['status'] == 200, 'status size' 2701596Szelenkov@nginx.com assert self.post(body='012345')['status'] == 413, 'status size max' 271730Szelenkov@nginx.com 2721365Szelenkov@nginx.com def test_settings_max_body_size_large(self): 2731365Szelenkov@nginx.com self.load('mirror') 2741365Szelenkov@nginx.com 2751878Szelenkov@nginx.com assert 'success' in self.conf( 2761878Szelenkov@nginx.com {'http': {'max_body_size': 32 * 1024 * 1024}}, 'settings' 2771878Szelenkov@nginx.com ) 2781365Szelenkov@nginx.com 2791365Szelenkov@nginx.com body = '0123456789abcdef' * 4 * 64 * 1024 2801365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2811596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 4' 2821596Szelenkov@nginx.com assert resp['body'] == body, 'status body 4' 2831365Szelenkov@nginx.com 2841365Szelenkov@nginx.com body = '0123456789abcdef' * 8 * 64 * 1024 2851365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2861596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 8' 2871596Szelenkov@nginx.com assert resp['body'] == body, 'status body 8' 2881365Szelenkov@nginx.com 2891365Szelenkov@nginx.com body = '0123456789abcdef' * 16 * 64 * 1024 2901365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2911596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 16' 2921596Szelenkov@nginx.com assert resp['body'] == body, 'status body 16' 2931365Szelenkov@nginx.com 2941365Szelenkov@nginx.com body = '0123456789abcdef' * 32 * 64 * 1024 2951365Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 2961596Szelenkov@nginx.com assert resp['status'] == 200, 'status size 32' 2971596Szelenkov@nginx.com assert resp['body'] == body, 'status body 32' 2981365Szelenkov@nginx.com 2991596Szelenkov@nginx.com @pytest.mark.skip('not yet') 300730Szelenkov@nginx.com def test_settings_negative_value(self): 3011596Szelenkov@nginx.com assert 'error' in self.conf( 3021596Szelenkov@nginx.com {'http': {'max_body_size': -1}}, 'settings' 3031596Szelenkov@nginx.com ), 'settings negative value' 3041702Szelenkov@nginx.com 3051702Szelenkov@nginx.com def test_settings_body_buffer_size(self): 3061702Szelenkov@nginx.com self.load('mirror') 3071702Szelenkov@nginx.com 3081702Szelenkov@nginx.com assert 'success' in self.conf( 3091702Szelenkov@nginx.com { 3101702Szelenkov@nginx.com 'http': { 3111702Szelenkov@nginx.com 'max_body_size': 64 * 1024 * 1024, 3121702Szelenkov@nginx.com 'body_buffer_size': 32 * 1024 * 1024, 3131702Szelenkov@nginx.com } 3141702Szelenkov@nginx.com }, 3151702Szelenkov@nginx.com 'settings', 3161702Szelenkov@nginx.com ) 3171702Szelenkov@nginx.com 3181702Szelenkov@nginx.com body = '0123456789abcdef' 3191702Szelenkov@nginx.com resp = self.post(body=body) 3201702Szelenkov@nginx.com assert bool(resp), 'response from application' 3211702Szelenkov@nginx.com assert resp['status'] == 200, 'status' 3221702Szelenkov@nginx.com assert resp['body'] == body, 'body' 3231702Szelenkov@nginx.com 3241702Szelenkov@nginx.com body = '0123456789abcdef' * 1024 * 1024 3251702Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 3261702Szelenkov@nginx.com assert bool(resp), 'response from application 2' 3271702Szelenkov@nginx.com assert resp['status'] == 200, 'status 2' 3281702Szelenkov@nginx.com assert resp['body'] == body, 'body 2' 3291702Szelenkov@nginx.com 3301702Szelenkov@nginx.com body = '0123456789abcdef' * 2 * 1024 * 1024 3311702Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 3321702Szelenkov@nginx.com assert bool(resp), 'response from application 3' 3331702Szelenkov@nginx.com assert resp['status'] == 200, 'status 3' 3341702Szelenkov@nginx.com assert resp['body'] == body, 'body 3' 3351702Szelenkov@nginx.com 3361702Szelenkov@nginx.com body = '0123456789abcdef' * 3 * 1024 * 1024 3371702Szelenkov@nginx.com resp = self.post(body=body, read_buffer_size=1024 * 1024) 3381702Szelenkov@nginx.com assert bool(resp), 'response from application 4' 3391702Szelenkov@nginx.com assert resp['status'] == 200, 'status 4' 3401702Szelenkov@nginx.com assert resp['body'] == body, 'body 4' 341