diff --git a/gennghttpxfun.py b/gennghttpxfun.py index f76abcde..4f99cdb3 100755 --- a/gennghttpxfun.py +++ b/gennghttpxfun.py @@ -135,6 +135,7 @@ OPTIONS = [ "api-max-request-body", "backend-max-backoff", "server-name", + "no-server-rewrite", ] LOGVARS = [ diff --git a/src/shrpx.cc b/src/shrpx.cc index 98c0f12b..9b600ab5 100644 --- a/src/shrpx.cc +++ b/src/shrpx.cc @@ -2208,6 +2208,10 @@ HTTP: --server-name= Change server response header field value to . Default: )" << get_config()->http.server_name << R"( + --no-server-rewrite + Don't rewrite server header field in default mode. When + --http2-proxy is used, these headers will not be altered + regardless of this option. API: --api-max-request-body= @@ -2837,6 +2841,7 @@ int main(int argc, char **argv) { {SHRPX_OPT_API_MAX_REQUEST_BODY.c_str(), required_argument, &flag, 126}, {SHRPX_OPT_BACKEND_MAX_BACKOFF.c_str(), required_argument, &flag, 127}, {SHRPX_OPT_SERVER_NAME.c_str(), required_argument, &flag, 128}, + {SHRPX_OPT_NO_SERVER_REWRITE.c_str(), no_argument, &flag, 129}, {nullptr, 0, nullptr, 0}}; int option_index = 0; @@ -3438,6 +3443,11 @@ int main(int argc, char **argv) { // --server-name cmdcfgs.emplace_back(SHRPX_OPT_SERVER_NAME, StringRef{optarg}); break; + case 129: + // --no-server-rewrite + cmdcfgs.emplace_back(SHRPX_OPT_NO_SERVER_REWRITE, + StringRef::from_lit("yes")); + break; default: break; } diff --git a/src/shrpx_config.cc b/src/shrpx_config.cc index d84e7f0f..542700b3 100644 --- a/src/shrpx_config.cc +++ b/src/shrpx_config.cc @@ -1288,6 +1288,9 @@ int option_lookup_token(const char *name, size_t namelen) { case 17: switch (name[16]) { case 'e': + if (util::strieq_l("no-server-rewrit", name, 16)) { + return SHRPX_OPTID_NO_SERVER_REWRITE; + } if (util::strieq_l("worker-write-rat", name, 16)) { return SHRPX_OPTID_WORKER_WRITE_RATE; } @@ -2682,6 +2685,10 @@ int parse_config(Config *config, int optid, const StringRef &opt, config->http.server_name = ImmutableString{std::begin(optarg), std::end(optarg)}; + return 0; + case SHRPX_OPTID_NO_SERVER_REWRITE: + config->http.no_server_rewrite = util::strieq_l("yes", optarg); + return 0; case SHRPX_OPTID_CONF: LOG(WARN) << "conf: ignored"; diff --git a/src/shrpx_config.h b/src/shrpx_config.h index 0a1b86bb..83570052 100644 --- a/src/shrpx_config.h +++ b/src/shrpx_config.h @@ -285,6 +285,8 @@ constexpr auto SHRPX_OPT_API_MAX_REQUEST_BODY = constexpr auto SHRPX_OPT_BACKEND_MAX_BACKOFF = StringRef::from_lit("backend-max-backoff"); constexpr auto SHRPX_OPT_SERVER_NAME = StringRef::from_lit("server-name"); +constexpr auto SHRPX_OPT_NO_SERVER_REWRITE = + StringRef::from_lit("no-server-rewrite"); constexpr size_t SHRPX_OBFUSCATED_NODE_LENGTH = 8; @@ -561,6 +563,7 @@ struct HttpConfig { bool no_via; bool no_location_rewrite; bool no_host_rewrite; + bool no_server_rewrite; }; struct Http2Config { @@ -832,6 +835,7 @@ enum { SHRPX_OPTID_NO_LOCATION_REWRITE, SHRPX_OPTID_NO_OCSP, SHRPX_OPTID_NO_SERVER_PUSH, + SHRPX_OPTID_NO_SERVER_REWRITE, SHRPX_OPTID_NO_VIA, SHRPX_OPTID_NPN_LIST, SHRPX_OPTID_OCSP_UPDATE_INTERVAL, diff --git a/src/shrpx_http2_upstream.cc b/src/shrpx_http2_upstream.cc index 42ec9561..30cf844d 100644 --- a/src/shrpx_http2_upstream.cc +++ b/src/shrpx_http2_upstream.cc @@ -1537,7 +1537,7 @@ int Http2Upstream::on_downstream_header_complete(Downstream *downstream) { http2::copy_headers_to_nva_nocopy(nva, resp.fs.headers()); - if (!get_config()->http2_proxy) { + if (!get_config()->http2_proxy && !httpconf.no_server_rewrite) { nva.push_back( http2::make_nv_ls_nocopy("server", StringRef{httpconf.server_name})); } else { diff --git a/src/shrpx_https_upstream.cc b/src/shrpx_https_upstream.cc index 2bfaaf13..eb6942c9 100644 --- a/src/shrpx_https_upstream.cc +++ b/src/shrpx_https_upstream.cc @@ -1078,7 +1078,7 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream) { } } - if (!get_config()->http2_proxy) { + if (!get_config()->http2_proxy && !httpconf.no_server_rewrite) { buf->append("Server: "); buf->append(httpconf.server_name); buf->append("\r\n"); diff --git a/src/shrpx_spdy_upstream.cc b/src/shrpx_spdy_upstream.cc index 0bd86c4b..efb55df7 100644 --- a/src/shrpx_spdy_upstream.cc +++ b/src/shrpx_spdy_upstream.cc @@ -1100,7 +1100,7 @@ int SpdyUpstream::on_downstream_header_complete(Downstream *downstream) { nv[hdidx++] = hd.value.c_str(); } - if (!get_config()->http2_proxy) { + if (!get_config()->http2_proxy && !httpconf.no_server_rewrite) { nv[hdidx++] = "server"; nv[hdidx++] = httpconf.server_name.c_str(); } else {