清漆:regsuball 有什么作用?
Varnish: what does regsuball do?
我发现的关于 regsuball 的所有信息 - 它是来自文档的描述:https://book.varnish-software.com/3.0/VCL_Basics.html#vcl-functions。但我仍然不清楚 regsuball 函数内部发生了什么。传递的参数(str、regex、sub)如何使用?有没有在线测试regsuball功能的沙箱?谢谢!
语法
regsuball()
函数将对字符串执行正则表达式匹配,并将所有匹配项替换为另一个模式。
regsuball(string, regex, sub)
string
参数是您的输入。
regex
参数是您用来匹配您在输入字符串中查找的内容的正则表达式。
sub
参数是输入字符串将被替换的内容。
例子
以下示例将查找名为 original-cookie-123
的 cookie,其中数字后缀可以是任何数字。它用 modified-cookie-123
:
代替
regsuball(req.http.Cookie, "original-cookie-([0-9+])", "modified-cookie-");
想象一下,将以下 cookie 传递给 Varnish:
Cookie: a=1; b=2; original-cookie-1=bla; c=3; original-cookie-2=test
find/replace 之后的结果将是:
Cookie: a=1; b=2; modified-cookie-1=bla; c=3; modified-cookie-2=test
Whereas regsub()
matches and replaces the first occurrence of the pattern, regsuball()
replaces all occurrences.
沙盒
如果您想在沙盒中测试 regsuball()
,最简单的方法是在测试用例上 运行ning varnishtest
。这是一个例子:
varnishtest "Regsuball sandbox"
varnish v1 -vcl+backend {
vcl 4.1;
backend default none;
sub vcl_recv {
if (req.http.Cookie) {
set req.http.Cookie = regsuball(req.http.Cookie, "original-cookie-([0-9+])", "modified-cookie-");
return (synth(200, req.http.Cookie));
}
return (synth(400, "No cookie found"));
}
sub vcl_synth {
set resp.http.Content-Type = "text/plain; charset=utf-8";
set resp.body = req.http.Cookie;
return (deliver);
}
} -start
client c1 {
txreq -hdr "Cookie: a=1; b=2; original-cookie-1=bla; c=3; original-cookie-2=test"
rxresp
expect resp.body == "a=1; b=2; modified-cookie-1=bla; c=3; modified-cookie-2=test"
} -run
此测试用例使用了前面提到的确切示例。查找替换后,本测试用例中的VCL代码将综合return结果值作为输出。无需后端服务器,所有输出均由 VCL 代码生成。
运行 测试用例,假设它存储在 test.vtc
中,可以使用以下命令完成:
varnishtest test.vtc
您还可以 运行 此测试用例隔离在 Docker 容器中。只需 运行 以下命令 bootstrap Varnish Docker 容器和 运行 测试:
docker run --rm --name varnishtest -v $(pwd)/test.vtc:/etc/varnish/test.vtc varnish:stable varnishtest /etc/varnish/test.vtc
我发现的关于 regsuball 的所有信息 - 它是来自文档的描述:https://book.varnish-software.com/3.0/VCL_Basics.html#vcl-functions。但我仍然不清楚 regsuball 函数内部发生了什么。传递的参数(str、regex、sub)如何使用?有没有在线测试regsuball功能的沙箱?谢谢!
语法
regsuball()
函数将对字符串执行正则表达式匹配,并将所有匹配项替换为另一个模式。
regsuball(string, regex, sub)
string
参数是您的输入。regex
参数是您用来匹配您在输入字符串中查找的内容的正则表达式。sub
参数是输入字符串将被替换的内容。
例子
以下示例将查找名为 original-cookie-123
的 cookie,其中数字后缀可以是任何数字。它用 modified-cookie-123
:
regsuball(req.http.Cookie, "original-cookie-([0-9+])", "modified-cookie-");
想象一下,将以下 cookie 传递给 Varnish:
Cookie: a=1; b=2; original-cookie-1=bla; c=3; original-cookie-2=test
find/replace 之后的结果将是:
Cookie: a=1; b=2; modified-cookie-1=bla; c=3; modified-cookie-2=test
Whereas
regsub()
matches and replaces the first occurrence of the pattern,regsuball()
replaces all occurrences.
沙盒
如果您想在沙盒中测试 regsuball()
,最简单的方法是在测试用例上 运行ning varnishtest
。这是一个例子:
varnishtest "Regsuball sandbox"
varnish v1 -vcl+backend {
vcl 4.1;
backend default none;
sub vcl_recv {
if (req.http.Cookie) {
set req.http.Cookie = regsuball(req.http.Cookie, "original-cookie-([0-9+])", "modified-cookie-");
return (synth(200, req.http.Cookie));
}
return (synth(400, "No cookie found"));
}
sub vcl_synth {
set resp.http.Content-Type = "text/plain; charset=utf-8";
set resp.body = req.http.Cookie;
return (deliver);
}
} -start
client c1 {
txreq -hdr "Cookie: a=1; b=2; original-cookie-1=bla; c=3; original-cookie-2=test"
rxresp
expect resp.body == "a=1; b=2; modified-cookie-1=bla; c=3; modified-cookie-2=test"
} -run
此测试用例使用了前面提到的确切示例。查找替换后,本测试用例中的VCL代码将综合return结果值作为输出。无需后端服务器,所有输出均由 VCL 代码生成。
运行 测试用例,假设它存储在 test.vtc
中,可以使用以下命令完成:
varnishtest test.vtc
您还可以 运行 此测试用例隔离在 Docker 容器中。只需 运行 以下命令 bootstrap Varnish Docker 容器和 运行 测试:
docker run --rm --name varnishtest -v $(pwd)/test.vtc:/etc/varnish/test.vtc varnish:stable varnishtest /etc/varnish/test.vtc