diff src/http/ngx_http_header_filter_module.c @ 6432:cf3e75cfa951

Added variables support to server_tokens. It can now be set to "off" conditionally, e.g. using the map directive. An empty value will disable the emission of the Server: header and the signature in error messages generated by nginx. Any other value is treated as "on", meaning that full nginx version is emitted in the Server: header and error messages generated by nginx.
author Ruslan Ermilov <ru@nginx.com>
date Tue, 15 Mar 2016 13:36:19 +0300
parents e8d24b6d7f73
children 6b72414dfb4f
line wrap: on
line diff
--- a/src/http/ngx_http_header_filter_module.c
+++ b/src/http/ngx_http_header_filter_module.c
@@ -46,8 +46,8 @@ ngx_module_t  ngx_http_header_filter_mod
 };
 
 
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
-static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
+static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
+static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
 
 
 static ngx_str_t ngx_http_status_lines[] = {
@@ -152,7 +152,7 @@ ngx_http_header_filter(ngx_http_request_
 {
     u_char                    *p;
     size_t                     len;
-    ngx_str_t                  host, *status_line;
+    ngx_str_t                  host, *status_line, tokens;
     ngx_buf_t                 *b;
     ngx_uint_t                 status, i, port;
     ngx_chain_t                out;
@@ -278,8 +278,30 @@ ngx_http_header_filter(ngx_http_request_
     clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
 
     if (r->headers_out.server == NULL) {
-        len += clcf->server_tokens ? sizeof(ngx_http_server_full_string) - 1:
-                                     sizeof(ngx_http_server_string) - 1;
+        if (clcf->server_tokens == 0) {
+            ngx_str_set(&tokens, ngx_http_server_string);
+
+        } else if (clcf->server_tokens == 1) {
+            ngx_str_set(&tokens, ngx_http_server_full_string);
+
+        } else {
+            if (ngx_http_complex_value(r, &clcf->server_tokens_value, &tokens)
+                != NGX_OK)
+            {
+                return NGX_ERROR;
+            }
+
+            if (tokens.len == 3
+                && ngx_strncmp(tokens.data, "off", 3) == 0)
+            {
+                ngx_str_set(&tokens, ngx_http_server_string);
+
+            } else if (tokens.len) {
+                ngx_str_set(&tokens, ngx_http_server_full_string);
+            }
+        }
+
+        len += tokens.len;
     }
 
     if (r->headers_out.date == NULL) {
@@ -455,17 +477,8 @@ ngx_http_header_filter(ngx_http_request_
     }
     *b->last++ = CR; *b->last++ = LF;
 
-    if (r->headers_out.server == NULL) {
-        if (clcf->server_tokens) {
-            p = (u_char *) ngx_http_server_full_string;
-            len = sizeof(ngx_http_server_full_string) - 1;
-
-        } else {
-            p = (u_char *) ngx_http_server_string;
-            len = sizeof(ngx_http_server_string) - 1;
-        }
-
-        b->last = ngx_cpymem(b->last, p, len);
+    if (r->headers_out.server == NULL && tokens.len) {
+        b->last = ngx_cpymem(b->last, tokens.data, tokens.len);
     }
 
     if (r->headers_out.date == NULL) {