ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
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);
 


 




Copyright © Lexa Software, 1996-2009.