summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES14
-rw-r--r--CHANGES.ru16
-rw-r--r--src/core/nginx.h2
-rw-r--r--src/http/modules/ngx_http_fastcgi_module.c12
-rw-r--r--src/http/modules/ngx_http_gzip_filter_module.c4
-rw-r--r--src/http/modules/ngx_http_proxy_module.c16
-rw-r--r--src/http/modules/ngx_http_ssi_filter_module.c1
-rw-r--r--src/http/modules/perl/nginx.pm2
-rw-r--r--src/http/ngx_http_core_module.c6
-rw-r--r--src/http/ngx_http_upstream.c14
-rw-r--r--src/http/ngx_http_upstream.h5
-rw-r--r--src/http/ngx_http_upstream_round_robin.c58
12 files changed, 113 insertions, 37 deletions
diff --git a/CHANGES b/CHANGES
index 6db249cd9..0fdda3726 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,18 @@
+Changes with nginx 0.7.29 24 Dec 2008
+
+ *) Bugfix: the "fastcgi_pass" and "proxy_pass" directives did not
+ support variables if unix domain sockets were used.
+
+ *) Bugfixes in subrequest processing; the bugs had appeared in 0.7.25.
+
+ *) Bugfix: a "100 Continue" response was issued for HTTP/1.0 requests;
+ Thanks to Maxim Dounin.
+
+ *) Bugfix: in memory allocation in the ngx_http_gzip_filter_module on
+ Cygwin.
+
+
Changes with nginx 0.7.28 22 Dec 2008
*) Change: in memory allocation in the ngx_http_gzip_filter_module.
diff --git a/CHANGES.ru b/CHANGES.ru
index 9ffb6d6a8..8fe9a3f94 100644
--- a/CHANGES.ru
+++ b/CHANGES.ru
@@ -1,9 +1,23 @@
+Изменения в nginx 0.7.29 24.12.2008
+
+ *) Исправление: директивы fastcgi_pass и proxy_pass не поддерживали
+ переменные при использовании unix domain сокетов.
+
+ *) Исправления в обработке подзапросов; ошибки появилась в 0.7.25.
+
+ *) Исправление: ответ "100 Continue" выдавался для запросов версии
+ HTTP/1.0; Спасибо Максиму Дунину.
+
+ *) Исправление: в выделении памяти в модуле ngx_http_gzip_filter_module
+ под Cygwin.
+
+
Изменения в nginx 0.7.28 22.12.2008
*) Изменение: в выделении памяти в модуле ngx_http_gzip_filter_module.
- *) Изменение: значения по умолчанию для директивы gzip_values изменены
+ *) Изменение: значения по умолчанию для директивы gzip_buffers изменены
с 4 4k/8k на 32 4k или 16 8k.
diff --git a/src/core/nginx.h b/src/core/nginx.h
index 234a085ef..3e82676c9 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
#define _NGINX_H_INCLUDED_
-#define NGINX_VERSION "0.7.28"
+#define NGINX_VERSION "0.7.29"
#define NGINX_VER "nginx/" NGINX_VERSION
#define NGINX_VAR "NGINX"
diff --git a/src/http/modules/ngx_http_fastcgi_module.c b/src/http/modules/ngx_http_fastcgi_module.c
index 957927741..6e4d956d8 100644
--- a/src/http/modules/ngx_http_fastcgi_module.c
+++ b/src/http/modules/ngx_http_fastcgi_module.c
@@ -512,8 +512,16 @@ ngx_http_fastcgi_eval(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf)
return NGX_ERROR;
}
- r->upstream->resolved->host = u.host;
- r->upstream->resolved->port = u.port;
+ if (u.addrs[0].sockaddr) {
+ r->upstream->resolved->sockaddr = u.addrs[0].sockaddr;
+ r->upstream->resolved->socklen = u.addrs[0].socklen;
+ r->upstream->resolved->naddrs = 1;
+ r->upstream->resolved->host = u.addrs[0].name;
+
+ } else {
+ r->upstream->resolved->host = u.host;
+ r->upstream->resolved->port = u.port;
+ }
return NGX_OK;
}
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
index 843a5b9dc..217331d80 100644
--- a/src/http/modules/ngx_http_gzip_filter_module.c
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
@@ -938,14 +938,14 @@ ngx_http_gzip_filter_alloc(void *opaque, u_int items, u_int size)
alloc = items * size;
- if (alloc % 512 != 0) {
+ if (alloc % 512 != 0 && alloc < 8192) {
/*
* The zlib deflate_state allocation, it takes about 6K,
* we allocate 8K. Other allocations are divisible by 512.
*/
- alloc = (alloc + ngx_pagesize - 1) & ~(ngx_pagesize - 1);
+ alloc = 8192;
}
if (alloc <= ctx->allocated) {
diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c
index 2cf009bd9..2bf58ab68 100644
--- a/src/http/modules/ngx_http_proxy_module.c
+++ b/src/http/modules/ngx_http_proxy_module.c
@@ -614,10 +614,18 @@ ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx,
return NGX_ERROR;
}
- r->upstream->resolved->host = u.host;
- r->upstream->resolved->port = (in_port_t) (u.no_port ? u.default_port:
- u.port);
- r->upstream->resolved->no_port = u.no_port;
+ if (u.addrs[0].sockaddr) {
+ r->upstream->resolved->sockaddr = u.addrs[0].sockaddr;
+ r->upstream->resolved->socklen = u.addrs[0].socklen;
+ r->upstream->resolved->naddrs = 1;
+ r->upstream->resolved->host = u.addrs[0].name;
+
+ } else {
+ r->upstream->resolved->host = u.host;
+ r->upstream->resolved->port = (in_port_t) (u.no_port ? u.default_port:
+ u.port);
+ r->upstream->resolved->no_port = u.no_port;
+ }
return NGX_OK;
}
diff --git a/src/http/modules/ngx_http_ssi_filter_module.c b/src/http/modules/ngx_http_ssi_filter_module.c
index 74a2c85d0..849e13b0b 100644
--- a/src/http/modules/ngx_http_ssi_filter_module.c
+++ b/src/http/modules/ngx_http_ssi_filter_module.c
@@ -1881,6 +1881,7 @@ ngx_http_ssi_include(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,
if (uri == NULL) {
uri = file;
+ wait = (ngx_str_t *) -1;
}
rc = ngx_http_ssi_evaluate_string(r, ctx, uri, NGX_HTTP_SSI_ADD_PREFIX);
diff --git a/src/http/modules/perl/nginx.pm b/src/http/modules/perl/nginx.pm
index 8c3b2f0d7..668a472f6 100644
--- 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.7.28';
+our $VERSION = '0.7.29';
require XSLoader;
XSLoader::load('nginx', $VERSION);
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index 4f2b32578..a7a5cdb4c 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -862,7 +862,7 @@ ngx_http_core_find_config_phase(ngx_http_request_t *r,
return NGX_OK;
}
- if (r->headers_in.expect) {
+ if (r->headers_in.expect && r->http_version > NGX_HTTP_VERSION_10) {
expect = ngx_http_core_send_continue(r);
if (expect != NGX_OK) {
@@ -1082,7 +1082,6 @@ ngx_http_core_try_files_phase(ngx_http_request_t *r,
e.ip = tf->lengths->elts;
e.request = r;
- e.flushed = 1;
/* 1 is for terminating '\0' as in static names */
len = 1;
@@ -1127,6 +1126,7 @@ ngx_http_core_try_files_phase(ngx_http_request_t *r,
} else {
e.ip = tf->values->elts;
e.pos = name;
+ e.flushed = 1;
while (*(uintptr_t *) e.ip) {
code = *(ngx_http_script_code_pt *) e.ip;
@@ -2093,7 +2093,7 @@ ngx_http_subrequest(ngx_http_request_t *r,
sr->read_event_handler = ngx_http_request_empty_handler;
sr->write_event_handler = ngx_http_handler;
- if (c->data == r) {
+ if (c->data == r && r->postponed == NULL) {
c->data = sr;
}
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index 9a96a1e3c..f567a438e 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -414,6 +414,20 @@ ngx_http_upstream_init(ngx_http_request_t *r)
} else {
+ if (u->resolved->sockaddr) {
+
+ if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)
+ != NGX_OK)
+ {
+ ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
+ return;
+ }
+
+ ngx_http_upstream_connect(r, u);
+
+ return;
+ }
+
host = &u->resolved->host;
umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h
index b6f2161d4..3c141276d 100644
--- a/src/http/ngx_http_upstream.h
+++ b/src/http/ngx_http_upstream.h
@@ -209,8 +209,13 @@ typedef struct {
ngx_str_t host;
in_port_t port;
ngx_uint_t no_port; /* unsigned no_port:1 */
+
ngx_uint_t naddrs;
in_addr_t *addrs;
+
+ struct sockaddr *sockaddr;
+ socklen_t socklen;
+
ngx_resolver_ctx_t *ctx;
} ngx_http_upstream_resolved_t;
diff --git a/src/http/ngx_http_upstream_round_robin.c b/src/http/ngx_http_upstream_round_robin.c
index 2479baa78..52bd80858 100644
--- a/src/http/ngx_http_upstream_round_robin.c
+++ b/src/http/ngx_http_upstream_round_robin.c
@@ -279,35 +279,47 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
peers->number = ur->naddrs;
peers->name = &ur->host;
- for (i = 0; i < ur->naddrs; i++) {
+ if (ur->sockaddr) {
+ peers->peer[0].sockaddr = ur->sockaddr;
+ peers->peer[0].socklen = ur->socklen;
+ peers->peer[0].name = ur->host;
+ peers->peer[0].weight = 1;
+ peers->peer[0].current_weight = 1;
+ peers->peer[0].max_fails = 1;
+ peers->peer[0].fail_timeout = 10;
- len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
+ } else {
- p = ngx_pnalloc(r->pool, len);
- if (p == NULL) {
- return NGX_ERROR;
- }
+ for (i = 0; i < ur->naddrs; i++) {
- len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);
- len = ngx_sprintf(&p[len], ":%d", ur->port) - p;
+ len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
- sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in));
- if (sin == NULL) {
- return NGX_ERROR;
- }
+ p = ngx_pnalloc(r->pool, len);
+ if (p == NULL) {
+ return NGX_ERROR;
+ }
- sin->sin_family = AF_INET;
- sin->sin_port = htons(ur->port);
- sin->sin_addr.s_addr = ur->addrs[i];
+ len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);
+ len = ngx_sprintf(&p[len], ":%d", ur->port) - p;
- peers->peer[i].sockaddr = (struct sockaddr *) sin;
- peers->peer[i].socklen = sizeof(struct sockaddr_in);
- peers->peer[i].name.len = len;
- peers->peer[i].name.data = p;
- peers->peer[i].weight = 1;
- peers->peer[i].current_weight = 1;
- peers->peer[i].max_fails = 1;
- peers->peer[i].fail_timeout = 10;
+ sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in));
+ if (sin == NULL) {
+ return NGX_ERROR;
+ }
+
+ sin->sin_family = AF_INET;
+ sin->sin_port = htons(ur->port);
+ sin->sin_addr.s_addr = ur->addrs[i];
+
+ peers->peer[i].sockaddr = (struct sockaddr *) sin;
+ peers->peer[i].socklen = sizeof(struct sockaddr_in);
+ peers->peer[i].name.len = len;
+ peers->peer[i].name.data = p;
+ peers->peer[i].weight = 1;
+ peers->peer[i].current_weight = 1;
+ peers->peer[i].max_fails = 1;
+ peers->peer[i].fail_timeout = 10;
+ }
}
rrp->peers = peers;