shrpx: Add --no-via option

If --no-via option is given, shrpx does not append to Via header
field. If Via header field is received, it is left unaltered.
This commit is contained in:
Tatsuhiro Tsujikawa 2013-01-09 22:01:25 +09:00
parent 4d1f1f2395
commit c45fa16f94
7 changed files with 56 additions and 32 deletions

View File

@ -351,6 +351,7 @@ void fill_default_config()
mod_config()->spdy_max_concurrent_streams = mod_config()->spdy_max_concurrent_streams =
SPDYLAY_INITIAL_MAX_CONCURRENT_STREAMS; SPDYLAY_INITIAL_MAX_CONCURRENT_STREAMS;
mod_config()->add_x_forwarded_for = false; mod_config()->add_x_forwarded_for = false;
mod_config()->no_via = false;
mod_config()->accesslog = false; mod_config()->accesslog = false;
set_config_str(&mod_config()->conf_path, "/etc/shrpx/shrpx.conf"); set_config_str(&mod_config()->conf_path, "/etc/shrpx/shrpx.conf");
mod_config()->syslog = false; mod_config()->syslog = false;
@ -518,6 +519,9 @@ void print_help(std::ostream& out)
<< " --add-x-forwarded-for\n" << " --add-x-forwarded-for\n"
<< " Append X-Forwarded-For header field to the\n" << " Append X-Forwarded-For header field to the\n"
<< " downstream request.\n" << " downstream request.\n"
<< " --no-via Don't append to Via header field. If Via\n"
<< " header field is received, it is left\n"
<< " unaltered.\n"
<< " -D, --daemon Run in a background. If -D is used, the\n" << " -D, --daemon Run in a background. If -D is used, the\n"
<< " current working directory is changed to '/'.\n" << " current working directory is changed to '/'.\n"
<< " --pid-file=<PATH> Set path to save PID of this program.\n" << " --pid-file=<PATH> Set path to save PID of this program.\n"
@ -575,6 +579,7 @@ int main(int argc, char **argv)
{"backend-ipv4", no_argument, &flag, 20 }, {"backend-ipv4", no_argument, &flag, 20 },
{"backend-ipv6", no_argument, &flag, 21 }, {"backend-ipv6", no_argument, &flag, 21 },
{"private-key-passwd-file", required_argument, &flag, 22}, {"private-key-passwd-file", required_argument, &flag, 22},
{"no-via", no_argument, &flag, 23},
{0, 0, 0, 0 } {0, 0, 0, 0 }
}; };
int option_index = 0; int option_index = 0;
@ -717,6 +722,10 @@ int main(int argc, char **argv)
cmdcfgs.push_back(std::make_pair(SHRPX_OPT_PRIVATE_KEY_PASSWD_FILE, cmdcfgs.push_back(std::make_pair(SHRPX_OPT_PRIVATE_KEY_PASSWD_FILE,
optarg)); optarg));
break; break;
case 23:
// --no-via
cmdcfgs.push_back(std::make_pair(SHRPX_OPT_NO_VIA, "yes"));
break;
default: default:
break; break;
} }

View File

