diff src/http/modules/ngx_http_fastcgi_module.c @ 164:b922c231a392 NGINX_0_3_29

nginx 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.
author Igor Sysoev <http://sysoev.ru>
date Mon, 20 Feb 2006 00:00:00 +0300
parents 91372f004adf
children 3314be145cb9
line wrap: on
line diff
--- 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
     }
 
     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
 
         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
                               "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
 
         /* 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
             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
                                "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
 
         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
             }
         }
 
-        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;
+        }
     }
 }