[nginx-tests] Tests: added tests for named captures.
Maxim Dounin
mdounin at mdounin.ru
Mon Jun 8 14:59:29 UTC 2026
details: http://freenginx.org/hg/nginx-tests/rev/66fec8afee89
branches:
changeset: 2067:66fec8afee89
user: Maxim Dounin <mdounin at mdounin.ru>
date: Mon Jun 08 17:58:06 2026 +0300
description:
Tests: added tests for named captures.
diffstat:
rewrite_named_captures.t | 113 +++++++++++++++++++++++++++++++++++++++
stream_named_captures.t | 135 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 248 insertions(+), 0 deletions(-)
diffs (258 lines):
diff --git a/rewrite_named_captures.t b/rewrite_named_captures.t
new file mode 100644
--- /dev/null
+++ b/rewrite_named_captures.t
@@ -0,0 +1,113 @@
+#!/usr/bin/perl
+
+# (C) Maxim Dounin
+
+# Tests for rewrite module, named captures.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use Test::More;
+use Socket qw/ CRLF /;
+
+BEGIN { use FindBin; chdir($FindBin::Bin); }
+
+use lib 'lib';
+use Test::Nginx;
+
+###############################################################################
+
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+my $t = Test::Nginx->new()->has(qw/http rewrite map/)->plan(6)
+ ->write_file_expand('nginx.conf', <<'EOF');
+
+%%TEST_GLOBALS%%
+
+daemon off;
+
+events {
+}
+
+http {
+ %%TEST_GLOBALS_HTTP%%
+
+ map $uri $map {
+ default map;
+ }
+
+ server {
+ listen 127.0.0.1:8080;
+ server_name localhost;
+
+ location /map {
+ return 200 "value: $map\n";
+ }
+
+ location /map/rewrite {
+ rewrite ^(?<map>.*) /;
+ return 200 "value: $map\n";
+ }
+
+ location /later {
+ return 200 "value: $late\n";
+ }
+
+ location /later/rewrite {
+ rewrite ^(?<late>.*) /;
+ return 200 "value: $late\n";
+ }
+
+ location /prefix {
+ return 200 "value: $arg_foo\n";
+ }
+
+ location /prefix/rewrite {
+ rewrite ^(?<arg_foo>.*) /;
+ return 200 "value: $arg_foo\n";
+ }
+ }
+
+ map $uri $late {
+ default map;
+ }
+}
+
+EOF
+
+$t->run();
+
+###############################################################################
+
+# named captures used to override the v->get_handler if it was previously
+# set by a changeable variable, such as provided by map, and did not use
+# the NGX_HTTP_VAR_WEAK flag, thus overriding corresponding prefix variables
+
+TODO: {
+local $TODO = 'not yet' unless $t->has_version('1.31.3');
+
+like(http_get('/map'), qr!value: map!, 'value from map');
+
+}
+
+like(http_get('/map/rewrite'), qr!value: /map/rewrite!,
+ 'value from capture overrides map');
+
+like(http_get('/later'), qr!value: map!, 'value from later map');
+like(http_get('/later/rewrite'), qr!value: /later/rewrite!,
+ 'value from capture overrides later map');
+
+TODO: {
+local $TODO = 'not yet' unless $t->has_version('1.31.3');
+
+like(http_get('/prefix?foo=arg'), qr!value: arg!, 'value from arg');
+
+}
+
+like(http_get('/prefix/rewrite?foo=arg'), qr!value: /prefix/rewrite!,
+ 'value from capture overrides arg');
+
+###############################################################################
diff --git a/stream_named_captures.t b/stream_named_captures.t
new file mode 100644
--- /dev/null
+++ b/stream_named_captures.t
@@ -0,0 +1,135 @@
+#!/usr/bin/perl
+
+# (C) Maxim Dounin
+
+# Tests for stream named captures.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use Test::More;
+
+BEGIN { use FindBin; chdir($FindBin::Bin); }
+
+use lib 'lib';
+use Test::Nginx;
+use Test::Nginx::Stream qw/ stream /;
+
+###############################################################################
+
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+my $t = Test::Nginx->new()
+ ->has(qw/stream stream_return stream_map http rewrite/)
+ ->plan(6);
+
+$t->write_file_expand('nginx.conf', <<'EOF');
+
+%%TEST_GLOBALS%%
+
+daemon off;
+
+events {
+}
+
+stream {
+ %%TEST_GLOBALS_STREAM%%
+
+ map 0 $map {
+ default map;
+ }
+
+ map 0 $capture {
+ ~(?<map>.*) $map;
+ }
+
+ map 0 $capture_late {
+ ~(?<late>.*) $late;
+ }
+
+ map 0 $late {
+ default map;
+ }
+
+ map 0 $capture_prefix {
+ ~(?<proxy_protocol_tlv_0x01>.*) $proxy_protocol_tlv_0x01;
+ }
+
+ server {
+ listen 127.0.0.1:8090;
+ return $map;
+ }
+
+ server {
+ listen 127.0.0.1:8091;
+ return $capture;
+ }
+
+ server {
+ listen 127.0.0.1:8092;
+ return $late;
+ }
+
+ server {
+ listen 127.0.0.1:8093;
+ return $capture_late;
+ }
+
+ server {
+ listen 127.0.0.1:8094 proxy_protocol;
+ return $proxy_protocol_tlv_0x01;
+ }
+
+ server {
+ listen 127.0.0.1:8095 proxy_protocol;
+ return $capture_prefix;
+ }
+}
+
+EOF
+
+$t->run();
+
+###############################################################################
+
+# named captures used to override the v->get_handler if it was previously
+# set by a changeable variable, such as provided by map, and did not use
+# the NGX_HTTP_VAR_WEAK flag, thus overriding corresponding prefix variables
+
+TODO: {
+local $TODO = 'not yet' unless $t->has_version('1.31.3');
+
+is(stream('127.0.0.1:' . port(8090))->read(), 'map', 'value from map');
+
+}
+
+is(stream('127.0.0.1:' . port(8091))->read(), '0',
+ 'value from capture overrides map');
+
+is(stream('127.0.0.1:' . port(8092))->read(), 'map', 'value from later map');
+is(stream('127.0.0.1:' . port(8093))->read(), '0',
+ 'value from capture overrides later map');
+
+my $pp = "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A"
+ . "\x21"
+ . "\x11"
+ . "\x00\x12"
+ . "\x00\x00\x00\x00"
+ . "\x00\x00\x00\x00"
+ . "\x00\x00\x00\x00"
+ . "\x01\x00\x03tlv";
+
+TODO: {
+local $TODO = 'not yet' unless $t->has_version('1.31.3');
+
+is(stream('127.0.0.1:' . port(8094))->io($pp), 'tlv', 'value from tlv');
+
+}
+
+is(stream('127.0.0.1:' . port(8095))->io($pp), '0',
+ 'value from capture overrides tlv');
+
+###############################################################################
More information about the nginx-devel
mailing list