12213Szelenkov@nginx.comimport re 22213Szelenkov@nginx.comimport time 3*2616Szelenkov@nginx.comfrom pathlib import Path 42213Szelenkov@nginx.com 52478Szelenkov@nginx.comimport pytest 6*2616Szelenkov@nginx.com 7*2616Szelenkov@nginx.comfrom unit.applications.lang.python import ApplicationPython 82491Szelenkov@nginx.comfrom unit.applications.proto import ApplicationProto 92213Szelenkov@nginx.comfrom unit.option import option 101567Szelenkov@nginx.com 112491Szelenkov@nginx.comclient = ApplicationProto() 122506Szelenkov@nginx.comclient_python = ApplicationPython() 132491Szelenkov@nginx.com 142491Szelenkov@nginx.com 152491Szelenkov@nginx.com@pytest.fixture(autouse=True) 162491Szelenkov@nginx.comdef setup_method_fixture(): 172491Szelenkov@nginx.com assert 'success' in client.conf( 182491Szelenkov@nginx.com { 192592Szelenkov@nginx.com "listeners": {"*:8080": {"pass": "routes"}}, 202491Szelenkov@nginx.com "routes": [{"action": {"return": 200}}], 212491Szelenkov@nginx.com }, 222491Szelenkov@nginx.com ), 'configure routes' 232491Szelenkov@nginx.com 242491Szelenkov@nginx.com 25*2616Szelenkov@nginx.comdef set_format(log_format): 262491Szelenkov@nginx.com assert 'success' in client.conf( 272491Szelenkov@nginx.com { 282491Szelenkov@nginx.com 'path': f'{option.temp_dir}/access.log', 29*2616Szelenkov@nginx.com 'format': log_format, 302491Szelenkov@nginx.com }, 312491Szelenkov@nginx.com 'access_log', 322491Szelenkov@nginx.com ), 'access_log format' 332491Szelenkov@nginx.com 342491Szelenkov@nginx.com 352491Szelenkov@nginx.comdef test_variables_dollar(): 362491Szelenkov@nginx.com assert 'success' in client.conf("301", 'routes/0/action/return') 372491Szelenkov@nginx.com 382491Szelenkov@nginx.com def check_dollar(location, expect): 392491Szelenkov@nginx.com assert 'success' in client.conf( 402491Szelenkov@nginx.com f'"{location}"', 412491Szelenkov@nginx.com 'routes/0/action/location', 422491Szelenkov@nginx.com ) 432491Szelenkov@nginx.com assert client.get()['headers']['Location'] == expect 442491Szelenkov@nginx.com 452491Szelenkov@nginx.com check_dollar( 462491Szelenkov@nginx.com 'https://${host}${uri}path${dollar}dollar', 472491Szelenkov@nginx.com 'https://localhost/path$dollar', 482491Szelenkov@nginx.com ) 492491Szelenkov@nginx.com check_dollar('path$dollar${dollar}', 'path$$') 502491Szelenkov@nginx.com 512491Szelenkov@nginx.com 522491Szelenkov@nginx.comdef test_variables_request_time(wait_for_record): 532491Szelenkov@nginx.com set_format('$uri $request_time') 542491Szelenkov@nginx.com 552491Szelenkov@nginx.com sock = client.http(b'', raw=True, no_recv=True) 562491Szelenkov@nginx.com 572491Szelenkov@nginx.com time.sleep(1) 582491Szelenkov@nginx.com 592491Szelenkov@nginx.com assert client.get(url='/r_time_1', sock=sock)['status'] == 200 602491Szelenkov@nginx.com assert wait_for_record(r'\/r_time_1 0\.\d{3}', 'access.log') is not None 612491Szelenkov@nginx.com 622491Szelenkov@nginx.com sock = client.http( 632491Szelenkov@nginx.com b"""G""", 642491Szelenkov@nginx.com no_recv=True, 652491Szelenkov@nginx.com raw=True, 662491Szelenkov@nginx.com ) 672491Szelenkov@nginx.com 682491Szelenkov@nginx.com time.sleep(2) 692491Szelenkov@nginx.com 702491Szelenkov@nginx.com client.http( 712491Szelenkov@nginx.com b"""ET /r_time_2 HTTP/1.1 722491Szelenkov@nginx.comHost: localhost 732491Szelenkov@nginx.comConnection: close 742491Szelenkov@nginx.com 752491Szelenkov@nginx.com""", 762491Szelenkov@nginx.com sock=sock, 772491Szelenkov@nginx.com raw=True, 782491Szelenkov@nginx.com ) 792491Szelenkov@nginx.com assert wait_for_record(r'\/r_time_2 [1-9]\.\d{3}', 'access.log') is not None 802491Szelenkov@nginx.com 812491Szelenkov@nginx.com 822491Szelenkov@nginx.comdef test_variables_method(search_in_file, wait_for_record): 832491Szelenkov@nginx.com set_format('$method') 842491Szelenkov@nginx.com 852491Szelenkov@nginx.com reg = r'^GET$' 862491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 872491Szelenkov@nginx.com assert client.get()['status'] == 200 882491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None, 'method GET' 892491Szelenkov@nginx.com 902491Szelenkov@nginx.com reg = r'^POST$' 912491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 922491Szelenkov@nginx.com assert client.post()['status'] == 200 932491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None, 'method POST' 942491Szelenkov@nginx.com 952491Szelenkov@nginx.com 962491Szelenkov@nginx.comdef test_variables_request_uri(search_in_file, wait_for_record): 972491Szelenkov@nginx.com set_format('$request_uri') 982491Szelenkov@nginx.com 992491Szelenkov@nginx.com def check_request_uri(req_uri): 1002491Szelenkov@nginx.com reg = fr'^{re.escape(req_uri)}$' 1012491Szelenkov@nginx.com 1022491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 1032491Szelenkov@nginx.com assert client.get(url=req_uri)['status'] == 200 1042491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 1052491Szelenkov@nginx.com 1062491Szelenkov@nginx.com check_request_uri('/3') 1072491Szelenkov@nginx.com check_request_uri('/4*') 1082491Szelenkov@nginx.com check_request_uri('/4%2A') 1092491Szelenkov@nginx.com check_request_uri('/9?q#a') 1102491Szelenkov@nginx.com 1112491Szelenkov@nginx.com 1122491Szelenkov@nginx.comdef test_variables_uri(search_in_file, wait_for_record): 1132491Szelenkov@nginx.com set_format('$uri') 1142491Szelenkov@nginx.com 1152491Szelenkov@nginx.com def check_uri(uri, expect=None): 1162491Szelenkov@nginx.com expect = uri if expect is None else expect 1172491Szelenkov@nginx.com reg = fr'^{re.escape(expect)}$' 1182491Szelenkov@nginx.com 1192491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 1202491Szelenkov@nginx.com assert client.get(url=uri)['status'] == 200 1212491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 1222491Szelenkov@nginx.com 1232491Szelenkov@nginx.com check_uri('/3') 1242491Szelenkov@nginx.com check_uri('/4*') 1252491Szelenkov@nginx.com check_uri('/5%2A', '/5*') 1262491Szelenkov@nginx.com check_uri('/9?q#a', '/9') 1272491Szelenkov@nginx.com 1282491Szelenkov@nginx.com 1292492Szelenkov@nginx.comdef test_variables_uri_no_cache(temp_dir): 130*2616Szelenkov@nginx.com Path(f'{temp_dir}/foo/bar').mkdir(parents=True) 131*2616Szelenkov@nginx.com Path(f'{temp_dir}/foo/bar/index.html').write_text('index', encoding='utf-8') 1322492Szelenkov@nginx.com 1332492Szelenkov@nginx.com assert 'success' in client.conf( 1342492Szelenkov@nginx.com { 1352592Szelenkov@nginx.com "listeners": {"*:8080": {"pass": "routes"}}, 1362492Szelenkov@nginx.com "routes": [ 1372492Szelenkov@nginx.com { 1382492Szelenkov@nginx.com "action": { 1392492Szelenkov@nginx.com "rewrite": "/foo${uri}/", 1402492Szelenkov@nginx.com "share": f'{temp_dir}$uri', 1412492Szelenkov@nginx.com } 1422492Szelenkov@nginx.com } 1432492Szelenkov@nginx.com ], 1442492Szelenkov@nginx.com } 1452492Szelenkov@nginx.com ) 1462492Szelenkov@nginx.com 1472492Szelenkov@nginx.com assert client.get(url='/bar')['status'] == 200 1482492Szelenkov@nginx.com 1492492Szelenkov@nginx.com 1502491Szelenkov@nginx.comdef test_variables_host(search_in_file, wait_for_record): 1512491Szelenkov@nginx.com set_format('$host') 1522491Szelenkov@nginx.com 1532491Szelenkov@nginx.com def check_host(host, expect=None): 1542491Szelenkov@nginx.com expect = host if expect is None else expect 1552491Szelenkov@nginx.com reg = fr'^{re.escape(expect)}$' 1562491Szelenkov@nginx.com 1572491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 1582491Szelenkov@nginx.com assert ( 1592491Szelenkov@nginx.com client.get(headers={'Host': host, 'Connection': 'close'})['status'] 1602491Szelenkov@nginx.com == 200 1612491Szelenkov@nginx.com ) 1622491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 1632491Szelenkov@nginx.com 1642491Szelenkov@nginx.com check_host('localhost') 1652491Szelenkov@nginx.com check_host('localhost1.', 'localhost1') 1662592Szelenkov@nginx.com check_host('localhost2:8080', 'localhost2') 1672491Szelenkov@nginx.com check_host('.localhost') 1682491Szelenkov@nginx.com check_host('www.localhost') 1692491Szelenkov@nginx.com 1702491Szelenkov@nginx.com 1712491Szelenkov@nginx.comdef test_variables_remote_addr(search_in_file, wait_for_record): 1722491Szelenkov@nginx.com set_format('$remote_addr') 1732491Szelenkov@nginx.com 1742491Szelenkov@nginx.com assert client.get()['status'] == 200 1752491Szelenkov@nginx.com assert wait_for_record(r'^127\.0\.0\.1$', 'access.log') is not None 1762491Szelenkov@nginx.com 1772491Szelenkov@nginx.com assert 'success' in client.conf( 1782592Szelenkov@nginx.com {"[::1]:8080": {"pass": "routes"}}, 'listeners' 1792491Szelenkov@nginx.com ) 1802491Szelenkov@nginx.com 1812491Szelenkov@nginx.com reg = r'^::1$' 1822491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 1832491Szelenkov@nginx.com assert client.get(sock_type='ipv6')['status'] == 200 1842491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 1852491Szelenkov@nginx.com 1862491Szelenkov@nginx.com 1872491Szelenkov@nginx.comdef test_variables_time_local( 1882491Szelenkov@nginx.com date_to_sec_epoch, search_in_file, wait_for_record 1892491Szelenkov@nginx.com): 1902491Szelenkov@nginx.com set_format('$uri $time_local $uri') 1912491Szelenkov@nginx.com 1922491Szelenkov@nginx.com assert search_in_file(r'/time_local', 'access.log') is None 1932491Szelenkov@nginx.com assert client.get(url='/time_local')['status'] == 200 1942491Szelenkov@nginx.com assert wait_for_record(r'/time_local', 'access.log') is not None, 'time log' 1952491Szelenkov@nginx.com date = search_in_file(r'^\/time_local (.*) \/time_local$', 'access.log')[1] 1962491Szelenkov@nginx.com assert ( 1972491Szelenkov@nginx.com abs( 1982491Szelenkov@nginx.com date_to_sec_epoch(date, '%d/%b/%Y:%X %z') 1992491Szelenkov@nginx.com - time.mktime(time.localtime()) 2002491Szelenkov@nginx.com ) 2012491Szelenkov@nginx.com < 5 2022491Szelenkov@nginx.com ), '$time_local' 2032491Szelenkov@nginx.com 2042491Szelenkov@nginx.com 2052491Szelenkov@nginx.comdef test_variables_request_line(search_in_file, wait_for_record): 2062491Szelenkov@nginx.com set_format('$request_line') 2072491Szelenkov@nginx.com 2082491Szelenkov@nginx.com reg = r'^GET \/r_line HTTP\/1\.1$' 2092491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 2102491Szelenkov@nginx.com assert client.get(url='/r_line')['status'] == 200 2112491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 2122491Szelenkov@nginx.com 2131567Szelenkov@nginx.com 2142590Szelenkov@nginx.comdef test_variables_request_id(search_in_file, wait_for_record, findall): 2152590Szelenkov@nginx.com set_format('$uri $request_id $request_id') 2162590Szelenkov@nginx.com 2172590Szelenkov@nginx.com assert search_in_file(r'/request_id', 'access.log') is None 2182590Szelenkov@nginx.com assert client.get(url='/request_id_1')['status'] == 200 2192590Szelenkov@nginx.com assert client.get(url='/request_id_2')['status'] == 200 2202590Szelenkov@nginx.com assert wait_for_record(r'/request_id_2', 'access.log') is not None 2212590Szelenkov@nginx.com 2222590Szelenkov@nginx.com id1 = findall( 2232590Szelenkov@nginx.com r'^\/request_id_1 ([0-9a-f]{32}) ([0-9a-f]{32})$', 'access.log' 2242590Szelenkov@nginx.com )[0] 2252590Szelenkov@nginx.com id2 = findall( 2262590Szelenkov@nginx.com r'^\/request_id_2 ([0-9a-f]{32}) ([0-9a-f]{32})$', 'access.log' 2272590Szelenkov@nginx.com )[0] 2282590Szelenkov@nginx.com 2292590Szelenkov@nginx.com assert id1[0] == id1[1], 'same ids first' 2302590Szelenkov@nginx.com assert id2[0] == id2[1], 'same ids second' 2312590Szelenkov@nginx.com assert id1[0] != id2[0], 'first id != second id' 2322590Szelenkov@nginx.com 2332590Szelenkov@nginx.com 2342491Szelenkov@nginx.comdef test_variables_status(search_in_file, wait_for_record): 2352491Szelenkov@nginx.com set_format('$status') 2362491Szelenkov@nginx.com 2372491Szelenkov@nginx.com assert 'success' in client.conf("418", 'routes/0/action/return') 2382491Szelenkov@nginx.com 2392491Szelenkov@nginx.com reg = r'^418$' 2402491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 2412491Szelenkov@nginx.com assert client.get()['status'] == 418 2422491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 2432491Szelenkov@nginx.com 2442491Szelenkov@nginx.com 2452491Szelenkov@nginx.comdef test_variables_header_referer(search_in_file, wait_for_record): 2462491Szelenkov@nginx.com set_format('$method $header_referer') 2472491Szelenkov@nginx.com 2482491Szelenkov@nginx.com def check_referer(referer): 2492491Szelenkov@nginx.com reg = fr'^GET {re.escape(referer)}$' 2502491Szelenkov@nginx.com 2512491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 2522491Szelenkov@nginx.com assert ( 2532491Szelenkov@nginx.com client.get( 2542491Szelenkov@nginx.com headers={ 2552491Szelenkov@nginx.com 'Host': 'localhost', 2562491Szelenkov@nginx.com 'Connection': 'close', 2572491Szelenkov@nginx.com 'Referer': referer, 2582491Szelenkov@nginx.com } 2592491Szelenkov@nginx.com )['status'] 2602491Szelenkov@nginx.com == 200 2612491Szelenkov@nginx.com ) 2622491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 2632491Szelenkov@nginx.com 2642491Szelenkov@nginx.com check_referer('referer-value') 2652491Szelenkov@nginx.com check_referer('') 2662491Szelenkov@nginx.com check_referer('no') 2672491Szelenkov@nginx.com 2682491Szelenkov@nginx.com 2692491Szelenkov@nginx.comdef test_variables_header_user_agent(search_in_file, wait_for_record): 2702491Szelenkov@nginx.com set_format('$method $header_user_agent') 2712491Szelenkov@nginx.com 2722491Szelenkov@nginx.com def check_user_agent(user_agent): 2732491Szelenkov@nginx.com reg = fr'^GET {re.escape(user_agent)}$' 2742491Szelenkov@nginx.com 2752491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 2762491Szelenkov@nginx.com assert ( 2772491Szelenkov@nginx.com client.get( 2782491Szelenkov@nginx.com headers={ 2792491Szelenkov@nginx.com 'Host': 'localhost', 2802491Szelenkov@nginx.com 'Connection': 'close', 2812491Szelenkov@nginx.com 'User-Agent': user_agent, 2822491Szelenkov@nginx.com } 2832491Szelenkov@nginx.com )['status'] 2842491Szelenkov@nginx.com == 200 2852491Szelenkov@nginx.com ) 2862491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 2872491Szelenkov@nginx.com 2882491Szelenkov@nginx.com check_user_agent('MSIE') 2892491Szelenkov@nginx.com check_user_agent('') 2902491Szelenkov@nginx.com check_user_agent('no') 2912491Szelenkov@nginx.com 2922491Szelenkov@nginx.com 2932491Szelenkov@nginx.comdef test_variables_many(search_in_file, wait_for_record): 2942491Szelenkov@nginx.com def check_vars(uri, expect): 2952491Szelenkov@nginx.com reg = fr'^{re.escape(expect)}$' 2962491Szelenkov@nginx.com 2972491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 2982491Szelenkov@nginx.com assert client.get(url=uri)['status'] == 200 2992491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 3002491Szelenkov@nginx.com 3012491Szelenkov@nginx.com set_format('$uri$method') 3022491Szelenkov@nginx.com check_vars('/1', '/1GET') 3032491Szelenkov@nginx.com 3042491Szelenkov@nginx.com set_format('${uri}${method}') 3052491Szelenkov@nginx.com check_vars('/2', '/2GET') 3062491Szelenkov@nginx.com 3072491Szelenkov@nginx.com set_format('${uri}$method') 3082491Szelenkov@nginx.com check_vars('/3', '/3GET') 3092491Szelenkov@nginx.com 3102491Szelenkov@nginx.com set_format('$method$method') 3112491Szelenkov@nginx.com check_vars('/', 'GETGET') 3122491Szelenkov@nginx.com 3132491Szelenkov@nginx.com 3142491Szelenkov@nginx.comdef test_variables_dynamic(wait_for_record): 3152491Szelenkov@nginx.com set_format('$header_foo$cookie_foo$arg_foo') 3162491Szelenkov@nginx.com 3172491Szelenkov@nginx.com assert ( 3182491Szelenkov@nginx.com client.get( 3192491Szelenkov@nginx.com url='/?foo=h', 3202491Szelenkov@nginx.com headers={'Foo': 'b', 'Cookie': 'foo=la', 'Connection': 'close'}, 3212491Szelenkov@nginx.com )['status'] 3222491Szelenkov@nginx.com == 200 3232491Szelenkov@nginx.com ) 3242491Szelenkov@nginx.com assert wait_for_record(r'^blah$', 'access.log') is not None 3252491Szelenkov@nginx.com 3262491Szelenkov@nginx.com 3272491Szelenkov@nginx.comdef test_variables_dynamic_arguments(search_in_file, wait_for_record): 3282491Szelenkov@nginx.com def check_arg(url, expect=None): 3292491Szelenkov@nginx.com expect = url if expect is None else expect 3302491Szelenkov@nginx.com reg = fr'^{re.escape(expect)}$' 3312491Szelenkov@nginx.com 3322491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 3332491Szelenkov@nginx.com assert client.get(url=url)['status'] == 200 3342491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 3352491Szelenkov@nginx.com 3362491Szelenkov@nginx.com def check_no_arg(url): 3372491Szelenkov@nginx.com assert client.get(url=url)['status'] == 200 3382491Szelenkov@nginx.com assert search_in_file(r'^0$', 'access.log') is None 3392491Szelenkov@nginx.com 3402491Szelenkov@nginx.com set_format('$arg_foo_bar') 3412491Szelenkov@nginx.com check_arg('/?foo_bar=1', '1') 3422491Szelenkov@nginx.com check_arg('/?foo_b%61r=2', '2') 3432491Szelenkov@nginx.com check_arg('/?bar&foo_bar=3&foo', '3') 3442491Szelenkov@nginx.com check_arg('/?foo_bar=l&foo_bar=4', '4') 3452491Szelenkov@nginx.com check_no_arg('/') 3462491Szelenkov@nginx.com check_no_arg('/?foo_bar=') 3472491Szelenkov@nginx.com check_no_arg('/?Foo_bar=0') 3482491Szelenkov@nginx.com check_no_arg('/?foo-bar=0') 3492491Szelenkov@nginx.com check_no_arg('/?foo_bar=0&foo_bar=l') 3502491Szelenkov@nginx.com 3512491Szelenkov@nginx.com set_format('$arg_foo_b%61r') 3522491Szelenkov@nginx.com check_no_arg('/?foo_b=0') 3532491Szelenkov@nginx.com check_no_arg('/?foo_bar=0') 3542491Szelenkov@nginx.com 3552491Szelenkov@nginx.com set_format('$arg_f!~') 3562491Szelenkov@nginx.com check_no_arg('/?f=0') 3572491Szelenkov@nginx.com check_no_arg('/?f!~=0') 3582491Szelenkov@nginx.com 3592491Szelenkov@nginx.com 3602491Szelenkov@nginx.comdef test_variables_dynamic_headers(search_in_file, wait_for_record): 3612491Szelenkov@nginx.com def check_header(header, value): 3622491Szelenkov@nginx.com reg = fr'^{value}$' 3632491Szelenkov@nginx.com 3642491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 3652491Szelenkov@nginx.com assert ( 3662491Szelenkov@nginx.com client.get(headers={header: value, 'Connection': 'close'})['status'] 3672491Szelenkov@nginx.com == 200 3682491Szelenkov@nginx.com ) 3692491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 3702491Szelenkov@nginx.com 3712491Szelenkov@nginx.com def check_no_header(header): 3722491Szelenkov@nginx.com assert ( 3732491Szelenkov@nginx.com client.get(headers={header: '0', 'Connection': 'close'})['status'] 3742491Szelenkov@nginx.com == 200 3752491Szelenkov@nginx.com ) 3762491Szelenkov@nginx.com assert search_in_file(r'^0$', 'access.log') is None 3772491Szelenkov@nginx.com 3782491Szelenkov@nginx.com set_format('$header_foo_bar') 3792491Szelenkov@nginx.com check_header('foo-bar', '1') 3802491Szelenkov@nginx.com check_header('Foo-Bar', '2') 3812491Szelenkov@nginx.com check_no_header('foo_bar') 3822491Szelenkov@nginx.com check_no_header('foobar') 3832491Szelenkov@nginx.com 3842491Szelenkov@nginx.com set_format('$header_Foo_Bar') 3852491Szelenkov@nginx.com check_header('Foo-Bar', '4') 3862491Szelenkov@nginx.com check_header('foo-bar', '5') 3872491Szelenkov@nginx.com check_no_header('foo_bar') 3882491Szelenkov@nginx.com check_no_header('foobar') 3892491Szelenkov@nginx.com 3902491Szelenkov@nginx.com 3912491Szelenkov@nginx.comdef test_variables_dynamic_cookies(search_in_file, wait_for_record): 3922491Szelenkov@nginx.com def check_no_cookie(cookie): 3932491Szelenkov@nginx.com assert ( 3942491Szelenkov@nginx.com client.get( 3952491Szelenkov@nginx.com headers={ 3962491Szelenkov@nginx.com 'Host': 'localhost', 3972491Szelenkov@nginx.com 'Cookie': cookie, 3982491Szelenkov@nginx.com 'Connection': 'close', 3992491Szelenkov@nginx.com }, 4002491Szelenkov@nginx.com )['status'] 4012491Szelenkov@nginx.com == 200 4022491Szelenkov@nginx.com ) 4032491Szelenkov@nginx.com assert search_in_file(r'^0$', 'access.log') is None 4042491Szelenkov@nginx.com 4052491Szelenkov@nginx.com set_format('$cookie_foo_bar') 4062491Szelenkov@nginx.com 4072491Szelenkov@nginx.com reg = r'^1$' 4082491Szelenkov@nginx.com assert search_in_file(reg, 'access.log') is None 4092491Szelenkov@nginx.com assert ( 4102491Szelenkov@nginx.com client.get( 4112491Szelenkov@nginx.com headers={ 4122491Szelenkov@nginx.com 'Host': 'localhost', 4132491Szelenkov@nginx.com 'Cookie': 'foo_bar=1', 4142491Szelenkov@nginx.com 'Connection': 'close', 4152491Szelenkov@nginx.com }, 4162491Szelenkov@nginx.com )['status'] 4172491Szelenkov@nginx.com == 200 4182491Szelenkov@nginx.com ) 4192491Szelenkov@nginx.com assert wait_for_record(reg, 'access.log') is not None 4202491Szelenkov@nginx.com 4212491Szelenkov@nginx.com check_no_cookie('fOo_bar=0') 4222491Szelenkov@nginx.com check_no_cookie('foo_bar=') 4232491Szelenkov@nginx.com 4242491Szelenkov@nginx.com 4252506Szelenkov@nginx.comdef test_variables_response_header(temp_dir, wait_for_record): 4262506Szelenkov@nginx.com # If response has two headers with the same name then first value 4272506Szelenkov@nginx.com # will be stored in variable. 4282506Szelenkov@nginx.com # $response_header_transfer_encoding value can be 'chunked' or null only. 4292506Szelenkov@nginx.com 4302506Szelenkov@nginx.com # return 4312506Szelenkov@nginx.com 4322506Szelenkov@nginx.com set_format( 4332506Szelenkov@nginx.com 'return@$response_header_server@$response_header_date@' 4342506Szelenkov@nginx.com '$response_header_content_length@$response_header_connection' 4352506Szelenkov@nginx.com ) 4362506Szelenkov@nginx.com 4372506Szelenkov@nginx.com assert client.get()['status'] == 200 4382506Szelenkov@nginx.com assert ( 4392506Szelenkov@nginx.com wait_for_record(r'return@Unit/.*@.*GMT@0@close', 'access.log') 4402506Szelenkov@nginx.com is not None 4412506Szelenkov@nginx.com ) 4422506Szelenkov@nginx.com 4432506Szelenkov@nginx.com # share 4442506Szelenkov@nginx.com 4452506Szelenkov@nginx.com Path(f'{temp_dir}/foo').mkdir() 446*2616Szelenkov@nginx.com Path(f'{temp_dir}/foo/index.html').write_text('index', encoding='utf-8') 4472506Szelenkov@nginx.com 4482506Szelenkov@nginx.com assert 'success' in client.conf( 4492506Szelenkov@nginx.com { 4502592Szelenkov@nginx.com "listeners": {"*:8080": {"pass": "routes"}}, 4512506Szelenkov@nginx.com "routes": [ 4522506Szelenkov@nginx.com { 4532506Szelenkov@nginx.com "action": { 4542506Szelenkov@nginx.com "share": f'{temp_dir}$uri', 4552506Szelenkov@nginx.com } 4562506Szelenkov@nginx.com } 4572506Szelenkov@nginx.com ], 4582506Szelenkov@nginx.com } 4592506Szelenkov@nginx.com ) 4602506Szelenkov@nginx.com 4612506Szelenkov@nginx.com set_format( 4622506Szelenkov@nginx.com 'share@$response_header_last_modified@$response_header_etag@' 4632506Szelenkov@nginx.com '$response_header_content_type@$response_header_server@' 4642506Szelenkov@nginx.com '$response_header_date@$response_header_content_length@' 4652506Szelenkov@nginx.com '$response_header_connection' 4662506Szelenkov@nginx.com ) 4672506Szelenkov@nginx.com 4682506Szelenkov@nginx.com assert client.get(url='/foo/index.html')['status'] == 200 4692506Szelenkov@nginx.com assert ( 4702506Szelenkov@nginx.com wait_for_record( 4712506Szelenkov@nginx.com r'share@.*GMT@".*"@text/html@Unit/.*@.*GMT@5@close', 'access.log' 4722506Szelenkov@nginx.com ) 4732506Szelenkov@nginx.com is not None 4742506Szelenkov@nginx.com ) 4752506Szelenkov@nginx.com 4762506Szelenkov@nginx.com # redirect 4772506Szelenkov@nginx.com 4782506Szelenkov@nginx.com set_format( 4792506Szelenkov@nginx.com 'redirect@$response_header_location@$response_header_server@' 4802506Szelenkov@nginx.com '$response_header_date@$response_header_content_length@' 4812506Szelenkov@nginx.com '$response_header_connection' 4822506Szelenkov@nginx.com ) 4832506Szelenkov@nginx.com 4842506Szelenkov@nginx.com assert client.get(url='/foo')['status'] == 301 4852506Szelenkov@nginx.com assert ( 4862506Szelenkov@nginx.com wait_for_record(r'redirect@/foo/@Unit/.*@.*GMT@0@close', 'access.log') 4872506Szelenkov@nginx.com is not None 4882506Szelenkov@nginx.com ) 4892506Szelenkov@nginx.com 4902506Szelenkov@nginx.com # error 4912506Szelenkov@nginx.com 4922506Szelenkov@nginx.com set_format( 4932506Szelenkov@nginx.com 'error@$response_header_content_type@$response_header_server@' 4942506Szelenkov@nginx.com '$response_header_date@$response_header_content_length@' 4952506Szelenkov@nginx.com '$response_header_connection' 4962506Szelenkov@nginx.com ) 4972506Szelenkov@nginx.com 4982506Szelenkov@nginx.com assert client.get(url='/blah')['status'] == 404 4992506Szelenkov@nginx.com assert ( 5002506Szelenkov@nginx.com wait_for_record(r'error@text/html@Unit/.*@.*GMT@54@close', 'access.log') 5012506Szelenkov@nginx.com is not None 5022506Szelenkov@nginx.com ) 5032506Szelenkov@nginx.com 5042506Szelenkov@nginx.com 5052506Szelenkov@nginx.comdef test_variables_response_header_application(require, wait_for_record): 5062506Szelenkov@nginx.com require({'modules': {'python': 'any'}}) 5072506Szelenkov@nginx.com 5082506Szelenkov@nginx.com client_python.load('chunked') 5092506Szelenkov@nginx.com 5102506Szelenkov@nginx.com set_format('$uri@$response_header_transfer_encoding') 5112506Szelenkov@nginx.com 5122506Szelenkov@nginx.com assert client_python.get(url='/1')['status'] == 200 5132506Szelenkov@nginx.com assert wait_for_record(r'/1@chunked', 'access.log') is not None 5142506Szelenkov@nginx.com 5152506Szelenkov@nginx.com 5162491Szelenkov@nginx.comdef test_variables_invalid(temp_dir): 517*2616Szelenkov@nginx.com def check_variables(log_format): 5182491Szelenkov@nginx.com assert 'error' in client.conf( 5191596Szelenkov@nginx.com { 5202491Szelenkov@nginx.com 'path': f'{temp_dir}/access.log', 521*2616Szelenkov@nginx.com 'format': log_format, 5222213Szelenkov@nginx.com }, 5232213Szelenkov@nginx.com 'access_log', 5242213Szelenkov@nginx.com ), 'access_log format' 5251567Szelenkov@nginx.com 5262491Szelenkov@nginx.com check_variables("$") 5272491Szelenkov@nginx.com check_variables("${") 5282491Szelenkov@nginx.com check_variables("${}") 5292491Szelenkov@nginx.com check_variables("$ur") 5302491Szelenkov@nginx.com check_variables("$uri$$host") 5312491Szelenkov@nginx.com check_variables("$uriblah") 5322491Szelenkov@nginx.com check_variables("${uri") 5332491Szelenkov@nginx.com check_variables("${{uri}") 5342491Szelenkov@nginx.com check_variables("$ar") 5352491Szelenkov@nginx.com check_variables("$arg") 5362491Szelenkov@nginx.com check_variables("$arg_") 5372491Szelenkov@nginx.com check_variables("$cookie") 5382491Szelenkov@nginx.com check_variables("$cookie_") 5392491Szelenkov@nginx.com check_variables("$header") 5402491Szelenkov@nginx.com check_variables("$header_") 541