diff src/http/modules/perl/ngx_http_perl_module.c @ 356:b743d290eb3b NGINX_0_6_22

nginx 0.6.22 *) Change: now all ngx_http_perl_module methods return values copied to perl's allocated memory. *) Bugfix: if nginx was built with ngx_http_perl_module, the perl before 5.8.6 was used, and perl supported threads, then during reconfiguration the master process aborted; bug appeared in 0.5.9. Thanks to Boris Zhmurov. *) Bugfix: the ngx_http_perl_module methods may get invalid values of the regex captures. *) Bugfix: a segmentation fault occurred in worker process, if the $r->has_request_body() method was called for a request whose small request body was already received. *) Bugfix: large_client_header_buffers did not freed before going to keep-alive state. Thanks to Olexander Shtepa. *) Bugfix: the last address was missed in the $upstream_addr variable; bug appeared in 0.6.18. *) Bugfix: the "fastcgi_catch_stderr" directive did return error code; now it returns 502 code, that can be rerouted to a next server using the "fastcgi_next_upstream invalid_header" directive. *) Bugfix: a segmentation fault occurred in master process if the "fastcgi_catch_stderr" directive was used; bug appeared in 0.6.10. Thanks to Manlio Perillo.
author Igor Sysoev <http://sysoev.ru>
date Wed, 19 Dec 2007 00:00:00 +0300
parents 10cc350ed8a1
children babd3d9efb62
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
@@ -230,6 +230,10 @@ ngx_http_perl_handle_request(ngx_http_re
 
     }
 
+    if (rc == NGX_DONE) {
+        return;
+    }
+
     if (rc > 600) {
         rc = NGX_OK;
     }
@@ -627,12 +631,13 @@ 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          *sv;
-    int          n, status;
-    char        *line;
-    STRLEN       len, n_a;
-    ngx_str_t    err;
-    ngx_uint_t   i;
+    SV                *sv;
+    int                n, status;
+    char              *line;
+    STRLEN             len, n_a;
+    ngx_str_t          err;
+    ngx_uint_t         i;
+    ngx_connection_t  *c;
 
     dSP;
 
@@ -658,15 +663,26 @@ ngx_http_perl_call_handler(pTHX_ ngx_htt
 
     PUTBACK;
 
+    c = r->connection;
+
     n = call_sv(sub, G_EVAL);
 
     SPAGAIN;
 
+    if (c->destroyed) {
+        PUTBACK;
+
+        FREETMPS;
+        LEAVE;
+
+        return NGX_DONE;
+    }
+
     if (n) {
         if (rv == NULL) {
             status = POPi;
 
-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
                            "call_sv: %d", status);
 
         } else {
@@ -697,9 +713,8 @@ ngx_http_perl_call_handler(pTHX_ ngx_htt
         }
         err.len = len + 1;
 
-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
-                      "call_sv(\"%V\") failed: \"%V\"",
-                      handler, &err);
+        ngx_log_error(NGX_LOG_ERR, c->log, 0,
+                      "call_sv(\"%V\") failed: \"%V\"", handler, &err);
 
         if (rv) {
             return NGX_ERROR;
@@ -709,7 +724,7 @@ ngx_http_perl_call_handler(pTHX_ ngx_htt
     }
 
     if (n != 1) {
-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+        ngx_log_error(NGX_LOG_ALERT, c->log, 0,
                       "call_sv(\"%V\") returned %d results", handler, n);
         status = NGX_OK;
     }