From 3ddc446ba2c65677e859425232ce1adf716697f3 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Thu, 26 Jan 2017 01:04:27 +0900 Subject: [PATCH] nghttpx: Enable backend pattern matching with http2-proxy --- src/shrpx.cc | 8 +++++--- src/shrpx_client_handler.cc | 13 +++++++------ src/shrpx_config.cc | 13 ------------- src/shrpx_https_upstream.cc | 11 +++-------- 4 files changed, 15 insertions(+), 30 deletions(-) diff --git a/src/shrpx.cc b/src/shrpx.cc index b636cba4..e7e52540 100644 --- a/src/shrpx.cc +++ b/src/shrpx.cc @@ -1543,8 +1543,7 @@ Connections: with "unix:" (e.g., unix:/var/run/backend.sock). Optionally, if s are given, the backend address - is only used if request matches the pattern. If - --http2-proxy is used, s are ignored. The + is only used if request matches the pattern. The pattern matching is closely designed to ServeMux in net/http package of Go programming language. consists of path, host + path or just host. The path @@ -1559,7 +1558,10 @@ Connections: request host. If host alone is given, "/" is appended to it, so that it matches all request paths under the host (e.g., specifying "nghttp2.org" equals to - "nghttp2.org/"). + "nghttp2.org/"). CONNECT method is treated specially. + It does not have path, and we don't allow empty path. + To workaround this, we assume that CONNECT method has + "/" as path. Patterns with host take precedence over patterns with just path. Then, longer patterns take precedence over diff --git a/src/shrpx_client_handler.cc b/src/shrpx_client_handler.cc index d60057fe..68d97877 100644 --- a/src/shrpx_client_handler.cc +++ b/src/shrpx_client_handler.cc @@ -977,18 +977,19 @@ ClientHandler::get_downstream_connection(Downstream *downstream) { return make_unique(); } + auto &balloc = downstream->get_block_allocator(); + // Fast path. If we have one group, it must be catch-all group. // proxy mode falls in this case. if (groups.size() == 1) { group_idx = 0; } else if (req.method == HTTP_CONNECT) { - // We don't know how to treat CONNECT request in host-path - // mapping. It most likely appears in proxy scenario. Since we - // have dealt with proxy case already, just use catch-all group. - group_idx = catch_all; + // CONNECT method does not have path. But we requires path in + // host-path mapping. As workaround, we assume that path is "/". + group_idx = match_downstream_addr_group(routerconf, req.authority, + StringRef::from_lit("/"), groups, + catch_all, balloc); } else { - auto &balloc = downstream->get_block_allocator(); - if (!req.authority.empty()) { group_idx = match_downstream_addr_group( routerconf, req.authority, req.path, groups, catch_all, balloc); diff --git a/src/shrpx_config.cc b/src/shrpx_config.cc index 56d265ca..992cc788 100644 --- a/src/shrpx_config.cc +++ b/src/shrpx_config.cc @@ -3554,19 +3554,6 @@ int configure_downstream_group(Config *config, bool http2_proxy, g.addrs.push_back(std::move(addr)); router.add_route(g.pattern, addr_groups.size()); addr_groups.push_back(std::move(g)); - } else if (http2_proxy) { - // We don't support host mapping in these cases. Move all - // non-catch-all patterns to catch-all pattern. - DownstreamAddrGroupConfig catch_all(StringRef::from_lit("/")); - for (auto &g : addr_groups) { - std::move(std::begin(g.addrs), std::end(g.addrs), - std::back_inserter(catch_all.addrs)); - } - std::vector().swap(addr_groups); - // maybe not necessary? - routerconf = RouterConfig{}; - router.add_route(catch_all.pattern, addr_groups.size()); - addr_groups.push_back(std::move(catch_all)); } // backward compatibility: override all SNI fields with the option diff --git a/src/shrpx_https_upstream.cc b/src/shrpx_https_upstream.cc index a878b0f1..bfbdd204 100644 --- a/src/shrpx_https_upstream.cc +++ b/src/shrpx_https_upstream.cc @@ -202,7 +202,7 @@ int htp_hdr_valcb(http_parser *htp, const char *data, size_t len) { namespace { void rewrite_request_host_path_from_uri(BlockAllocator &balloc, Request &req, const StringRef &uri, - http_parser_url &u, bool http2_proxy) { + http_parser_url &u) { assert(u.field_set & (1 << UF_HOST)); // As per https://tools.ietf.org/html/rfc7230#section-5.4, we @@ -271,11 +271,7 @@ void rewrite_request_host_path_from_uri(BlockAllocator &balloc, Request &req, } } - if (http2_proxy) { - req.path = path; - } else { - req.path = http2::rewrite_clean_path(balloc, path); - } + req.path = http2::rewrite_clean_path(balloc, path); } } // namespace @@ -384,8 +380,7 @@ int htp_hdrs_completecb(http_parser *htp) { req.scheme = StringRef::from_lit("http"); } } else { - rewrite_request_host_path_from_uri( - balloc, req, req.path, u, config->http2_proxy && !faddr->alt_mode); + rewrite_request_host_path_from_uri(balloc, req, req.path, u); } }