changeset 314:d5ec0be9c835 NGINX_0_6_1

nginx 0.6.1 *) Bugfix: in SSI parsing. *) Bugfix: if remote SSI subrequest was used, then posterior local file subrequest might transferred to client in wrong order. *) Bugfix: large SSI inclusions buffered in temporary files were truncated. *) Bugfix: the perl $$ variable value in ngx_http_perl_module was equal to the master process identification number.
author Igor Sysoev <http://sysoev.ru>
date Sun, 17 Jun 2007 00:00:00 +0400
parents a42b0aafacc1
children f51e5273589b
files CHANGES CHANGES.ru src/core/nginx.h src/http/modules/ngx_http_ssi_filter_module.c src/http/modules/perl/nginx.pm src/http/modules/perl/ngx_http_perl_module.c src/http/ngx_http_copy_filter_module.c src/http/ngx_http_upstream.c
diffstat 8 files changed, 78 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,18 @@
 
+Changes with nginx 0.6.1                                         17 Jun 2007
+
+    *) Bugfix: in SSI parsing.
+
+    *) Bugfix: if remote SSI subrequest was used, then posterior local file 
+       subrequest might transferred to client in wrong order.
+
+    *) Bugfix: large SSI inclusions buffered in temporary files were 
+       truncated.
+
+    *) Bugfix: the perl $$ variable value in ngx_http_perl_module was equal 
+       to the master process identification number.
+
+
 Changes with nginx 0.6.0                                         14 Jun 2007
 
     *) Feature: the "server_name", "map", and "valid_referers" directives 
--- a/CHANGES.ru
+++ b/CHANGES.ru
@@ -1,4 +1,19 @@
 
+Изменения в nginx 0.6.1                                           17.06.2007
+
+    *) Исправление: в парсинге SSI.
+
+    *) Исправление: при использовании удалённого подзапроса в SSI 
+       последующий подзапрос локального файла мог отдаваться клиенту в 
+       неверном порядке.
+
+    *) Исправление: большие включения в SSI, сохранённые во временные 
+       файлы, передавались не полностью.
+
+    *) Исправление: значение perl'овой переменной $$ модуля 
+       ngx_http_perl_module было равно номеру главного процесса.
+
+
 Изменения в nginx 0.6.0                                           14.06.2007
 
     *) Добавление: директивы "server_name", "map", and "valid_referers" 
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
 #define _NGINX_H_INCLUDED_
 
 
-#define NGINX_VERSION      "0.6.0"
+#define NGINX_VERSION      "0.6.1"
 #define NGINX_VER          "nginx/" NGINX_VERSION
 
 #define NGINX_VAR          "NGINX"
--- a/src/http/modules/ngx_http_ssi_filter_module.c
+++ b/src/http/modules/ngx_http_ssi_filter_module.c
@@ -800,8 +800,14 @@ ngx_http_ssi_body_filter(ngx_http_reques
                     }
                 }
 
-                if (cmd->flush && ctx->out) {
-                    rc = ngx_http_ssi_output(r, ctx);
+                if (cmd->flush) {
+
+                    if (ctx->out) {
+                        rc = ngx_http_ssi_output(r, ctx);
+
+                    } else {
+                        rc = ngx_http_next_body_filter(r, NULL);
+                    }
 
                     if (rc == NGX_ERROR) {
                         return NGX_ERROR;
@@ -1020,6 +1026,7 @@ ngx_http_ssi_parse(ngx_http_request_t *r
                 ch = *p;
             }
 
+            ctx->state = state;
             ctx->pos = p;
             ctx->looked = looked;
             ctx->copy_end = p;
--- a/src/http/modules/perl/nginx.pm
+++ b/src/http/modules/perl/nginx.pm
@@ -47,7 +47,7 @@ our @EXPORT = qw(
     HTTP_INSUFFICIENT_STORAGE
 );
 
-our $VERSION = '0.6.0';
+our $VERSION = '0.6.1';
 
 require XSLoader;
 XSLoader::load('nginx', $VERSION);
--- a/src/http/modules/perl/ngx_http_perl_module.c
+++ b/src/http/modules/perl/ngx_http_perl_module.c
@@ -67,6 +67,7 @@ static char *ngx_http_perl_set(ngx_conf_
 static void ngx_http_perl_cleanup_perl(void *data);
 #endif
 
+static ngx_int_t ngx_http_perl_init_worker(ngx_cycle_t *cycle);
 static void ngx_http_perl_exit(ngx_cycle_t *cycle);
 
 
@@ -126,7 +127,7 @@ ngx_module_t  ngx_http_perl_module = {
     NGX_HTTP_MODULE,                       /* module type */
     NULL,                                  /* init master */
     NULL,                                  /* init module */
-    NULL,                                  /* init process */
+    ngx_http_perl_init_worker,             /* init process */
     NULL,                                  /* init thread */
     NULL,                                  /* exit thread */
     NULL,                                  /* exit process */
@@ -1004,6 +1005,27 @@ ngx_http_perl_set(ngx_conf_t *cf, ngx_co
 }
 
 
+static ngx_int_t
+ngx_http_perl_init_worker(ngx_cycle_t *cycle)
+{
+    ngx_http_perl_main_conf_t  *pmcf;
+
+    pmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_perl_module);
+
+    {
+
+    dTHXa(pmcf->perl);
+    PERL_SET_CONTEXT(pmcf->perl);
+
+    /* set worker's $$ */
+
+    sv_setiv(GvSV(gv_fetchpv("$", TRUE, SVt_PV)), (I32) ngx_pid);
+
+    }
+
+    return NGX_OK;
+}
+
 static void
 ngx_http_perl_exit(ngx_cycle_t *cycle)
 {
--- a/src/http/ngx_http_copy_filter_module.c
+++ b/src/http/ngx_http_copy_filter_module.c
@@ -117,6 +117,10 @@ ngx_http_copy_filter(ngx_http_request_t 
             r->buffered |= NGX_HTTP_COPY_BUFFERED;
         }
 
+        if (r != r->main) {
+            r->out = ctx->in;
+        }
+
 #if (NGX_DEBUG)
         ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                        "copy filter: %i \"%V?%V\"", rc, &r->uri, &r->args);
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -2157,8 +2157,17 @@ ngx_http_upstream_finalize_request(ngx_h
 
     r->connection->log->action = "sending to client";
 
-    if (rc == 0 && r == r->main && !r->post_action) {
-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);
+    if (rc == 0) {
+        if (r == r->main) {
+            if (!r->post_action) {
+                rc = ngx_http_send_special(r, NGX_HTTP_LAST);
+            }
+
+        } else {
+            if (r->out) {
+                rc = NGX_AGAIN;
+            }
+        }
     }
 
     ngx_http_finalize_request(r, rc);