]> git.kaiwu.me - nginx.git/commitdiff
Perl: fixed delaying subrequests.
authorMaxim Dounin <mdounin@mdounin.ru>
Sun, 2 Apr 2017 11:32:28 +0000 (14:32 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Sun, 2 Apr 2017 11:32:28 +0000 (14:32 +0300)
Much like in limit_req, use the wev->delayed flag to ensure proper handling
and interoperability with limit_rate.

src/http/modules/perl/nginx.xs
src/http/modules/perl/ngx_http_perl_module.c

index 6716620afc3fd50b24dbdc385365a0a5a6705867..cca64da37dc378fe7baa4fd165a3425fb8216626 100644 (file)
@@ -1001,6 +1001,7 @@ sleep(r, sleep, next)
 
     ctx->next = SvRV(ST(2));
 
+    r->connection->write->delayed = 1;
     ngx_add_timer(r->connection->write, sleep);
 
     r->write_event_handler = ngx_http_perl_sleep_handler;
index 279631974b43e9ae70a5508d941737d61e29792e..79ded0f2ffd5148b80e3f20c969e4b3e6f8b8e83 100644 (file)
@@ -278,15 +278,19 @@ ngx_http_perl_sleep_handler(ngx_http_request_t *r)
 
     wev = r->connection->write;
 
-    if (wev->timedout) {
-        wev->timedout = 0;
-        ngx_http_perl_handle_request(r);
+    if (wev->delayed && !wev->timedout) {
+
+        if (ngx_handle_write_event(wev, 0) != NGX_OK) {
+            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
+        }
+
         return;
     }
 
-    if (ngx_handle_write_event(wev, 0) != NGX_OK) {
-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
-    }
+    wev->delayed = 0;
+    wev->timedout = 0;
+
+    ngx_http_perl_handle_request(r);
 }