diff src/http/modules/perl/ngx_http_perl_module.c @ 366:babd3d9efb62 NGINX_0_6_27

nginx 0.6.27 *) Change: now by default the rtsig method is not built on Linux 2.6.18+. *) Change: now a request method is not changed while redirection to a named location via an "error_page" directive. *) Feature: the "resolver" and "resolver_timeout" directives in SMTP proxy. *) Feature: the "post_action" directive supports named locations. *) Bugfix: a segmentation fault occurred in worker process, if a request was redirected from proxy, FastCGI, or memcached location to static named locations. *) Bugfix: browsers did not repeat SSL handshake if there is no valid client certificate in first handshake. Thanks to Alexander V. Inyukhin. *) Bugfix: if response code 495-497 was redirected via an "error_page" directive without code change, then nginx tried to allocate too many memory. *) Bugfix: memory leak in long-lived non buffered connections. *) Bugfix: memory leak in resolver. *) Bugfix: a segmentation fault occurred in worker process, if a request was redirected from proxy, FastCGI, or memcached location to static named locations. *) Bugfix: in the $proxy_host and $proxy_port variables caching. Thanks to Sergey Bochenkov. *) Bugfix: a "proxy_pass" directive with variables used incorrectly the same port as in another "proxy_pass" directive with the same host name and without variables. Thanks to Sergey Bochenkov. *) Bugfix: an alert "sendmsg() failed (9: Bad file descriptor)" on some 64-bit platforms while reconfiguration. *) Bugfix: a segmentation fault occurred in worker process, if empty stub block was used second time in SSI. *) Bugfix: in copying URI part contained escaped symbols into arguments.
author Igor Sysoev <http://sysoev.ru>
date Wed, 12 Mar 2008 00:00:00 +0300
parents b743d290eb3b
children 9a242235a80a
line wrap: on
line diff
--- a/src/http/modules/perl/ngx_http_perl_module.c
+++ b/src/http/modules/perl/ngx_http_perl_module.c
@@ -41,7 +41,6 @@ static ngx_int_t ngx_http_perl_ssi(ngx_h
     ngx_http_ssi_ctx_t *ssi_ctx, ngx_str_t **params);
 #endif
 
-static void ngx_http_perl_sleep_handler(ngx_http_request_t *r);
 static char *ngx_http_perl_init_interpreter(ngx_conf_t *cf,
     ngx_http_perl_main_conf_t *pmcf);
 static PerlInterpreter *ngx_http_perl_create_interpreter(ngx_conf_t *cf,
@@ -49,7 +48,7 @@ static PerlInterpreter *ngx_http_perl_cr
 static ngx_int_t ngx_http_perl_run_requires(pTHX_ ngx_array_t *requires,
     ngx_log_t *log);
 static ngx_int_t ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r,
-    HV *nginx, SV *sub, ngx_str_t **args, ngx_str_t *handler, ngx_str_t *rv);
+    HV *nginx, SV *sub, SV **args, ngx_str_t *handler, ngx_str_t *rv);
 static void ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv);
 
 static ngx_int_t ngx_http_perl_preconfiguration(ngx_conf_t *cf);
@@ -252,12 +251,6 @@ ngx_http_perl_handle_request(ngx_http_re
     ctx->filename.data = NULL;
     ctx->redirect_uri.len = 0;
 
-    if (ctx->sleep) {
-        ngx_add_timer(r->connection->write, (ngx_msec_t) ctx->sleep);
-        r->write_event_handler = ngx_http_perl_sleep_handler;
-        ctx->sleep = 0;
-    }
-
     if (ctx->done || ctx->next) {
         return;
     }
@@ -276,7 +269,7 @@ ngx_http_perl_handle_request(ngx_http_re
 }
 
 
-static void
+void
 ngx_http_perl_sleep_handler(ngx_http_request_t *r)
 {
     ngx_event_t  *wev;
@@ -364,9 +357,10 @@ static ngx_int_t
 ngx_http_perl_ssi(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ssi_ctx,
     ngx_str_t **params)
 {
-    SV                         *sv;
+    SV                         *sv, **asv;
     ngx_int_t                   rc;
-    ngx_str_t                  *handler;
+    ngx_str_t                  *handler, **args;
+    ngx_uint_t                  i;
     ngx_http_perl_ctx_t        *ctx;
     ngx_http_perl_main_conf_t  *pmcf;
 
@@ -416,9 +410,31 @@ ngx_http_perl_ssi(ngx_http_request_t *r,
 
     sv = newSVpvn((char *) handler->data, handler->len);
 
-    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, sv,
-                                    &params[NGX_HTTP_PERL_SSI_ARG],
-                                    handler, NULL);
+    args = &params[NGX_HTTP_PERL_SSI_ARG];
+
+    if (args) {
+
+        for (i = 0; args[i]; i++) { /* void */ }
+
+        asv = ngx_pcalloc(r->pool, (i + 1) * sizeof(SV *));
+
+        if (asv == NULL) {
+            SvREFCNT_dec(sv);
+            return NGX_ERROR;
+        }
+
+        asv[0] = (SV *) i;
+
+        for (i = 0; args[i]; i++) {
+            asv[i + 1] = newSVpvn((char *) args[i]->data, args[i]->len);
+        }
+
+    } else {
+        asv = NULL;
+    }
+
+    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, sv, asv, handler,
+                                    NULL);
 
     SvREFCNT_dec(sv);
 
@@ -629,7 +645,7 @@ ngx_http_perl_run_requires(pTHX_ ngx_arr
 
 static ngx_int_t
 ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r, HV *nginx, SV *sub,
-    ngx_str_t **args, ngx_str_t *handler, ngx_str_t *rv)
+    SV **args, ngx_str_t *handler, ngx_str_t *rv)
 {
     SV                *sv;
     int                n, status;
@@ -652,12 +668,10 @@ ngx_http_perl_call_handler(pTHX_ ngx_htt
     XPUSHs(sv);
 
     if (args) {
-        for (i = 0; args[i]; i++) { /* void */ }
+        EXTEND(sp, (int) args[0]);
 
-        EXTEND(sp, (int) i);
-
-        for (i = 0; args[i]; i++) {
-            PUSHs(sv_2mortal(newSVpvn((char *) args[i]->data, args[i]->len)));
+        for (i = 1; i <= (ngx_uint_t) args[0]; i++) {
+            PUSHs(sv_2mortal(args[i]));
         }
     }