diff src/http/ngx_http_header_filter_module.c @ 58:b55cbf18157e NGINX_0_1_29

nginx 0.1.29 *) Feature: the ngx_http_ssi_module supports "include virtual" command. *) Feature: the ngx_http_ssi_module supports the condition command like 'if expr="$NAME"' and "else" and "endif" commands. Only one nested level is supported. *) Feature: the ngx_http_ssi_module supports the DATE_LOCAL and DATE_GMT variables and "config timefmt" command. *) Feature: the "ssi_ignore_recycled_buffers" directive. *) Bugfix: the "echo" command did not show the default value for the empty QUERY_STRING variable. *) Change: the ngx_http_proxy_module was rewritten. *) Feature: the "proxy_redirect", "proxy_pass_request_headers", "proxy_pass_request_body", and "proxy_method" directives. *) Feature: the "proxy_set_header" directive. The "proxy_x_var" was canceled and must be replaced with the proxy_set_header directive. *) Change: the "proxy_preserve_host" is canceled and must be replaced with the "proxy_set_header Host $host" and the "proxy_redirect off" directives, the "proxy_set_header Host $host:$proxy_port" directive and the appropriate proxy_redirect directives. *) Change: the "proxy_set_x_real_ip" is canceled and must be replaced with the "proxy_set_header X-Real-IP $remote_addr" directive. *) Change: the "proxy_add_x_forwarded_for" is canceled and must be replaced with the "proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for" directive. *) Change: the "proxy_set_x_url" is canceled and must be replaced with the "proxy_set_header X-URL http://$host:$server_port$request_uri" directive. *) Feature: the "fastcgi_param" directive. *) Change: the "fastcgi_root", "fastcgi_set_var" and "fastcgi_params" directive are canceled and must be replaced with the fastcgi_param directives. *) Feature: the "index" directive can use the variables. *) Feature: the "index" directive can be used at http and server levels. *) Change: the last index only in the "index" directive can be absolute. *) Feature: the "rewrite" directive can use the variables. *) Feature: the "internal" directive. *) Feature: the CONTENT_LENGTH, CONTENT_TYPE, REMOTE_PORT, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, DOCUMENT_ROOT, SERVER_NAME, REQUEST_METHOD, REQUEST_URI, and REMOTE_USER variables. *) Change: nginx now passes the invalid lines in a client request headers or a backend response header. *) Bugfix: if the backend did not transfer response for a long time and the "send_timeout" was less than "proxy_read_timeout", then nginx returned the 408 response. *) Bugfix: the segmentation fault was occurred if the backend sent an invalid line in response header; bug appeared in 0.1.26. *) Bugfix: the segmentation fault may occurred in FastCGI fault tolerance configuration. *) Bugfix: the "expires" directive did not remove the previous "Expires" and "Cache-Control" headers. *) Bugfix: nginx did not take into account trailing dot in "Host" header line. *) Bugfix: the ngx_http_auth_module did not work under Linux. *) Bugfix: the rewrite directive worked incorrectly, if the arguments were in a request. *) Bugfix: nginx could not be built on MacOS X.
author Igor Sysoev <http://sysoev.ru>
date Thu, 12 May 2005 00:00:00 +0400
parents 72eb30262aac
children df7d3fff122b
line wrap: on
line diff
--- a/src/http/ngx_http_header_filter_module.c
+++ b/src/http/ngx_http_header_filter_module.c
@@ -15,7 +15,8 @@ static ngx_int_t ngx_http_header_filter(
 
 
 static ngx_http_module_t  ngx_http_header_filter_module_ctx = {
-    NULL,                                  /* pre conf */
+    NULL,                                  /* preconfiguration */
+    NULL,                                  /* postconfiguration */
 
     NULL,                                  /* create main configuration */
     NULL,                                  /* init main configuration */
@@ -29,7 +30,7 @@ static ngx_http_module_t  ngx_http_heade
 
 
 ngx_module_t  ngx_http_header_filter_module = {
-    NGX_MODULE,
+    NGX_MODULE_V1,
     &ngx_http_header_filter_module_ctx,    /* module context */
     NULL,                                  /* module directives */
     NGX_HTTP_MODULE,                       /* module type */
@@ -38,10 +39,10 @@ ngx_module_t  ngx_http_header_filter_mod
 };
 
 
-static char server_string[] = "Server: " NGINX_VER CRLF;
+static char ngx_http_server_string[] = "Server: " NGINX_VER CRLF;
 
 
-static ngx_str_t http_codes[] = {
+static ngx_str_t ngx_http_status_lines[] = {
 
     ngx_string("200 OK"),
     ngx_null_string,  /* "201 Created" */
@@ -115,11 +116,13 @@ static ngx_str_t http_codes[] = {
 };
 
 
-ngx_http_header_t  ngx_http_headers_out[] = {
+ngx_http_header0_t  ngx_http_headers_out[] = {
     { ngx_string("Server"), offsetof(ngx_http_headers_out_t, server) },
     { ngx_string("Date"), offsetof(ngx_http_headers_out_t, date) },
+#if 0
     { ngx_string("Content-Type"),
                  offsetof(ngx_http_headers_out_t, content_type) },
+#endif
     { ngx_string("Content-Length"),
                  offsetof(ngx_http_headers_out_t, content_length) },
     { ngx_string("Content-Encoding"),
@@ -150,6 +153,10 @@ ngx_http_header_filter(ngx_http_request_
     ngx_table_elt_t           *header;
     ngx_http_core_loc_conf_t  *clcf;
 
+    if (r->main) {
+        return NGX_OK;
+    }
+
     if (r->http_version < NGX_HTTP_VERSION_10) {
         return NGX_OK;
     }
@@ -209,44 +216,44 @@ ngx_http_header_filter(ngx_http_request_
                                            + NGX_HTTP_LEVEL_400;
         }
 
-        len += http_codes[status].len;
+        len += ngx_http_status_lines[status].len;
     }
 
-    if (r->headers_out.server && r->headers_out.server->key.len) {
-        len += r->headers_out.server->key.len
-               + r->headers_out.server->value.len + 2;
-    } else {
-        len += sizeof(server_string) - 1;
+    if (r->headers_out.server == NULL) {
+        len += sizeof(ngx_http_server_string) - 1;
     }
 
-    if (r->headers_out.date && r->headers_out.date->key.len) {
-        len += r->headers_out.date->key.len
-               + r->headers_out.date->value.len + 2;
-    } else {
+    if (r->headers_out.date == NULL) {
         len += sizeof("Date: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;
     }
 
-    if (r->headers_out.content_length == NULL) {
-        if (r->headers_out.content_length_n >= 0) {
-            len += sizeof("Content-Length: ") - 1 + NGX_OFF_T_LEN + 2;
-        }
-    }
-
-    if (r->headers_out.content_type && r->headers_out.content_type->value.len) {
-        r->headers_out.content_type->key.len = 0;
+    if (r->headers_out.content_type.len) {
         len += sizeof("Content-Type: ") - 1
-               + r->headers_out.content_type->value.len + 2;
+               + r->headers_out.content_type.len + 2;
 
         if (r->headers_out.charset.len) {
             len += sizeof("; charset=") - 1 + r->headers_out.charset.len;
         }
     }
 
+    if (r->headers_out.content_length == NULL
+        && r->headers_out.content_length_n >= 0)
+    {
+        len += sizeof("Content-Length: ") - 1 + NGX_OFF_T_LEN + 2;
+    }
+
+    if (r->headers_out.last_modified == NULL
+        && r->headers_out.last_modified_time != -1)
+    {
+        len += sizeof("Last-Modified: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;
+    }
+
     if (r->headers_out.location
         && r->headers_out.location->value.len
         && r->headers_out.location->value.data[0] == '/')
     {
-        r->headers_out.location->key.len = 0;
+        r->headers_out.location->hash = 0;
+
         len += sizeof("Location: http://") - 1
                + r->server_name.len + r->headers_out.location->value.len + 2;
 
@@ -255,14 +262,6 @@ ngx_http_header_filter(ngx_http_request_
         }
     }
 
-    if (r->headers_out.last_modified && r->headers_out.last_modified->key.len) {
-        len += r->headers_out.last_modified->key.len
-               + r->headers_out.last_modified->value.len + 2;
-
-    } else if (r->headers_out.last_modified_time != -1) {
-        len += sizeof("Last-Modified: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;
-    }
-
     if (r->chunked) {
         len += sizeof("Transfer-Encoding: chunked" CRLF) - 1;
     }
@@ -303,7 +302,7 @@ ngx_http_header_filter(ngx_http_request_
             i = 0;
         }
 
-        if (header[i].key.len == 0) {
+        if (header[i].hash == 0) {
             continue;
         }
 
@@ -325,16 +324,17 @@ ngx_http_header_filter(ngx_http_request_
                              r->headers_out.status_line.len);
 
     } else {
-        b->last = ngx_cpymem(b->last, http_codes[status].data,
-                             http_codes[status].len);
+        b->last = ngx_cpymem(b->last, ngx_http_status_lines[status].data,
+                             ngx_http_status_lines[status].len);
     }
     *b->last++ = CR; *b->last++ = LF;
 
-    if (!(r->headers_out.server && r->headers_out.server->key.len)) {
-        b->last = ngx_cpymem(b->last, server_string, sizeof(server_string) - 1);
+    if (r->headers_out.server == NULL) {
+        b->last = ngx_cpymem(b->last, ngx_http_server_string,
+                             sizeof(ngx_http_server_string) - 1);
     }
 
-    if (!(r->headers_out.date && r->headers_out.date->key.len)) {
+    if (r->headers_out.date == NULL) {
         b->last = ngx_cpymem(b->last, "Date: ", sizeof("Date: ") - 1);
         b->last = ngx_cpymem(b->last, ngx_cached_http_time.data,
                              ngx_cached_http_time.len);
@@ -342,19 +342,12 @@ ngx_http_header_filter(ngx_http_request_
         *b->last++ = CR; *b->last++ = LF;
     }
 
-    if (r->headers_out.content_length == NULL) {
-        if (r->headers_out.content_length_n >= 0) {
-            b->last = ngx_sprintf(b->last, "Content-Length: %O" CRLF,
-                                  r->headers_out.content_length_n);
-        }
-    }
-
-    if (r->headers_out.content_type && r->headers_out.content_type->value.len) {
+    if (r->headers_out.content_type.len) {
         b->last = ngx_cpymem(b->last, "Content-Type: ",
                              sizeof("Content-Type: ") - 1);
         p = b->last;
-        b->last = ngx_cpymem(b->last, r->headers_out.content_type->value.data,
-                             r->headers_out.content_type->value.len);
+        b->last = ngx_cpymem(b->last, r->headers_out.content_type.data,
+                             r->headers_out.content_type.len);
 
         if (r->headers_out.charset.len) {
             b->last = ngx_cpymem(b->last, "; charset=",
@@ -362,13 +355,32 @@ ngx_http_header_filter(ngx_http_request_
             b->last = ngx_cpymem(b->last, r->headers_out.charset.data,
                                  r->headers_out.charset.len);
 
-            r->headers_out.content_type->value.len = b->last - p;
-            r->headers_out.content_type->value.data = p;
+            /* update r->headers_out.content_type for possible logging */
+
+            r->headers_out.content_type.len = b->last - p;
+            r->headers_out.content_type.data = p;
         }
 
         *b->last++ = CR; *b->last++ = LF;
     }
 
+    if (r->headers_out.content_length == NULL
+        && r->headers_out.content_length_n >= 0)
+    {
+        b->last = ngx_sprintf(b->last, "Content-Length: %O" CRLF,
+                              r->headers_out.content_length_n);
+    }
+
+    if (r->headers_out.last_modified == NULL
+        && r->headers_out.last_modified_time != -1)
+    {
+        b->last = ngx_cpymem(b->last, "Last-Modified: ",
+                             sizeof("Last-Modified: ") - 1);
+        b->last = ngx_http_time(b->last, r->headers_out.last_modified_time);
+
+        *b->last++ = CR; *b->last++ = LF;
+    }
+
     if (r->headers_out.location
         && r->headers_out.location->value.len
         && r->headers_out.location->value.data[0] == '/')
@@ -386,22 +398,14 @@ ngx_http_header_filter(ngx_http_request_
         b->last = ngx_cpymem(b->last, r->headers_out.location->value.data,
                              r->headers_out.location->value.len);
 
+        /* update r->headers_out.location->value for possible logging */
+
         r->headers_out.location->value.len = b->last - p;
         r->headers_out.location->value.data = p;
 
         *b->last++ = CR; *b->last++ = LF;
     }
 
-    if (!(r->headers_out.last_modified && r->headers_out.last_modified->key.len)
-        && r->headers_out.last_modified_time != -1)
-    {
-        b->last = ngx_cpymem(b->last, "Last-Modified: ",
-                             sizeof("Last-Modified: ") - 1);
-        b->last = ngx_http_time(b->last, r->headers_out.last_modified_time);
-
-        *b->last++ = CR; *b->last++ = LF;
-    }
-
     if (r->chunked) {
         b->last = ngx_cpymem(b->last, "Transfer-Encoding: chunked" CRLF,
                              sizeof("Transfer-Encoding: chunked" CRLF) - 1);
@@ -436,7 +440,7 @@ ngx_http_header_filter(ngx_http_request_
             i = 0;
         }
 
-        if (header[i].key.len == 0) {
+        if (header[i].hash == 0) {
             continue;
         }