Mercurial > hg > nginx
comparison src/http/v2/ngx_http_v2_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 | 4ba91a4c66a3 |
children | 602dc42035fe |
comparison
equal
deleted
inserted
replaced
6431:3b9c6b91d988 | 6432:cf3e75cfa951 |
---|---|
126 static ngx_int_t | 126 static ngx_int_t |
127 ngx_http_v2_header_filter(ngx_http_request_t *r) | 127 ngx_http_v2_header_filter(ngx_http_request_t *r) |
128 { | 128 { |
129 u_char status, *pos, *start, *p, *tmp; | 129 u_char status, *pos, *start, *p, *tmp; |
130 size_t len, tmp_len; | 130 size_t len, tmp_len; |
131 ngx_str_t host, location; | 131 ngx_str_t host, location, tokens; |
132 ngx_uint_t i, port; | 132 ngx_uint_t i, port, server_tokens; |
133 ngx_list_part_t *part; | 133 ngx_list_part_t *part; |
134 ngx_table_elt_t *header; | 134 ngx_table_elt_t *header; |
135 ngx_connection_t *fc; | 135 ngx_connection_t *fc; |
136 ngx_http_cleanup_t *cln; | 136 ngx_http_cleanup_t *cln; |
137 ngx_http_v2_out_frame_t *frame; | 137 ngx_http_v2_out_frame_t *frame; |
227 | 227 |
228 len = status ? 1 : 1 + ngx_http_v2_literal_size("418"); | 228 len = status ? 1 : 1 + ngx_http_v2_literal_size("418"); |
229 | 229 |
230 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | 230 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
231 | 231 |
232 server_tokens = clcf->server_tokens; | |
233 | |
232 if (r->headers_out.server == NULL) { | 234 if (r->headers_out.server == NULL) { |
233 len += 1 + (clcf->server_tokens ? nginx_ver_len : sizeof(nginx)); | 235 |
236 if (server_tokens == 0) { | |
237 len += 1 + sizeof(nginx); | |
238 ngx_str_set(&tokens, "nginx"); | |
239 | |
240 } else if (server_tokens == 1) { | |
241 len += 1 + nginx_ver_len; | |
242 ngx_str_set(&tokens, NGINX_VER); | |
243 | |
244 } else { | |
245 if (ngx_http_complex_value(r, &clcf->server_tokens_value, &tokens) | |
246 != NGX_OK) | |
247 { | |
248 return NGX_ERROR; | |
249 } | |
250 | |
251 if (tokens.len == 3 | |
252 && ngx_strncmp(tokens.data, "off", 3) == 0) | |
253 { | |
254 server_tokens = 0; | |
255 len += 1 + sizeof(nginx); | |
256 ngx_str_set(&tokens, "nginx"); | |
257 | |
258 } else if (tokens.len) { | |
259 server_tokens = 1; | |
260 len += 1 + nginx_ver_len; | |
261 ngx_str_set(&tokens, NGINX_VER); | |
262 } | |
263 } | |
234 } | 264 } |
235 | 265 |
236 if (r->headers_out.date == NULL) { | 266 if (r->headers_out.date == NULL) { |
237 len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT"); | 267 len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT"); |
238 } | 268 } |
432 *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_STATUS_INDEX); | 462 *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_STATUS_INDEX); |
433 *pos++ = NGX_HTTP_V2_ENCODE_RAW | 3; | 463 *pos++ = NGX_HTTP_V2_ENCODE_RAW | 3; |
434 pos = ngx_sprintf(pos, "%03ui", r->headers_out.status); | 464 pos = ngx_sprintf(pos, "%03ui", r->headers_out.status); |
435 } | 465 } |
436 | 466 |
437 if (r->headers_out.server == NULL) { | 467 if (r->headers_out.server == NULL && tokens.len) { |
438 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, | 468 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, |
439 "http2 output header: \"server: %s\"", | 469 "http2 output header: \"server: %V\"", |
440 clcf->server_tokens ? NGINX_VER : "nginx"); | 470 &tokens); |
441 | 471 |
442 *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_SERVER_INDEX); | 472 *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_SERVER_INDEX); |
443 | 473 |
444 if (clcf->server_tokens) { | 474 if (server_tokens == 0) { |
475 pos = ngx_cpymem(pos, nginx, sizeof(nginx)); | |
476 | |
477 } else { | |
445 if (nginx_ver[0] == '\0') { | 478 if (nginx_ver[0] == '\0') { |
446 p = ngx_http_v2_write_value(nginx_ver, (u_char *) NGINX_VER, | 479 p = ngx_http_v2_write_value(nginx_ver, (u_char *) NGINX_VER, |
447 sizeof(NGINX_VER) - 1, tmp); | 480 sizeof(NGINX_VER) - 1, tmp); |
448 nginx_ver_len = p - nginx_ver; | 481 nginx_ver_len = p - nginx_ver; |
449 } | 482 } |
450 | 483 |
451 pos = ngx_cpymem(pos, nginx_ver, nginx_ver_len); | 484 pos = ngx_cpymem(pos, nginx_ver, nginx_ver_len); |
452 | |
453 } else { | |
454 pos = ngx_cpymem(pos, nginx, sizeof(nginx)); | |
455 } | 485 } |
456 } | 486 } |
457 | 487 |
458 if (r->headers_out.date == NULL) { | 488 if (r->headers_out.date == NULL) { |
459 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, | 489 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, |