comparison 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
comparison
equal deleted inserted replaced
6431:3b9c6b91d988 6432:cf3e75cfa951
44 NULL, /* exit master */ 44 NULL, /* exit master */
45 NGX_MODULE_V1_PADDING 45 NGX_MODULE_V1_PADDING
46 }; 46 };
47 47
48 48
49 static char ngx_http_server_string[] = "Server: nginx" CRLF; 49 static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
50 static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF; 50 static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
51 51
52 52
53 static ngx_str_t ngx_http_status_lines[] = { 53 static ngx_str_t ngx_http_status_lines[] = {
54 54
55 ngx_string("200 OK"), 55 ngx_string("200 OK"),
150 static ngx_int_t 150 static ngx_int_t
151 ngx_http_header_filter(ngx_http_request_t *r) 151 ngx_http_header_filter(ngx_http_request_t *r)
152 { 152 {
153 u_char *p; 153 u_char *p;
154 size_t len; 154 size_t len;
155 ngx_str_t host, *status_line; 155 ngx_str_t host, *status_line, tokens;
156 ngx_buf_t *b; 156 ngx_buf_t *b;
157 ngx_uint_t status, i, port; 157 ngx_uint_t status, i, port;
158 ngx_chain_t out; 158 ngx_chain_t out;
159 ngx_list_part_t *part; 159 ngx_list_part_t *part;
160 ngx_table_elt_t *header; 160 ngx_table_elt_t *header;
276 } 276 }
277 277
278 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); 278 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
279 279
280 if (r->headers_out.server == NULL) { 280 if (r->headers_out.server == NULL) {
281 len += clcf->server_tokens ? sizeof(ngx_http_server_full_string) - 1: 281 if (clcf->server_tokens == 0) {
282 sizeof(ngx_http_server_string) - 1; 282 ngx_str_set(&tokens, ngx_http_server_string);
283
284 } else if (clcf->server_tokens == 1) {
285 ngx_str_set(&tokens, ngx_http_server_full_string);
286
287 } else {
288 if (ngx_http_complex_value(r, &clcf->server_tokens_value, &tokens)
289 != NGX_OK)
290 {
291 return NGX_ERROR;
292 }
293
294 if (tokens.len == 3
295 && ngx_strncmp(tokens.data, "off", 3) == 0)
296 {
297 ngx_str_set(&tokens, ngx_http_server_string);
298
299 } else if (tokens.len) {
300 ngx_str_set(&tokens, ngx_http_server_full_string);
301 }
302 }
303
304 len += tokens.len;
283 } 305 }
284 306
285 if (r->headers_out.date == NULL) { 307 if (r->headers_out.date == NULL) {
286 len += sizeof("Date: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1; 308 len += sizeof("Date: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;
287 } 309 }
453 } else { 475 } else {
454 b->last = ngx_sprintf(b->last, "%03ui ", status); 476 b->last = ngx_sprintf(b->last, "%03ui ", status);
455 } 477 }
456 *b->last++ = CR; *b->last++ = LF; 478 *b->last++ = CR; *b->last++ = LF;
457 479
458 if (r->headers_out.server == NULL) { 480 if (r->headers_out.server == NULL && tokens.len) {
459 if (clcf->server_tokens) { 481 b->last = ngx_cpymem(b->last, tokens.data, tokens.len);
460 p = (u_char *) ngx_http_server_full_string;
461 len = sizeof(ngx_http_server_full_string) - 1;
462
463 } else {
464 p = (u_char *) ngx_http_server_string;
465 len = sizeof(ngx_http_server_string) - 1;
466 }
467
468 b->last = ngx_cpymem(b->last, p, len);
469 } 482 }
470 483
471 if (r->headers_out.date == NULL) { 484 if (r->headers_out.date == NULL) {
472 b->last = ngx_cpymem(b->last, "Date: ", sizeof("Date: ") - 1); 485 b->last = ngx_cpymem(b->last, "Date: ", sizeof("Date: ") - 1);
473 b->last = ngx_cpymem(b->last, ngx_cached_http_time.data, 486 b->last = ngx_cpymem(b->last, ngx_cached_http_time.data,