@ -57,6 +57,7 @@ const char SHRPX_OPT_DAEMON[] = "daemon";
const char SHRPX_OPT_SPDY_PROXY[] = "spdy-proxy"; const char SHRPX_OPT_SPDY_PROXY[] = "spdy-proxy";
const char SHRPX_OPT_CLIENT_PROXY[] = "client-proxy"; const char SHRPX_OPT_CLIENT_PROXY[] = "client-proxy";
const char SHRPX_OPT_ADD_X_FORWARDED_FOR[] = "add-x-forwarded-for"; const char SHRPX_OPT_ADD_X_FORWARDED_FOR[] = "add-x-forwarded-for";
const char SHRPX_OPT_NO_VIA[] = "no-via";
const char const char
SHRPX_OPT_FRONTEND_SPDY_READ_TIMEOUT[] = "frontend-spdy-read-timeout"; SHRPX_OPT_FRONTEND_SPDY_READ_TIMEOUT[] = "frontend-spdy-read-timeout";
const char SHRPX_OPT_FRONTEND_READ_TIMEOUT[] = "frontend-read-timeout"; const char SHRPX_OPT_FRONTEND_READ_TIMEOUT[] = "frontend-read-timeout";
@ -209,6 +210,8 @@ int parse_config(const char *opt, const char *optarg)
mod_config()->client_proxy = util::strieq(optarg, "yes"); mod_config()->client_proxy = util::strieq(optarg, "yes");
} else if(util::strieq(opt, SHRPX_OPT_ADD_X_FORWARDED_FOR)) { } else if(util::strieq(opt, SHRPX_OPT_ADD_X_FORWARDED_FOR)) {
mod_config()->add_x_forwarded_for = util::strieq(optarg, "yes"); mod_config()->add_x_forwarded_for = util::strieq(optarg, "yes");
} else if(util::strieq(opt, SHRPX_OPT_NO_VIA)) {
mod_config()->no_via = util::strieq(optarg, "yes");
} else if(util::strieq(opt, SHRPX_OPT_FRONTEND_SPDY_READ_TIMEOUT)) { } else if(util::strieq(opt, SHRPX_OPT_FRONTEND_SPDY_READ_TIMEOUT)) {
timeval tv = {strtol(optarg, 0, 10), 0}; timeval tv = {strtol(optarg, 0, 10), 0};
mod_config()->spdy_upstream_read_timeout = tv; mod_config()->spdy_upstream_read_timeout = tv;

View File

@ -48,6 +48,7 @@ extern const char SHRPX_OPT_DAEMON[];
extern const char SHRPX_OPT_SPDY_PROXY[]; extern const char SHRPX_OPT_SPDY_PROXY[];
extern const char SHRPX_OPT_CLIENT_PROXY[]; extern const char SHRPX_OPT_CLIENT_PROXY[];
extern const char SHRPX_OPT_ADD_X_FORWARDED_FOR[]; extern const char SHRPX_OPT_ADD_X_FORWARDED_FOR[];
extern const char SHRPX_OPT_NO_VIA[];
extern const char SHRPX_OPT_FRONTEND_SPDY_READ_TIMEOUT[]; extern const char SHRPX_OPT_FRONTEND_SPDY_READ_TIMEOUT[];
extern const char SHRPX_OPT_FRONTEND_READ_TIMEOUT[]; extern const char SHRPX_OPT_FRONTEND_READ_TIMEOUT[];
extern const char SHRPX_OPT_FRONTEND_WRITE_TIMEOUT[]; extern const char SHRPX_OPT_FRONTEND_WRITE_TIMEOUT[];
@ -102,6 +103,7 @@ struct Config {
bool spdy_proxy; bool spdy_proxy;
bool client_proxy; bool client_proxy;
bool add_x_forwarded_for; bool add_x_forwarded_for;
bool no_via;
bool accesslog; bool accesslog;
size_t spdy_upstream_window_bits; size_t spdy_upstream_window_bits;
size_t spdy_downstream_window_bits; size_t spdy_downstream_window_bits;

View File

@ -129,7 +129,7 @@ int HttpDownstreamConnection::push_request_headers()
util::strieq((*i).first.c_str(), "proxy-connection")) { util::strieq((*i).first.c_str(), "proxy-connection")) {
continue; continue;
} }
if(util::strieq((*i).first.c_str(), "via")) { if(!get_config()->no_via && util::strieq((*i).first.c_str(), "via")) {
via_value = (*i).second; via_value = (*i).second;
continue; continue;
} }
@ -171,14 +171,16 @@ int HttpDownstreamConnection::push_request_headers()
} }
hdrs += "\r\n"; hdrs += "\r\n";
} }
if(!get_config()->no_via) {
hdrs += "Via: "; hdrs += "Via: ";
hdrs += via_value;
if(!via_value.empty()) { if(!via_value.empty()) {
hdrs += via_value;
hdrs += ", "; hdrs += ", ";
} }
hdrs += http::create_via_header_value(downstream_->get_request_major(), hdrs += http::create_via_header_value(downstream_->get_request_major(),
downstream_->get_request_minor()); downstream_->get_request_minor());
hdrs += "\r\n"; hdrs += "\r\n";
}
hdrs += "\r\n"; hdrs += "\r\n";
if(ENABLE_LOG) { if(ENABLE_LOG) {

View File

@ -604,7 +604,8 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream)
util::strieq((*i).first.c_str(), "connection") || util::strieq((*i).first.c_str(), "connection") ||
util:: strieq((*i).first.c_str(), "proxy-connection")) { util:: strieq((*i).first.c_str(), "proxy-connection")) {
// These are ignored // These are ignored
} else if(util::strieq((*i).first.c_str(), "via")) { } else if(!get_config()->no_via &&
util::strieq((*i).first.c_str(), "via")) {
via_value = (*i).second; via_value = (*i).second;
} else { } else {
hdrs += (*i).first; hdrs += (*i).first;
@ -627,15 +628,17 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream)
} else { } else {
hdrs += "Connection: close\r\n"; hdrs += "Connection: close\r\n";
} }
if(!get_config()->no_via) {
hdrs += "Via: "; hdrs += "Via: ";
hdrs += via_value;
if(!via_value.empty()) { if(!via_value.empty()) {
hdrs += via_value;
hdrs += ", "; hdrs += ", ";
} }
hdrs += http::create_via_header_value hdrs += http::create_via_header_value
(downstream->get_response_major(), downstream->get_response_minor()); (downstream->get_response_major(), downstream->get_response_minor());
hdrs += "\r\n"; hdrs += "\r\n";
}
hdrs += "\r\n"; hdrs += "\r\n";
if(ENABLE_LOG) { if(ENABLE_LOG) {
const char *hdrp; const char *hdrp;

View File

@ -245,7 +245,8 @@ int SpdyDownstreamConnection::push_request_headers()
util::strieq((*i).first.c_str(), "connection") || util::strieq((*i).first.c_str(), "connection") ||
util:: strieq((*i).first.c_str(), "proxy-connection")) { util:: strieq((*i).first.c_str(), "proxy-connection")) {
// These are ignored // These are ignored
} else if(util::strieq((*i).first.c_str(), "via")) { } else if(!get_config()->no_via &&
util::strieq((*i).first.c_str(), "via")) {
via_value = (*i).second; via_value = (*i).second;
} else if(util::strieq((*i).first.c_str(), "x-forwarded-for")) { } else if(util::strieq((*i).first.c_str(), "x-forwarded-for")) {
xff_value = (*i).second; xff_value = (*i).second;
@ -282,14 +283,15 @@ int SpdyDownstreamConnection::push_request_headers()
nv[hdidx++] = "x-forwarded-proto"; nv[hdidx++] = "x-forwarded-proto";
nv[hdidx++] = "http"; nv[hdidx++] = "http";
} }
if(!get_config()->no_via) {
if(!via_value.empty()) { if(!via_value.empty()) {
via_value += ", "; via_value += ", ";
} }
via_value += http::create_via_header_value(downstream_->get_request_major(), via_value += http::create_via_header_value
downstream_->get_request_minor()); (downstream_->get_request_major(), downstream_->get_request_minor());
nv[hdidx++] = "via"; nv[hdidx++] = "via";
nv[hdidx++] = via_value.c_str(); nv[hdidx++] = via_value.c_str();
}
nv[hdidx++] = 0; nv[hdidx++] = 0;
if(ENABLE_LOG) { if(ENABLE_LOG) {
std::stringstream ss; std::stringstream ss;

View File

@ -755,20 +755,23 @@ int SpdyUpstream::on_downstream_header_complete(Downstream *downstream)
util::strieq((*i).first.c_str(), "connection") || util::strieq((*i).first.c_str(), "connection") ||
util:: strieq((*i).first.c_str(), "proxy-connection")) { util:: strieq((*i).first.c_str(), "proxy-connection")) {
// These are ignored // These are ignored
} else if(util::strieq((*i).first.c_str(), "via")) { } else if(!get_config()->no_via &&
util::strieq((*i).first.c_str(), "via")) {
via_value = (*i).second; via_value = (*i).second;
} else { } else {
nv[hdidx++] = (*i).first.c_str(); nv[hdidx++] = (*i).first.c_str();
nv[hdidx++] = (*i).second.c_str(); nv[hdidx++] = (*i).second.c_str();
} }
} }
if(!get_config()->no_via) {
if(!via_value.empty()) { if(!via_value.empty()) {
via_value += ", "; via_value += ", ";
} }
via_value += http::create_via_header_value(downstream->get_response_major(), via_value += http::create_via_header_value
downstream->get_response_minor()); (downstream->get_response_major(), downstream->get_response_minor());
nv[hdidx++] = "via"; nv[hdidx++] = "via";
nv[hdidx++] = via_value.c_str(); nv[hdidx++] = via_value.c_str();
}
nv[hdidx++] = 0; nv[hdidx++] = 0;
if(ENABLE_LOG) { if(ENABLE_LOG) {
std::stringstream ss; std::stringstream ss;