Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: regexp после regexp в perl
On Thu, Nov 29, 2007 at 10:45:11AM +0300, Domrachev Ivan wrote:
> если cделать внутри perl_module один regexp, потом использовать
> результат $1 (именно без кавычек), а затем второй регексп, то или
> просто теряются переменные или вылазит мусор в переменных.
> если заменить $1 на "$1", то всё работает нормально.
> не знаю баг это или особенность.
>
> более подробно:
> ---
> http {
> include mime.types;
> default_type text/html;
>
> perl_modules /usr/local/nginx/perl;
> perl_require /usr/local/nginx/conf/test.pm;
> perl_set $test test::simple;
>
> server {
> server_name 127.0.0.1;
> listen 127.0.0.1:202;
> root /home2/;
> location / {
> add_header test_result $test;
> }
> }
> }
> ---
> package test;
> use nginx;
> sub simple {
> my $r=shift;
> my $uri=$r->uri;
>
> if($uri=~/(...)(...)/){
> $r->header_out("test_s1",$1);
> $r->header_out("test_s2",$2);
> }
> if($uri=~/(..)(..)/){
> $r->header_out("test_s3",$1);
> $r->header_out("test_s4",$2);
> }
> return 1;
> }
> 1;
> __END__
> ---
>
> в таком варианте получается:
> ---
> $ wget -S http://127.0.0.1:202/1234test.html
> --07:18:08-- http://127.0.0.1:202/1234test.html
> => `1234test.html'
> Connecting to 127.0.0.1:202... connected.
> HTTP request sent, awaiting response...
> HTTP/1.1 200 OK
> Server: nginx/0.6.17
> Date: Thu, 29 Nov 2007 07:18:08 GMT
> Content-Type: text/html
> Content-Length: 2
> Last-Modified: Thu, 29 Nov 2007 07:12:17 GMT
> Connection: keep-alive
> test_s1: /1
> Length: 2 [text/html]
> ...
> ---
> т.е. просто НЕ добавила хеадеры, если трогать регулярные
> выражения, то могут появиться переменные и мусор в них.
> если поменять $1 на "$1" и соответственно $2 на "$2", то:
> ---
> $ wget -S http://127.0.0.1:202/1234test.html
> --07:20:55-- http://127.0.0.1:202/1234test.html
> => `1234test.html'
> Connecting to 127.0.0.1:202... connected.
> HTTP request sent, awaiting response...
> HTTP/1.1 200 OK
> Server: nginx/0.6.17
> Date: Thu, 29 Nov 2007 07:20:55 GMT
> Content-Type: text/html
> Content-Length: 2
> Last-Modified: Thu, 29 Nov 2007 07:12:17 GMT
> Connection: keep-alive
> test_s1: /12
> test_s2: 34t
> test_s3: /1
> test_s4: 23
> test_result: 1
> Accept-Ranges: bytes
> Length: 2 [text/html]
> ---
> т.е. как надо.
Прилагаемый патч должен помочь.
--
Игорь Сысоев
http://sysoev.ru
Index: src/http/modules/perl/nginx.xs
===================================================================
--- src/http/modules/perl/nginx.xs (revision 1022)
+++ src/http/modules/perl/nginx.xs (working copy)
@@ -42,8 +42,12 @@
s->len = len;
- if (SvREADONLY(sv)) {
+ if (SvREADONLY(sv) && SvPOK(sv)) {
s->data = p;
+
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "perl sv2str: %08XD \"%V\"", sv->sv_flags, s);
+
return NGX_OK;
}
@@ -54,6 +58,9 @@
ngx_memcpy(s->data, p, len);
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "perl sv2str: %08XD \"%V\"", sv->sv_flags, s);
+
return NGX_OK;
}
@@ -532,7 +539,7 @@
sv = SvRV(sv);
}
- if (SvREADONLY(sv)) {
+ if (SvREADONLY(sv) && SvPOK(sv)) {
p = (u_char *) SvPV(sv, len);
|