diff --git a/src/shrpx_client_handler.cc b/src/shrpx_client_handler.cc index 354b95e7..89b2590b 100644 --- a/src/shrpx_client_handler.cc +++ b/src/shrpx_client_handler.cc @@ -706,7 +706,8 @@ std::string construct_absolute_request_uri(Downstream *downstream) { } std::string uri; if (downstream->get_request_http2_scheme().empty()) { - // this comes from HTTP/1 upstream without scheme. Just use http. + // We may have to log the request which lacks scheme (e.g., + // http/1.1 with origin form). uri += "http://"; } else { uri += downstream->get_request_http2_scheme(); diff --git a/src/shrpx_http2_downstream_connection.cc b/src/shrpx_http2_downstream_connection.cc index f5cba83e..41417a8b 100644 --- a/src/shrpx_http2_downstream_connection.cc +++ b/src/shrpx_http2_downstream_connection.cc @@ -330,14 +330,9 @@ int Http2DownstreamConnection::push_request_headers() { http2::make_nv_ls(":authority", downstream_->get_request_path())); } } else { - if (!downstream_->get_request_http2_scheme().empty()) { - nva.push_back(http2::make_nv_ls(":scheme", - downstream_->get_request_http2_scheme())); - } else if (client_handler_->get_ssl()) { - nva.push_back(http2::make_nv_ll(":scheme", "https")); - } else { - nva.push_back(http2::make_nv_ll(":scheme", "http")); - } + assert(!downstream_->get_request_http2_scheme().empty()); + nva.push_back( + http2::make_nv_ls(":scheme", downstream_->get_request_http2_scheme())); if (authority) { nva.push_back(http2::make_nv_lc(":authority", authority)); diff --git a/src/shrpx_http2_upstream.cc b/src/shrpx_http2_upstream.cc index 856ae04f..165c6272 100644 --- a/src/shrpx_http2_upstream.cc +++ b/src/shrpx_http2_upstream.cc @@ -107,35 +107,6 @@ int on_stream_close_callback(nghttp2_session *session, int32_t stream_id, int Http2Upstream::upgrade_upstream(HttpsUpstream *http) { int rv; - // to deduce :scheme and :authority, first we have to parse request - // URI. - http_parser_url u = {}; - auto &url = http->get_downstream()->get_request_path(); - - std::string scheme, authority; - rv = http_parser_parse_url(url.c_str(), url.size(), 0, &u); - if (rv == 0) { - http2::copy_url_component(scheme, &u, UF_SCHEMA, url.c_str()); - http2::copy_url_component(authority, &u, UF_HOST, url.c_str()); - } - if (scheme.empty()) { - if (handler_->get_ssl()) { - scheme = "https"; - } else { - scheme = "http"; - } - } - if (!authority.empty()) { - if (authority.find(":") != std::string::npos) { - authority = "[" + authority; - authority += "]"; - } - if (u.field_set & (1 << UF_PORT)) { - authority += ":"; - authority += util::utos(u.port); - } - } - auto http2_settings = http->get_downstream()->get_http2_settings(); util::to_base64(http2_settings); @@ -159,8 +130,6 @@ int Http2Upstream::upgrade_upstream(HttpsUpstream *http) { downstream->reset_upstream_rtimer(); downstream->set_stream_id(1); downstream->set_priority(0); - downstream->set_request_http2_authority(authority); - downstream->set_request_http2_scheme(scheme); auto ptr = downstream.get(); diff --git a/src/shrpx_http_downstream_connection.cc b/src/shrpx_http_downstream_connection.cc index 1840f753..6329e55c 100644 --- a/src/shrpx_http_downstream_connection.cc +++ b/src/shrpx_http_downstream_connection.cc @@ -260,14 +260,10 @@ int HttpDownstreamConnection::push_request_headers() { } else if (get_config()->http2_proxy || get_config()->client_proxy) { // Construct absolute-form request target because we are going to // send a request to a HTTP/1 proxy. - if (downstream_->get_request_http2_scheme().empty()) { - // this comes from HTTP/1 upstream, use http scheme. We don't - // support https forward link yet. - hdrs += "http://"; - } else { - hdrs += downstream_->get_request_http2_scheme(); - hdrs += "://"; - } + assert(!downstream_->get_request_http2_scheme().empty()); + hdrs += downstream_->get_request_http2_scheme(); + hdrs += "://"; + if (authority) { hdrs += authority; } else { @@ -332,14 +328,9 @@ int HttpDownstreamConnection::push_request_headers() { if (!get_config()->http2_proxy && !get_config()->client_proxy && downstream_->get_request_method() != "CONNECT") { hdrs += "X-Forwarded-Proto: "; - if (!downstream_->get_request_http2_scheme().empty()) { - hdrs += downstream_->get_request_http2_scheme(); - hdrs += "\r\n"; - } else if (client_handler_->get_ssl()) { - hdrs += "https\r\n"; - } else { - hdrs += "http\r\n"; - } + assert(!downstream_->get_request_http2_scheme().empty()); + hdrs += downstream_->get_request_http2_scheme(); + hdrs += "\r\n"; } auto expect = downstream_->get_request_header(http2::HD_EXPECT); if (expect && !util::strifind((*expect).value.c_str(), "100-continue")) { diff --git a/src/shrpx_https_upstream.cc b/src/shrpx_https_upstream.cc index 674f17ba..c14973c2 100644 --- a/src/shrpx_https_upstream.cc +++ b/src/shrpx_https_upstream.cc @@ -219,11 +219,10 @@ void rewrite_request_host_path_from_uri(Downstream *downstream, const char *uri, path.append(uri + fdata.off, fdata.len); } downstream->set_request_path(std::move(path)); - if (get_config()->http2_proxy || get_config()->client_proxy) { - std::string scheme; - http2::copy_url_component(scheme, &u, UF_SCHEMA, uri); - downstream->set_request_http2_scheme(std::move(scheme)); - } + + std::string scheme; + http2::copy_url_component(scheme, &u, UF_SCHEMA, uri); + downstream->set_request_http2_scheme(std::move(scheme)); } } // namespace @@ -286,6 +285,12 @@ int htp_hdrs_completecb(http_parser *htp) { // Request URI should be absolute-form for client proxy mode return -1; } + + if (upstream->get_client_handler()->get_ssl()) { + downstream->set_request_http2_scheme("https"); + } else { + downstream->set_request_http2_scheme("http"); + } } else { rewrite_request_host_path_from_uri(downstream, uri.c_str(), u); }