11635Szelenkov@nginx.comimport re 21477Szelenkov@nginx.comimport socket 32482Szelenkov@nginx.comimport subprocess 4730Szelenkov@nginx.comimport time 51477Szelenkov@nginx.com 61635Szelenkov@nginx.comimport pytest 7*2616Szelenkov@nginx.com 82491Szelenkov@nginx.comfrom unit.applications.lang.python import ApplicationPython 9730Szelenkov@nginx.com 102488Szelenkov@nginx.comprerequisites = {'modules': {'python': 'any'}} 112488Szelenkov@nginx.com 122491Szelenkov@nginx.comclient = ApplicationPython() 132482Szelenkov@nginx.com 142267Szelenkov@nginx.com 152491Szelenkov@nginx.comdef sysctl(): 162491Szelenkov@nginx.com try: 172491Szelenkov@nginx.com out = subprocess.check_output( 182491Szelenkov@nginx.com ['sysctl', '-a'], stderr=subprocess.STDOUT 192491Szelenkov@nginx.com ).decode() 202491Szelenkov@nginx.com except FileNotFoundError: 212491Szelenkov@nginx.com pytest.skip('requires sysctl') 222267Szelenkov@nginx.com 232491Szelenkov@nginx.com return out 242267Szelenkov@nginx.com 252267Szelenkov@nginx.com 262491Szelenkov@nginx.comdef test_settings_large_header_buffer_size(): 272491Szelenkov@nginx.com client.load('empty') 282267Szelenkov@nginx.com 292491Szelenkov@nginx.com def set_buffer_size(size): 302491Szelenkov@nginx.com assert 'success' in client.conf( 312491Szelenkov@nginx.com {'http': {'large_header_buffer_size': size}}, 322491Szelenkov@nginx.com 'settings', 332491Szelenkov@nginx.com ) 342470Szelenkov@nginx.com 352491Szelenkov@nginx.com def header_value(size, expect=200): 362491Szelenkov@nginx.com headers = {'Host': 'a' * (size - 1), 'Connection': 'close'} 372491Szelenkov@nginx.com assert client.get(headers=headers)['status'] == expect 38730Szelenkov@nginx.com 392491Szelenkov@nginx.com set_buffer_size(4096) 402491Szelenkov@nginx.com header_value(4096) 412491Szelenkov@nginx.com header_value(4097, 431) 42730Szelenkov@nginx.com 432491Szelenkov@nginx.com set_buffer_size(16384) 442491Szelenkov@nginx.com header_value(16384) 452491Szelenkov@nginx.com header_value(16385, 431) 46730Szelenkov@nginx.com 471878Szelenkov@nginx.com 482491Szelenkov@nginx.comdef test_settings_large_header_buffers(): 492491Szelenkov@nginx.com client.load('empty') 50730Szelenkov@nginx.com 512491Szelenkov@nginx.com def set_buffers(buffers): 522491Szelenkov@nginx.com assert 'success' in client.conf( 532491Szelenkov@nginx.com {'http': {'large_header_buffers': buffers}}, 542491Szelenkov@nginx.com 'settings', 551878Szelenkov@nginx.com ) 56756Szelenkov@nginx.com 572491Szelenkov@nginx.com def big_headers(headers_num, expect=200): 582491Szelenkov@nginx.com headers = {'Host': 'localhost', 'Connection': 'close'} 592491Szelenkov@nginx.com 602491Szelenkov@nginx.com for i in range(headers_num): 612491Szelenkov@nginx.com headers[f'Custom-header-{i}'] = 'a' * 8000 622491Szelenkov@nginx.com 632491Szelenkov@nginx.com assert client.get(headers=headers)['status'] == expect 642491Szelenkov@nginx.com 652491Szelenkov@nginx.com set_buffers(1) 662491Szelenkov@nginx.com big_headers(1) 672491Szelenkov@nginx.com big_headers(2, 431) 682491Szelenkov@nginx.com 692491Szelenkov@nginx.com set_buffers(2) 702491Szelenkov@nginx.com big_headers(2) 712491Szelenkov@nginx.com big_headers(3, 431) 722491Szelenkov@nginx.com 732491Szelenkov@nginx.com set_buffers(8) 742491Szelenkov@nginx.com big_headers(8) 752491Szelenkov@nginx.com big_headers(9, 431) 762491Szelenkov@nginx.com 772491Szelenkov@nginx.com 782491Szelenkov@nginx.com@pytest.mark.skip('not yet') 792491Szelenkov@nginx.comdef test_settings_large_header_buffer_invalid(): 802491Szelenkov@nginx.com def check_error(conf): 812491Szelenkov@nginx.com assert 'error' in client.conf({'http': conf}, 'settings') 822491Szelenkov@nginx.com 832491Szelenkov@nginx.com check_error({'large_header_buffer_size': -1}) 842491Szelenkov@nginx.com check_error({'large_header_buffer_size': 0}) 852491Szelenkov@nginx.com check_error({'large_header_buffers': -1}) 862491Szelenkov@nginx.com check_error({'large_header_buffers': 0}) 872491Szelenkov@nginx.com 882491Szelenkov@nginx.com 892491Szelenkov@nginx.comdef test_settings_server_version(): 902491Szelenkov@nginx.com client.load('empty') 912491Szelenkov@nginx.com 922491Szelenkov@nginx.com assert client.get()['headers']['Server'].startswith('Unit/') 932491Szelenkov@nginx.com 942491Szelenkov@nginx.com assert 'success' in client.conf( 952491Szelenkov@nginx.com {"http": {"server_version": False}}, 'settings' 962491Szelenkov@nginx.com ), 'remove version' 972491Szelenkov@nginx.com assert client.get()['headers']['Server'] == 'Unit' 982491Szelenkov@nginx.com 992491Szelenkov@nginx.com assert 'success' in client.conf( 1002491Szelenkov@nginx.com {"http": {"server_version": True}}, 'settings' 1012491Szelenkov@nginx.com ), 'add version' 1022491Szelenkov@nginx.com assert client.get()['headers']['Server'].startswith('Unit/') 1032491Szelenkov@nginx.com 1042491Szelenkov@nginx.com 1052491Szelenkov@nginx.comdef test_settings_header_read_timeout(): 1062491Szelenkov@nginx.com client.load('empty') 1072491Szelenkov@nginx.com 1082491Szelenkov@nginx.com def req(): 1092491Szelenkov@nginx.com (_, sock) = client.http( 1101017Szelenkov@nginx.com b"""GET / HTTP/1.1 1111017Szelenkov@nginx.com""", 1121017Szelenkov@nginx.com start=True, 1131017Szelenkov@nginx.com read_timeout=1, 1141017Szelenkov@nginx.com raw=True, 1151017Szelenkov@nginx.com ) 116767Szelenkov@nginx.com 1172491Szelenkov@nginx.com time.sleep(3) 118756Szelenkov@nginx.com 1192491Szelenkov@nginx.com return client.http( 1202491Szelenkov@nginx.com b"""Host: localhost 121730Szelenkov@nginx.comConnection: close 122730Szelenkov@nginx.com 1231017Szelenkov@nginx.com""", 1242491Szelenkov@nginx.com sock=sock, 1252491Szelenkov@nginx.com raw=True, 1261878Szelenkov@nginx.com ) 127756Szelenkov@nginx.com 1282491Szelenkov@nginx.com assert 'success' in client.conf( 1292491Szelenkov@nginx.com {'http': {'header_read_timeout': 2}}, 'settings' 1302491Szelenkov@nginx.com ) 1312491Szelenkov@nginx.com assert req()['status'] == 408, 'status header read timeout' 1322491Szelenkov@nginx.com 1332491Szelenkov@nginx.com assert 'success' in client.conf( 1342491Szelenkov@nginx.com {'http': {'header_read_timeout': 7}}, 'settings' 1352491Szelenkov@nginx.com ) 1362491Szelenkov@nginx.com assert req()['status'] == 200, 'status header read timeout 2' 1372491Szelenkov@nginx.com 1382491Szelenkov@nginx.com 1392491Szelenkov@nginx.comdef test_settings_header_read_timeout_update(): 1402491Szelenkov@nginx.com client.load('empty') 1412491Szelenkov@nginx.com 1422491Szelenkov@nginx.com assert 'success' in client.conf( 1432491Szelenkov@nginx.com {'http': {'header_read_timeout': 4}}, 'settings' 1442491Szelenkov@nginx.com ) 1452491Szelenkov@nginx.com 1462491Szelenkov@nginx.com sock = client.http( 1472491Szelenkov@nginx.com b"""GET / HTTP/1.1 1482491Szelenkov@nginx.com""", 1492491Szelenkov@nginx.com raw=True, 1502491Szelenkov@nginx.com no_recv=True, 1512491Szelenkov@nginx.com ) 1522491Szelenkov@nginx.com 1532491Szelenkov@nginx.com time.sleep(2) 1542491Szelenkov@nginx.com 1552491Szelenkov@nginx.com sock = client.http( 1562491Szelenkov@nginx.com b"""Host: localhost 1572491Szelenkov@nginx.com""", 1582491Szelenkov@nginx.com sock=sock, 1592491Szelenkov@nginx.com raw=True, 1602491Szelenkov@nginx.com no_recv=True, 1612491Szelenkov@nginx.com ) 1622491Szelenkov@nginx.com 1632491Szelenkov@nginx.com time.sleep(2) 1642491Szelenkov@nginx.com 1652491Szelenkov@nginx.com (resp, sock) = client.http( 1662491Szelenkov@nginx.com b"""X-Blah: blah 1672491Szelenkov@nginx.com""", 1682491Szelenkov@nginx.com start=True, 1692491Szelenkov@nginx.com sock=sock, 1702491Szelenkov@nginx.com read_timeout=1, 1712491Szelenkov@nginx.com raw=True, 1722491Szelenkov@nginx.com ) 1732491Szelenkov@nginx.com 1742491Szelenkov@nginx.com if len(resp) != 0: 1752491Szelenkov@nginx.com sock.close() 1762491Szelenkov@nginx.com 1772491Szelenkov@nginx.com else: 1782491Szelenkov@nginx.com time.sleep(2) 1792491Szelenkov@nginx.com 1802491Szelenkov@nginx.com resp = client.http( 1812491Szelenkov@nginx.com b"""Connection: close 1822491Szelenkov@nginx.com 1832491Szelenkov@nginx.com""", 1842491Szelenkov@nginx.com sock=sock, 1852491Szelenkov@nginx.com raw=True, 1862491Szelenkov@nginx.com ) 1872491Szelenkov@nginx.com 1882491Szelenkov@nginx.com assert resp['status'] == 408, 'status header read timeout update' 1892491Szelenkov@nginx.com 1902491Szelenkov@nginx.com 1912491Szelenkov@nginx.comdef test_settings_body_read_timeout(): 1922491Szelenkov@nginx.com client.load('empty') 1932491Szelenkov@nginx.com 1942491Szelenkov@nginx.com def req(): 1952491Szelenkov@nginx.com (_, sock) = client.http( 1961017Szelenkov@nginx.com b"""POST / HTTP/1.1 197756Szelenkov@nginx.comHost: localhost 198756Szelenkov@nginx.comContent-Length: 10 199756Szelenkov@nginx.comConnection: close 200756Szelenkov@nginx.com 2011017Szelenkov@nginx.com""", 2021017Szelenkov@nginx.com start=True, 2032491Szelenkov@nginx.com raw_resp=True, 2041017Szelenkov@nginx.com read_timeout=1, 2051017Szelenkov@nginx.com raw=True, 2061017Szelenkov@nginx.com ) 207756Szelenkov@nginx.com 2082491Szelenkov@nginx.com time.sleep(3) 2092491Szelenkov@nginx.com 2102491Szelenkov@nginx.com return client.http(b"""0123456789""", sock=sock, raw=True) 211756Szelenkov@nginx.com 2122491Szelenkov@nginx.com assert 'success' in client.conf( 2132491Szelenkov@nginx.com {'http': {'body_read_timeout': 2}}, 'settings' 2142491Szelenkov@nginx.com ) 2152491Szelenkov@nginx.com assert req()['status'] == 408, 'status body read timeout' 2162491Szelenkov@nginx.com 2172491Szelenkov@nginx.com assert 'success' in client.conf( 2182491Szelenkov@nginx.com {'http': {'body_read_timeout': 7}}, 'settings' 2192491Szelenkov@nginx.com ) 2202491Szelenkov@nginx.com assert req()['status'] == 200, 'status body read timeout 2' 221756Szelenkov@nginx.com 2222491Szelenkov@nginx.com 2232491Szelenkov@nginx.comdef test_settings_body_read_timeout_update(): 2242491Szelenkov@nginx.com client.load('empty') 225756Szelenkov@nginx.com 2262491Szelenkov@nginx.com assert 'success' in client.conf( 2272491Szelenkov@nginx.com {'http': {'body_read_timeout': 4}}, 'settings' 2282491Szelenkov@nginx.com ) 2292491Szelenkov@nginx.com 2302491Szelenkov@nginx.com (resp, sock) = client.http( 2312491Szelenkov@nginx.com b"""POST / HTTP/1.1 2322491Szelenkov@nginx.comHost: localhost 2332491Szelenkov@nginx.comContent-Length: 10 2342491Szelenkov@nginx.comConnection: close 235756Szelenkov@nginx.com 2362491Szelenkov@nginx.com""", 2372491Szelenkov@nginx.com start=True, 2382491Szelenkov@nginx.com read_timeout=1, 2392491Szelenkov@nginx.com raw=True, 2402491Szelenkov@nginx.com ) 241756Szelenkov@nginx.com 2422491Szelenkov@nginx.com time.sleep(2) 243756Szelenkov@nginx.com 2442491Szelenkov@nginx.com (resp, sock) = client.http( 2452491Szelenkov@nginx.com b"""012""", start=True, sock=sock, read_timeout=1, raw=True 2462491Szelenkov@nginx.com ) 2472491Szelenkov@nginx.com 2482491Szelenkov@nginx.com time.sleep(2) 249756Szelenkov@nginx.com 2502491Szelenkov@nginx.com (resp, sock) = client.http( 2512491Szelenkov@nginx.com b"""345""", start=True, sock=sock, read_timeout=1, raw=True 2522491Szelenkov@nginx.com ) 2532491Szelenkov@nginx.com 2542491Szelenkov@nginx.com time.sleep(2) 2552491Szelenkov@nginx.com 2562491Szelenkov@nginx.com resp = client.http(b"""6789""", sock=sock, raw=True) 2572491Szelenkov@nginx.com 2582491Szelenkov@nginx.com assert resp['status'] == 200, 'status body read timeout update' 259730Szelenkov@nginx.com 2602491Szelenkov@nginx.com 2612491Szelenkov@nginx.comdef test_settings_send_timeout(temp_dir): 2622491Szelenkov@nginx.com client.load('body_generate') 2631878Szelenkov@nginx.com 2642491Szelenkov@nginx.com def req(addr, data_len): 2652491Szelenkov@nginx.com sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 2662491Szelenkov@nginx.com sock.connect(addr) 2672491Szelenkov@nginx.com 2682491Szelenkov@nginx.com req = f"""GET / HTTP/1.1 2691878Szelenkov@nginx.comHost: localhost 2702330Szelenkov@nginx.comX-Length: {data_len} 2711878Szelenkov@nginx.comConnection: close 2721878Szelenkov@nginx.com 2731878Szelenkov@nginx.com""" 2741878Szelenkov@nginx.com 2752491Szelenkov@nginx.com sock.sendall(req.encode()) 2761878Szelenkov@nginx.com 2772491Szelenkov@nginx.com data = sock.recv(16).decode() 2781878Szelenkov@nginx.com 2792491Szelenkov@nginx.com time.sleep(3) 2801878Szelenkov@nginx.com 2812491Szelenkov@nginx.com data += client.recvall(sock).decode() 2821877Szelenkov@nginx.com 2832491Szelenkov@nginx.com sock.close() 284730Szelenkov@nginx.com 2852491Szelenkov@nginx.com return data 286730Szelenkov@nginx.com 2872491Szelenkov@nginx.com sysctl_out = sysctl() 2882491Szelenkov@nginx.com values = re.findall(r'net.core.[rw]mem_(?:max|default).*?(\d+)', sysctl_out) 2892491Szelenkov@nginx.com values = [int(v) for v in values] 290730Szelenkov@nginx.com 2912491Szelenkov@nginx.com data_len = 1048576 if len(values) == 0 else 10 * max(values) 292730Szelenkov@nginx.com 2932491Szelenkov@nginx.com addr = f'{temp_dir}/sock' 294730Szelenkov@nginx.com 2952491Szelenkov@nginx.com assert 'success' in client.conf( 2962491Szelenkov@nginx.com {f'unix:{addr}': {'application': 'body_generate'}}, 'listeners' 2972491Szelenkov@nginx.com ) 2981878Szelenkov@nginx.com 2992491Szelenkov@nginx.com assert 'success' in client.conf({'http': {'send_timeout': 1}}, 'settings') 3001878Szelenkov@nginx.com 3012491Szelenkov@nginx.com data = req(addr, data_len) 3022491Szelenkov@nginx.com assert re.search(r'200 OK', data), 'send timeout status' 3032491Szelenkov@nginx.com assert len(data) < data_len, 'send timeout data ' 304730Szelenkov@nginx.com 3052491Szelenkov@nginx.com client.conf({'http': {'send_timeout': 7}}, 'settings') 3061878Szelenkov@nginx.com 3072491Szelenkov@nginx.com data = req(addr, data_len) 3082491Szelenkov@nginx.com assert re.search(r'200 OK', data), 'send timeout status 2' 3092491Szelenkov@nginx.com assert len(data) > data_len, 'send timeout data 2' 3101606Szelenkov@nginx.com 3111606Szelenkov@nginx.com 3122491Szelenkov@nginx.comdef test_settings_idle_timeout(): 3132491Szelenkov@nginx.com client.load('empty') 314730Szelenkov@nginx.com 3152491Szelenkov@nginx.com def req(): 3162491Szelenkov@nginx.com (_, sock) = client.get( 3172491Szelenkov@nginx.com headers={'Host': 'localhost', 'Connection': 'keep-alive'}, 3182491Szelenkov@nginx.com start=True, 3192491Szelenkov@nginx.com read_timeout=1, 3201878Szelenkov@nginx.com ) 3211365Szelenkov@nginx.com 3222491Szelenkov@nginx.com time.sleep(3) 3232491Szelenkov@nginx.com 3242491Szelenkov@nginx.com return client.get(sock=sock) 3252491Szelenkov@nginx.com 3262491Szelenkov@nginx.com assert client.get()['status'] == 200, 'init' 3271365Szelenkov@nginx.com 3282491Szelenkov@nginx.com assert 'success' in client.conf({'http': {'idle_timeout': 2}}, 'settings') 3292491Szelenkov@nginx.com assert req()['status'] == 408, 'status idle timeout' 3302491Szelenkov@nginx.com 3312491Szelenkov@nginx.com assert 'success' in client.conf({'http': {'idle_timeout': 7}}, 'settings') 3322491Szelenkov@nginx.com assert req()['status'] == 200, 'status idle timeout 2' 3332491Szelenkov@nginx.com 3342491Szelenkov@nginx.com 3352491Szelenkov@nginx.comdef test_settings_idle_timeout_2(): 3362491Szelenkov@nginx.com client.load('empty') 3371365Szelenkov@nginx.com 3382491Szelenkov@nginx.com def req(): 3392491Szelenkov@nginx.com sock = client.http(b'', raw=True, no_recv=True) 3402491Szelenkov@nginx.com 3412491Szelenkov@nginx.com time.sleep(3) 3422491Szelenkov@nginx.com 3432491Szelenkov@nginx.com return client.get(sock=sock) 3442491Szelenkov@nginx.com 3452491Szelenkov@nginx.com assert client.get()['status'] == 200, 'init' 3461365Szelenkov@nginx.com 3472491Szelenkov@nginx.com assert 'success' in client.conf({'http': {'idle_timeout': 1}}, 'settings') 3482491Szelenkov@nginx.com assert req()['status'] == 408, 'status idle timeout' 3492491Szelenkov@nginx.com 3502491Szelenkov@nginx.com assert 'success' in client.conf({'http': {'idle_timeout': 7}}, 'settings') 3512491Szelenkov@nginx.com assert req()['status'] == 200, 'status idle timeout 2' 3522491Szelenkov@nginx.com 3532491Szelenkov@nginx.com 3542491Szelenkov@nginx.comdef test_settings_max_body_size(): 3552491Szelenkov@nginx.com client.load('empty') 3562491Szelenkov@nginx.com 3572491Szelenkov@nginx.com assert 'success' in client.conf({'http': {'max_body_size': 5}}, 'settings') 3581365Szelenkov@nginx.com 3592491Szelenkov@nginx.com assert client.post(body='01234')['status'] == 200, 'status size' 3602491Szelenkov@nginx.com assert client.post(body='012345')['status'] == 413, 'status size max' 3612491Szelenkov@nginx.com 3622491Szelenkov@nginx.com 3632491Szelenkov@nginx.comdef test_settings_max_body_size_large(): 3642491Szelenkov@nginx.com client.load('mirror') 3651702Szelenkov@nginx.com 3662491Szelenkov@nginx.com assert 'success' in client.conf( 3672491Szelenkov@nginx.com {'http': {'max_body_size': 32 * 1024 * 1024}}, 'settings' 3682491Szelenkov@nginx.com ) 3692491Szelenkov@nginx.com 3702491Szelenkov@nginx.com body = '0123456789abcdef' * 4 * 64 * 1024 3712491Szelenkov@nginx.com resp = client.post(body=body, read_buffer_size=1024 * 1024) 3722491Szelenkov@nginx.com assert resp['status'] == 200, 'status size 4' 3732491Szelenkov@nginx.com assert resp['body'] == body, 'status body 4' 3742491Szelenkov@nginx.com 3752491Szelenkov@nginx.com body = '0123456789abcdef' * 8 * 64 * 1024 3762491Szelenkov@nginx.com resp = client.post(body=body, read_buffer_size=1024 * 1024) 3772491Szelenkov@nginx.com assert resp['status'] == 200, 'status size 8' 3782491Szelenkov@nginx.com assert resp['body'] == body, 'status body 8' 3791702Szelenkov@nginx.com 3802491Szelenkov@nginx.com body = '0123456789abcdef' * 16 * 64 * 1024 3812491Szelenkov@nginx.com resp = client.post(body=body, read_buffer_size=1024 * 1024) 3822491Szelenkov@nginx.com assert resp['status'] == 200, 'status size 16' 3832491Szelenkov@nginx.com assert resp['body'] == body, 'status body 16' 3842491Szelenkov@nginx.com 3852491Szelenkov@nginx.com body = '0123456789abcdef' * 32 * 64 * 1024 3862491Szelenkov@nginx.com resp = client.post(body=body, read_buffer_size=1024 * 1024) 3872491Szelenkov@nginx.com assert resp['status'] == 200, 'status size 32' 3882491Szelenkov@nginx.com assert resp['body'] == body, 'status body 32' 3891702Szelenkov@nginx.com 3902491Szelenkov@nginx.com 3912491Szelenkov@nginx.com@pytest.mark.skip('not yet') 3922491Szelenkov@nginx.comdef test_settings_negative_value(): 3932491Szelenkov@nginx.com assert 'error' in client.conf( 3942491Szelenkov@nginx.com {'http': {'max_body_size': -1}}, 'settings' 3952491Szelenkov@nginx.com ), 'settings negative value' 3962491Szelenkov@nginx.com 3972491Szelenkov@nginx.com 3982491Szelenkov@nginx.comdef test_settings_body_buffer_size(): 3992491Szelenkov@nginx.com client.load('mirror') 4001702Szelenkov@nginx.com 4012491Szelenkov@nginx.com assert 'success' in client.conf( 4022491Szelenkov@nginx.com { 4032491Szelenkov@nginx.com 'http': { 4042491Szelenkov@nginx.com 'max_body_size': 64 * 1024 * 1024, 4052491Szelenkov@nginx.com 'body_buffer_size': 32 * 1024 * 1024, 4062491Szelenkov@nginx.com } 4072491Szelenkov@nginx.com }, 4082491Szelenkov@nginx.com 'settings', 4092491Szelenkov@nginx.com ) 4102491Szelenkov@nginx.com 4112491Szelenkov@nginx.com body = '0123456789abcdef' 4122491Szelenkov@nginx.com resp = client.post(body=body) 4132491Szelenkov@nginx.com assert bool(resp), 'response from application' 4142491Szelenkov@nginx.com assert resp['status'] == 200, 'status' 4152491Szelenkov@nginx.com assert resp['body'] == body, 'body' 4162491Szelenkov@nginx.com 4172491Szelenkov@nginx.com body = '0123456789abcdef' * 1024 * 1024 4182491Szelenkov@nginx.com resp = client.post(body=body, read_buffer_size=1024 * 1024) 4192491Szelenkov@nginx.com assert bool(resp), 'response from application 2' 4202491Szelenkov@nginx.com assert resp['status'] == 200, 'status 2' 4212491Szelenkov@nginx.com assert resp['body'] == body, 'body 2' 4221702Szelenkov@nginx.com 4232491Szelenkov@nginx.com body = '0123456789abcdef' * 2 * 1024 * 1024 4242491Szelenkov@nginx.com resp = client.post(body=body, read_buffer_size=1024 * 1024) 4252491Szelenkov@nginx.com assert bool(resp), 'response from application 3' 4262491Szelenkov@nginx.com assert resp['status'] == 200, 'status 3' 4272491Szelenkov@nginx.com assert resp['body'] == body, 'body 3' 4281702Szelenkov@nginx.com 4292491Szelenkov@nginx.com body = '0123456789abcdef' * 3 * 1024 * 1024 4302491Szelenkov@nginx.com resp = client.post(body=body, read_buffer_size=1024 * 1024) 4312491Szelenkov@nginx.com assert bool(resp), 'response from application 4' 4322491Szelenkov@nginx.com assert resp['status'] == 200, 'status 4' 4332491Szelenkov@nginx.com assert resp['body'] == body, 'body 4' 4342491Szelenkov@nginx.com 4352382Szelenkov@nginx.com 4362491Szelenkov@nginx.comdef test_settings_log_route(findall, search_in_file, wait_for_record): 4372491Szelenkov@nginx.com def count_fallbacks(): 4382491Szelenkov@nginx.com return len(findall(r'"fallback" taken')) 4392491Szelenkov@nginx.com 4402491Szelenkov@nginx.com def check_record(template): 4412491Szelenkov@nginx.com assert search_in_file(template) is not None 4422491Szelenkov@nginx.com 4432491Szelenkov@nginx.com def check_no_record(template): 4442491Szelenkov@nginx.com assert search_in_file(template) is None 4452382Szelenkov@nginx.com 4462491Szelenkov@nginx.com def template_req_line(url): 4472491Szelenkov@nginx.com return rf'\[notice\].*http request line "GET {url} HTTP/1\.1"' 4482382Szelenkov@nginx.com 4492491Szelenkov@nginx.com def template_selected(route): 4502491Szelenkov@nginx.com return rf'\[notice\].*"{route}" selected' 4512382Szelenkov@nginx.com 4522491Szelenkov@nginx.com def template_discarded(route): 4532491Szelenkov@nginx.com return rf'\[info\].*"{route}" discarded' 4542382Szelenkov@nginx.com 4552491Szelenkov@nginx.com def wait_for_request_log(status, uri, route): 4562491Szelenkov@nginx.com assert client.get(url=uri)['status'] == status 4572491Szelenkov@nginx.com assert wait_for_record(template_req_line(uri)) is not None 4582491Szelenkov@nginx.com assert wait_for_record(template_selected(route)) is not None 4592491Szelenkov@nginx.com 4602491Szelenkov@nginx.com # routes array 4612382Szelenkov@nginx.com 4622491Szelenkov@nginx.com assert 'success' in client.conf( 4632491Szelenkov@nginx.com { 4642592Szelenkov@nginx.com "listeners": {"*:8080": {"pass": "routes"}}, 4652491Szelenkov@nginx.com "routes": [ 4662491Szelenkov@nginx.com { 4672491Szelenkov@nginx.com "match": { 4682491Szelenkov@nginx.com "uri": "/zero", 4692491Szelenkov@nginx.com }, 4702491Szelenkov@nginx.com "action": {"return": 200}, 4712491Szelenkov@nginx.com }, 4722491Szelenkov@nginx.com { 4732491Szelenkov@nginx.com "action": {"return": 201}, 4742491Szelenkov@nginx.com }, 4752491Szelenkov@nginx.com ], 4762491Szelenkov@nginx.com "applications": {}, 4772491Szelenkov@nginx.com "settings": {"http": {"log_route": True}}, 4782491Szelenkov@nginx.com } 4792491Szelenkov@nginx.com ) 4802382Szelenkov@nginx.com 4812491Szelenkov@nginx.com wait_for_request_log(200, '/zero', 'routes/0') 4822491Szelenkov@nginx.com check_no_record(r'discarded') 4832491Szelenkov@nginx.com 4842491Szelenkov@nginx.com wait_for_request_log(201, '/one', 'routes/1') 4852491Szelenkov@nginx.com check_record(template_discarded('routes/0')) 4862382Szelenkov@nginx.com 4872491Szelenkov@nginx.com # routes object 4882382Szelenkov@nginx.com 4892491Szelenkov@nginx.com assert 'success' in client.conf( 4902491Szelenkov@nginx.com { 4912592Szelenkov@nginx.com "listeners": {"*:8080": {"pass": "routes/main"}}, 4922491Szelenkov@nginx.com "routes": { 4932491Szelenkov@nginx.com "main": [ 4942382Szelenkov@nginx.com { 4952382Szelenkov@nginx.com "match": { 4962491Szelenkov@nginx.com "uri": "/named_route", 4972382Szelenkov@nginx.com }, 4982382Szelenkov@nginx.com "action": {"return": 200}, 4992382Szelenkov@nginx.com }, 5002382Szelenkov@nginx.com { 5012382Szelenkov@nginx.com "action": {"return": 201}, 5022382Szelenkov@nginx.com }, 5032491Szelenkov@nginx.com ] 5042491Szelenkov@nginx.com }, 5052491Szelenkov@nginx.com "applications": {}, 5062491Szelenkov@nginx.com "settings": {"http": {"log_route": True}}, 5072491Szelenkov@nginx.com } 5082491Szelenkov@nginx.com ) 5092382Szelenkov@nginx.com 5102491Szelenkov@nginx.com wait_for_request_log(200, '/named_route', 'routes/main/0') 5112491Szelenkov@nginx.com check_no_record(template_discarded('routes/main')) 5122382Szelenkov@nginx.com 5132491Szelenkov@nginx.com wait_for_request_log(201, '/unnamed_route', 'routes/main/1') 5142491Szelenkov@nginx.com check_record(template_discarded('routes/main/0')) 5152382Szelenkov@nginx.com 5162491Szelenkov@nginx.com # routes sequence 5172382Szelenkov@nginx.com 5182491Szelenkov@nginx.com assert 'success' in client.conf( 5192491Szelenkov@nginx.com { 5202592Szelenkov@nginx.com "listeners": {"*:8080": {"pass": "routes/first"}}, 5212491Szelenkov@nginx.com "routes": { 5222491Szelenkov@nginx.com "first": [ 5232491Szelenkov@nginx.com { 5242491Szelenkov@nginx.com "action": {"pass": "routes/second"}, 5252491Szelenkov@nginx.com }, 5262491Szelenkov@nginx.com ], 5272491Szelenkov@nginx.com "second": [ 5282491Szelenkov@nginx.com { 5292491Szelenkov@nginx.com "action": {"return": 200}, 5302491Szelenkov@nginx.com }, 5312491Szelenkov@nginx.com ], 5322491Szelenkov@nginx.com }, 5332491Szelenkov@nginx.com "applications": {}, 5342491Szelenkov@nginx.com "settings": {"http": {"log_route": True}}, 5352491Szelenkov@nginx.com } 5362491Szelenkov@nginx.com ) 5372382Szelenkov@nginx.com 5382491Szelenkov@nginx.com wait_for_request_log(200, '/sequence', 'routes/second/0') 5392491Szelenkov@nginx.com check_record(template_selected('routes/first/0')) 5402382Szelenkov@nginx.com 5412491Szelenkov@nginx.com # fallback 5422382Szelenkov@nginx.com 5432491Szelenkov@nginx.com assert 'success' in client.conf( 5442491Szelenkov@nginx.com { 5452592Szelenkov@nginx.com "listeners": {"*:8080": {"pass": "routes/fall"}}, 5462491Szelenkov@nginx.com "routes": { 5472491Szelenkov@nginx.com "fall": [ 5482491Szelenkov@nginx.com { 5492491Szelenkov@nginx.com "action": { 5502491Szelenkov@nginx.com "share": "/blah", 5512491Szelenkov@nginx.com "fallback": {"pass": "routes/fall2"}, 5522382Szelenkov@nginx.com }, 5532491Szelenkov@nginx.com }, 5542491Szelenkov@nginx.com ], 5552491Szelenkov@nginx.com "fall2": [ 5562491Szelenkov@nginx.com { 5572491Szelenkov@nginx.com "action": {"return": 200}, 5582491Szelenkov@nginx.com }, 5592491Szelenkov@nginx.com ], 5602491Szelenkov@nginx.com }, 5612491Szelenkov@nginx.com "applications": {}, 5622491Szelenkov@nginx.com "settings": {"http": {"log_route": True}}, 5632491Szelenkov@nginx.com } 5642491Szelenkov@nginx.com ) 5652382Szelenkov@nginx.com 5662491Szelenkov@nginx.com wait_for_request_log(200, '/', 'routes/fall2/0') 5672491Szelenkov@nginx.com assert count_fallbacks() == 1 5682491Szelenkov@nginx.com check_record(template_selected('routes/fall/0')) 5692382Szelenkov@nginx.com 5702491Szelenkov@nginx.com assert client.head()['status'] == 200 5712491Szelenkov@nginx.com assert count_fallbacks() == 2 5722491Szelenkov@nginx.com 5732491Szelenkov@nginx.com # disable log 5742491Szelenkov@nginx.com 5752491Szelenkov@nginx.com assert 'success' in client.conf({"log_route": False}, 'settings/http') 5762491Szelenkov@nginx.com 5772491Szelenkov@nginx.com url = '/disable_logging' 5782491Szelenkov@nginx.com assert client.get(url=url)['status'] == 200 5792382Szelenkov@nginx.com 5802491Szelenkov@nginx.com time.sleep(1) 5812382Szelenkov@nginx.com 5822491Szelenkov@nginx.com check_no_record(template_req_line(url)) 5832382Szelenkov@nginx.com 5842491Szelenkov@nginx.com # total 5852382Szelenkov@nginx.com 5862491Szelenkov@nginx.com assert len(findall(r'\[notice\].*http request line')) == 7 5872491Szelenkov@nginx.com assert len(findall(r'\[notice\].*selected')) == 10 5882491Szelenkov@nginx.com assert len(findall(r'\[info\].*discarded')) == 2 589