changeset 758:86bb73dc8d40

fix <!--#include virtual=... wait="yes" -->
author Igor Sysoev <igor@sysoev.ru>
date Tue, 10 Oct 2006 14:30:39 +0000
parents a138c4e6031f
children 1606be879985
files src/http/modules/ngx_http_addition_filter_module.c src/http/modules/ngx_http_ssi_filter_module.c src/http/modules/ngx_http_ssi_filter_module.h src/http/ngx_http_core_module.c src/http/ngx_http_core_module.h
diffstat 5 files changed, 26 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/modules/ngx_http_addition_filter_module.c
+++ b/src/http/modules/ngx_http_addition_filter_module.c
@@ -124,6 +124,7 @@ ngx_http_addition_body_filter(ngx_http_r
     ngx_int_t                  rc;
     ngx_uint_t                 last;
     ngx_chain_t               *cl;
+    ngx_http_request_t        *sr;
     ngx_http_addition_ctx_t   *ctx;
     ngx_http_addition_conf_t  *conf;
 
@@ -143,7 +144,7 @@ ngx_http_addition_body_filter(ngx_http_r
         ctx->before_body_sent = 1;
 
         if (conf->before_body.len) {
-            if (ngx_http_subrequest(r, &conf->before_body, NULL, NULL, 0)
+            if (ngx_http_subrequest(r, &conf->before_body, NULL, &sr, NULL, 0)
                 == NGX_ERROR)
             {
                 return NGX_ERROR;
@@ -167,7 +168,9 @@ ngx_http_addition_body_filter(ngx_http_r
         return rc;
     }
 
-    if (ngx_http_subrequest(r, &conf->after_body, NULL, NULL, 0) == NGX_ERROR) {
+    if (ngx_http_subrequest(r, &conf->after_body, NULL, &sr, NULL, 0)
+        == NGX_ERROR)
+    {
         return NGX_ERROR;
     }
 
--- a/src/http/modules/ngx_http_ssi_filter_module.c
+++ b/src/http/modules/ngx_http_ssi_filter_module.c
@@ -417,10 +417,11 @@ ngx_http_ssi_body_filter(ngx_http_reques
             return NGX_AGAIN;
         }
 
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                       "http ssi filter \"%V\" continue", &r->uri);
-
-        ctx->wait = 0;
+        if (ctx->wait == r) {
+            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                           "http ssi filter \"%V\" continue", &r->uri);
+            ctx->wait = NULL;
+        }
     }
 
     slcf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module);
@@ -1814,6 +1815,7 @@ ngx_http_ssi_include(ngx_http_request_t 
     ngx_buf_t             *b;
     ngx_uint_t             flags, i;
     ngx_chain_t           *out, *cl, *tl, **ll;
+    ngx_http_request_t    *sr;
     ngx_http_ssi_ctx_t    *mctx;
     ngx_http_ssi_block_t  *bl;
 
@@ -1936,7 +1938,7 @@ ngx_http_ssi_include(ngx_http_request_t 
         }
     }
 
-    rc = ngx_http_subrequest(r, uri, &args, out, flags);
+    rc = ngx_http_subrequest(r, uri, &args, &sr, out, flags);
 
     if (rc == NGX_ERROR) {
         return NGX_HTTP_SSI_ERROR;
@@ -1947,7 +1949,13 @@ ngx_http_ssi_include(ngx_http_request_t 
     }
 
     if (rc == NGX_AGAIN) {
-        ctx->wait = 1;
+        if (ctx->wait == NULL) {
+            ctx->wait = sr;
+
+        } else {
+            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+                          "only one subrequest may be waited at the same time");
+        }
     }
 
     return rc;
--- a/src/http/modules/ngx_http_ssi_filter_module.h
+++ b/src/http/modules/ngx_http_ssi_filter_module.h
@@ -63,8 +63,8 @@ typedef struct {
     unsigned                  block:1;
     unsigned                  output:1;
     unsigned                  output_chosen:1;
-    unsigned                  wait:1;
 
+    ngx_http_request_t       *wait;
     void                     *value_buf;
     ngx_str_t                 timefmt;
     ngx_str_t                 errmsg;
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -1283,7 +1283,8 @@ ngx_http_auth_basic_user(ngx_http_reques
 
 ngx_int_t
 ngx_http_subrequest(ngx_http_request_t *r,
-    ngx_str_t *uri, ngx_str_t *args, ngx_chain_t *out, ngx_uint_t flags)
+    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,
+    ngx_chain_t *out, ngx_uint_t flags)
 {
     ngx_connection_t              *c;
     ngx_http_request_t            *sr;
@@ -1417,6 +1418,8 @@ ngx_http_subrequest(ngx_http_request_t *
         ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
                        "http subrequest done \"%V?%V\"", uri, &sr->args);
 
+        *psr = sr;
+
         if (sr->fast_subrequest) {
             sr->fast_subrequest = 0;
 
--- a/src/http/ngx_http_core_module.h
+++ b/src/http/ngx_http_core_module.h
@@ -305,7 +305,8 @@ u_char *ngx_http_map_uri_to_path(ngx_htt
 ngx_int_t ngx_http_auth_basic_user(ngx_http_request_t *r);
 
 ngx_int_t ngx_http_subrequest(ngx_http_request_t *r,
-    ngx_str_t *uri, ngx_str_t *args, ngx_chain_t *out, ngx_uint_t flags);
+    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **sr,
+    ngx_chain_t *out, ngx_uint_t flags);
 ngx_int_t ngx_http_internal_redirect(ngx_http_request_t *r,
     ngx_str_t *uri, ngx_str_t *args);