summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2006-02-20 16:48:17 +0000
committerIgor Sysoev <igor@sysoev.ru>2006-02-20 16:48:17 +0000
commit69d73da6292364be19d8c0fa120fe16f1d260aa1 (patch)
treeb8a6f1ec1bdbcf5d0705b027f1ff87ccf0359af0
parentc58bb90e219bbec394e69ff66334f8b99e89479d (diff)
downloadnginx-release-0.3.29.tar.gz
nginx-0.3.29-RELEASE importrelease-0.3.29
*) Feature: now nginx uses less memory, if PHP in FastCGI mode sends many warnings before the response. *) Bugfix: the "Transfer-Encoding: chunked" header line was issued in the 204 responses for the HTTP/1.1 requests. *) Bugfix: nginx returned the 502 response, if the complete response header lines were transferred in a separate FastCGI records. *) Bugfix: if the proxied URI was specified in the "post_action" directive, then it ran only after a successful completion of a request.
-rw-r--r--docs/xml/nginx/changes.xml49
-rw-r--r--src/core/nginx.h2
-rw-r--r--src/event/ngx_event_accept.c3
-rw-r--r--src/http/modules/ngx_http_chunked_filter_module.c5
-rw-r--r--src/http/modules/ngx_http_fastcgi_module.c61
-rw-r--r--src/http/ngx_http_request.c1
-rw-r--r--src/http/ngx_http_upstream.c8
7 files changed, 98 insertions, 31 deletions
diff --git a/docs/xml/nginx/changes.xml b/docs/xml/nginx/changes.xml
index b04aa93fa..0460c930e 100644
--- a/docs/xml/nginx/changes.xml
+++ b/docs/xml/nginx/changes.xml
@@ -9,6 +9,55 @@
<title lang="en">nginx changelog</title>
+<changes ver="0.3.29" date="20.02.2006">
+
+<change type="feature">
+<para lang="ru">
+теперь nginx использует меньше памяти, если PHP в режиме FastCGI передаёт
+большое количество предупреждений перед ответом.
+</para>
+<para lang="en">
+now nginx uses less memory, if PHP in FastCGI mode sends many warnings
+before the response.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+в ответах 204 для запросов версии HTTP/1.1 выдавалась строка заголовка
+"Transfer-Encoding: chunked".
+</para>
+<para lang="en">
+the "Transfer-Encoding: chunked" header line was issued in the 204 responses
+for the HTTP/1.1 requests.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+nginx возвращал 502 код ответа, если FastCGI сервер передавал полные строки
+заголовка ответа в отдельных FastCGI записях.
+</para>
+<para lang="en">
+nginx returned the 502 response, if the complete response header lines
+were transferred in a separate FastCGI records.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+если в директиве post_action был указан проксируемый URI, то он выполнялся
+только после успешного завершения запроса.
+</para>
+<para lang="en">
+if the proxied URI was specified in the "post_action" directive, then it ran
+only after a successful completion of a request.
+</para>
+</change>
+
+</changes>
+
+
<changes ver="0.3.28" date="16.02.2006">
<change type="feature">
diff --git a/src/core/nginx.h b/src/core/nginx.h
index 5adb47d1f..01ce1bd93 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
#define _NGINX_H_INCLUDED_
-#define NGINX_VER "nginx/0.3.28"
+#define NGINX_VER "nginx/0.3.29"
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index 875c45d0e..a795075d0 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -264,8 +264,7 @@ ngx_trylock_accept_mutex(ngx_cycle_t *cycle)
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"accept mutex locked");
- if (ngx_accept_mutex_held && !(ngx_event_flags & NGX_USE_RTSIG_EVENT))
- {
+ if (ngx_accept_mutex_held && !(ngx_event_flags & NGX_USE_RTSIG_EVENT)) {
return NGX_OK;
}
diff --git a/src/http/modules/ngx_http_chunked_filter_module.c b/src/http/modules/ngx_http_chunked_filter_module.c
index 89c4a0429..d8d12088c 100644
--- a/src/http/modules/ngx_http_chunked_filter_module.c
+++ b/src/http/modules/ngx_http_chunked_filter_module.c
@@ -50,7 +50,10 @@ static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
static ngx_int_t
ngx_http_chunked_header_filter(ngx_http_request_t *r)
{
- if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED || r != r->main) {
+ if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED
+ || r->headers_out.status == NGX_HTTP_NO_CONTENT
+ || r != r->main)
+ {
return ngx_http_next_header_filter(r);
}
diff --git a/src/http/modules/ngx_http_fastcgi_module.c b/src/http/modules/ngx_http_fastcgi_module.c
index 45b6e7382..978c32542 100644
--- a/src/http/modules/ngx_http_fastcgi_module.c
+++ b/src/http/modules/ngx_http_fastcgi_module.c
@@ -46,7 +46,7 @@ typedef struct {
size_t length;
size_t padding;
- ngx_uint_t header;
+ ngx_uint_t fastcgi_stdout;
} ngx_http_fastcgi_ctx_t;
@@ -776,7 +776,7 @@ ngx_http_fastcgi_reinit_request(ngx_http_request_t *r)
}
f->state = ngx_http_fastcgi_st_version;
- f->header = 0;
+ f->fastcgi_stdout = 0;
return NGX_OK;
}
@@ -876,13 +876,6 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
if (f->type == NGX_HTTP_FASTCGI_STDERR) {
- if (f->header) {
- ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
- "upstream split a header in FastCGI records");
-
- return NGX_HTTP_UPSTREAM_INVALID_HEADER;
- }
-
if (f->length) {
line.data = u->buffer.pos;
@@ -910,6 +903,18 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
"FastCGI sent in stderr: \"%V\"", &line);
if (u->buffer.pos == u->buffer.last) {
+
+ if (!f->fastcgi_stdout) {
+
+ /*
+ * the special handling the large number
+ * of the PHP warnings to not allocate memory
+ */
+
+ u->buffer.pos = u->buffer.start;
+ u->buffer.last = u->buffer.start;
+ }
+
return NGX_AGAIN;
}
@@ -923,6 +928,8 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
/* f->type == NGX_HTTP_FASTCGI_STDOUT */
+ f->fastcgi_stdout = 1;
+
start = u->buffer.pos;
if (u->buffer.pos + f->length < u->buffer.last) {
@@ -939,8 +946,6 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
last = NULL;
}
- f->header = 1;
-
for ( ;; ) {
rc = ngx_http_parse_header_line(r, &u->buffer);
@@ -991,7 +996,13 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
"http fastcgi header: \"%V: %V\"",
&h->key, &h->value);
- continue;
+ if (u->buffer.pos < u->buffer.last) {
+ continue;
+ }
+
+ /* the end of the FastCGI record */
+
+ break;
}
if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
@@ -1045,17 +1056,6 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
f->length -= u->buffer.pos - start;
- if (rc == NGX_AGAIN) {
- if (u->buffer.pos == u->buffer.last) {
- return NGX_AGAIN;
- }
-
- ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
- "upstream split a header in FastCGI records");
-
- return NGX_HTTP_UPSTREAM_INVALID_HEADER;
- }
-
if (f->length == 0) {
if (f->padding) {
f->state = ngx_http_fastcgi_st_padding;
@@ -1064,7 +1064,20 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
}
}
- return NGX_OK;
+ if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
+ return NGX_OK;
+ }
+
+ if (u->buffer.pos == u->buffer.last) {
+ return NGX_AGAIN;
+ }
+
+ if (rc == NGX_AGAIN) {
+ ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+ "upstream split a header line in FastCGI records");
+
+ return NGX_HTTP_UPSTREAM_INVALID_HEADER;
+ }
}
}
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index b97515cc3..348c84bfc 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1396,7 +1396,6 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|| rc == NGX_HTTP_REQUEST_TIME_OUT
|| r->connection->error)
{
-
if (ngx_http_post_action(r) == NGX_OK) {
return;
}
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index cb5528371..e73b3b379 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -283,8 +283,12 @@ ngx_http_upstream_init(ngx_http_request_t *r)
ngx_del_timer(c->read);
}
- r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;
- r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;
+ if (!(r->http_version == NGX_HTTP_VERSION_9 && r->header_only)) {
+ /* not a post_action */
+
+ r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;
+ r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;
+ }
if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {