nginx-0.3.29-RELEASE import

*) 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.
This commit is contained in:
Igor Sysoev 2006-02-20 16:48:17 +00:00
parent c58bb90e21
commit 69d73da629
7 changed files with 98 additions and 31 deletions

View File

@ -9,6 +9,55 @@
<title lang="en">nginx changelog</title> <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"> <changes ver="0.3.28" date="16.02.2006">
<change type="feature"> <change type="feature">

View File

@ -8,7 +8,7 @@
#define _NGINX_H_INCLUDED_ #define _NGINX_H_INCLUDED_
#define NGINX_VER "nginx/0.3.28" #define NGINX_VER "nginx/0.3.29"
#define NGINX_VAR "NGINX" #define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin" #define NGX_OLDPID_EXT ".oldbin"

View File

@ -264,8 +264,7 @@ ngx_trylock_accept_mutex(ngx_cycle_t *cycle)
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"accept mutex locked"); "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; return NGX_OK;
} }

View File

@ -50,7 +50,10 @@ static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
static ngx_int_t static ngx_int_t
ngx_http_chunked_header_filter(ngx_http_request_t *r) 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); return ngx_http_next_header_filter(r);
} }

View File

@ -46,7 +46,7 @@ typedef struct {
size_t length; size_t length;
size_t padding; size_t padding;
ngx_uint_t header; ngx_uint_t fastcgi_stdout;
} ngx_http_fastcgi_ctx_t; } 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->state = ngx_http_fastcgi_st_version;
f->header = 0; f->fastcgi_stdout = 0;
return NGX_OK; 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->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) { if (f->length) {
line.data = u->buffer.pos; 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); "FastCGI sent in stderr: \"%V\"", &line);
if (u->buffer.pos == u->buffer.last) { 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; return NGX_AGAIN;
} }
@ -923,6 +928,8 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
/* f->type == NGX_HTTP_FASTCGI_STDOUT */ /* f->type == NGX_HTTP_FASTCGI_STDOUT */
f->fastcgi_stdout = 1;
start = u->buffer.pos; start = u->buffer.pos;
if (u->buffer.pos + f->length < u->buffer.last) { 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; last = NULL;
} }
f->header = 1;
for ( ;; ) { for ( ;; ) {
rc = ngx_http_parse_header_line(r, &u->buffer); rc = ngx_http_parse_header_line(r, &u->buffer);
@ -991,9 +996,15 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
"http fastcgi header: \"%V: %V\"", "http fastcgi header: \"%V: %V\"",
&h->key, &h->value); &h->key, &h->value);
if (u->buffer.pos < u->buffer.last) {
continue; continue;
} }
/* the end of the FastCGI record */
break;
}
if (rc == NGX_HTTP_PARSE_HEADER_DONE) { if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
/* a whole header has been parsed successfully */ /* a whole header has been parsed successfully */
@ -1045,17 +1056,6 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
f->length -= u->buffer.pos - start; 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->length == 0) {
if (f->padding) { if (f->padding) {
f->state = ngx_http_fastcgi_st_padding; f->state = ngx_http_fastcgi_st_padding;
@ -1064,8 +1064,21 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
} }
} }
if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
return NGX_OK; 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;
}
}
} }

View File

@ -1396,7 +1396,6 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|| rc == NGX_HTTP_REQUEST_TIME_OUT || rc == NGX_HTTP_REQUEST_TIME_OUT
|| r->connection->error) || r->connection->error)
{ {
if (ngx_http_post_action(r) == NGX_OK) { if (ngx_http_post_action(r) == NGX_OK) {
return; return;
} }

View File

@ -283,8 +283,12 @@ ngx_http_upstream_init(ngx_http_request_t *r)
ngx_del_timer(c->read); ngx_del_timer(c->read);
} }
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->read_event_handler = ngx_http_upstream_rd_check_broken_connection;
r->write_event_handler = ngx_http_upstream_wr_check_broken_connection; r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;
}
if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {