nginx-0.3.22-RELEASE import

    *) Feature: the ngx_http_perl_module supports the $r->args and
       $r->unescape methods.

    *) Feature: the method $r->query_string of ngx_http_perl_module was
       canceled.

    *) Bugfix: segmentation fault was occurred if the "none" or "blocked"
       values was specified in the "valid_referers" directive; the bug had
       appeared in 0.3.18.
diff --git a/src/http/modules/ngx_http_referer_module.c b/src/http/modules/ngx_http_referer_module.c
index 0d3ee6f..459984e 100644
--- a/src/http/modules/ngx_http_referer_module.c
+++ b/src/http/modules/ngx_http_referer_module.c
@@ -90,10 +90,7 @@
 
     rlcf = ngx_http_get_module_loc_conf(r, ngx_http_referer_module);
 
-    if (rlcf->hash.buckets == NULL
-        && rlcf->dns_wildcards == NULL
-        && rlcf->dns_wildcards->hash.buckets == NULL)
-    {
+    if (rlcf->hash.buckets == NULL && rlcf->dns_wildcards == NULL) {
         goto valid;
     }
 
@@ -145,7 +142,7 @@
         }
     }
 
-    if (rlcf->dns_wildcards && rlcf->dns_wildcards->hash.buckets) {
+    if (rlcf->dns_wildcards) {
         uri = ngx_hash_find_wildcard(rlcf->dns_wildcards, buf, len);
         if (uri) {
             goto uri;
diff --git a/src/http/modules/perl/nginx.pm b/src/http/modules/perl/nginx.pm
index 66ff64f..c0f3f27 100644
--- a/src/http/modules/perl/nginx.pm
+++ b/src/http/modules/perl/nginx.pm
@@ -17,7 +17,7 @@
     HTTP_SERVER_ERROR
 );
 
-our $VERSION = '0.3.21';
+our $VERSION = '0.3.22';
 
 require XSLoader;
 XSLoader::load('nginx', $VERSION);
@@ -48,11 +48,6 @@
 
 This module provides a Perl interface to the nginx HTTP server API.
 
-=head2 EXPORT
-
-None by default.
-
-
 
 =head1 SEE ALSO
 
diff --git a/src/http/modules/perl/nginx.xs b/src/http/modules/perl/nginx.xs
index 21d2deb..d41bf68 100644
--- a/src/http/modules/perl/nginx.xs
+++ b/src/http/modules/perl/nginx.xs
@@ -156,13 +156,13 @@
 
 
 char *
-query_string(r, ...)
+args(r, ...)
     nginx  r
 
     CODE:
 
     if (items != 1) {
-        croak("$r->query_string(text) is not implemented");
+        croak("$r->args(text) is not implemented");
     }
 
     RETVAL = ngx_palloc(r->pool, r->args.len + 1);
@@ -360,6 +360,9 @@
             b->start = p;
             b->end = b->last;
 
+            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                           "$r->print: read-only SV: %z", len);
+
             goto out;
         }
     }
@@ -374,12 +377,11 @@
             sv = SvRV(sv);
         }
 
-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                       "SV: %p %d %Xd",
-                       sv, SvREFCNT(sv), SvREADONLY(sv));
-
         (void) SvPV(sv, len);
 
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                       "$r->print: copy SV: %z", len);
+
         size += len;
     }
 
@@ -513,6 +515,8 @@
 
     b->flush = 1;
 
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "$r->rflush");
+
     RETVAL = ngx_http_perl_output(r, b);
 
     done:
@@ -549,3 +553,34 @@
             XSRETURN_EMPTY;
         }
     }
+
+
+char *
+unescape(r, text, type = 0)
+    nginx    r
+    SV      *text
+    int      type
+
+    PREINIT:
+
+    u_char  *p, *dst, *src;
+    STRLEN   n;
+
+    CODE:
+
+    src = (u_char *) SvPV(text, n);
+
+    p = ngx_palloc(r->pool, n + 1);
+    if (p == NULL) {
+        XSRETURN_UNDEF;
+    }
+
+    dst = p;
+
+    ngx_unescape_uri(&dst, &src, n, (ngx_uint_t) type);
+    *dst = '\0';
+
+    RETVAL = (char *) p;
+
+    OUTPUT:
+    RETVAL
diff --git a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c
index 4986675..b46c9bb 100644
--- a/src/http/ngx_http_script.c
+++ b/src/http/ngx_http_script.c
@@ -682,7 +682,7 @@
         dst = e->buf.data;
         src = e->buf.data;
 
-        ngx_unescape_uri(&dst, &src, e->pos - e->buf.data);
+        ngx_unescape_uri(&dst, &src, e->pos - e->buf.data, NGX_UNESCAPE_URI);
 
         if (src < e->pos) {
             dst = ngx_copy(dst, src, e->pos - src);