Mercurial > hg > nginx
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, |