Mercurial > hg > nginx
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) {