From ae0533334c70a886ee525d04356c9749d94bf01b Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 1 Feb 2013 23:30:12 +0900 Subject: [PATCH] shrpx: Relay Connection: upgrade header field for HTTP/1.1 connections --- src/shrpx_http_downstream_connection.cc | 10 ++++++++-- src/shrpx_https_upstream.cc | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/shrpx_http_downstream_connection.cc b/src/shrpx_http_downstream_connection.cc index de93b9c..129c801 100644 --- a/src/shrpx_http_downstream_connection.cc +++ b/src/shrpx_http_downstream_connection.cc @@ -118,14 +118,18 @@ int HttpDownstreamConnection::push_request_headers() hdrs += downstream_->get_request_path(); hdrs += " "; hdrs += "HTTP/1.1\r\n"; + bool connection_upgrade = false; std::string via_value; std::string xff_value; const Headers& request_headers = downstream_->get_request_headers(); for(Headers::const_iterator i = request_headers.begin(); i != request_headers.end(); ++i) { - if(util::strieq((*i).first.c_str(), "X-Forwarded-Proto") || + if(util::strieq((*i).first.c_str(), "connection")) { + if(util::strifind((*i).second.c_str(), "upgrade")) { + connection_upgrade = true; + } + } else if(util::strieq((*i).first.c_str(), "X-Forwarded-Proto") || util::strieq((*i).first.c_str(), "keep-alive") || - util::strieq((*i).first.c_str(), "connection") || util::strieq((*i).first.c_str(), "proxy-connection")) { continue; } @@ -149,6 +153,8 @@ int HttpDownstreamConnection::push_request_headers() } if(downstream_->get_request_connection_close()) { hdrs += "Connection: close\r\n"; + } else if(connection_upgrade) { + hdrs += "Connection: upgrade\r\n"; } if(get_config()->add_x_forwarded_for) { hdrs += "X-Forwarded-For: "; diff --git a/src/shrpx_https_upstream.cc b/src/shrpx_https_upstream.cc index 72bd104..e41e9df 100644 --- a/src/shrpx_https_upstream.cc +++ b/src/shrpx_https_upstream.cc @@ -594,6 +594,7 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream) if(LOG_ENABLED(INFO)) { DLOG(INFO, downstream) << "HTTP response header completed"; } + bool connection_upgrade = false; std::string via_value; char temp[16]; snprintf(temp, sizeof(temp), "HTTP/%d.%d ", @@ -604,8 +605,11 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream) hdrs += "\r\n"; for(Headers::const_iterator i = downstream->get_response_headers().begin(); i != downstream->get_response_headers().end(); ++i) { - if(util::strieq((*i).first.c_str(), "keep-alive") || // HTTP/1.0? - util::strieq((*i).first.c_str(), "connection") || + if(util::strieq((*i).first.c_str(), "connection")) { + if(util::strifind((*i).second.c_str(), "upgrade")) { + connection_upgrade = true; + } + } else if(util::strieq((*i).first.c_str(), "keep-alive") || // HTTP/1.0? util:: strieq((*i).first.c_str(), "proxy-connection")) { // These are ignored } else if(!get_config()->no_via && @@ -628,6 +632,8 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream) downstream->get_request_minor() <= 0) { // We add this header for HTTP/1.0 or HTTP/0.9 clients hdrs += "Connection: Keep-Alive\r\n"; + } else if(connection_upgrade) { + hdrs += "Connection: upgrade\r\n"; } } else { hdrs += "Connection: close\r\n";