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,