Created
July 17, 2020 01:25
-
-
Save jpeach/e01f5f752eed5ffd09ea1f18634d1fc5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git source/common/router/config_impl.cc source/common/router/config_impl.cc | |
index ae92edeab..3801e0d48 100644 | |
--- source/common/router/config_impl.cc | |
+++ source/common/router/config_impl.cc | |
@@ -1310,17 +1310,30 @@ const VirtualHostImpl* RouteMatcher::findVirtualHost(const Http::RequestHeaderMa | |
return default_virtual_host_.get(); | |
} | |
+const MisdirectedRequest MisdirectedRequestRoute::REDIRECTOR; | |
+const std::shared_ptr<const MisdirectedRequestRoute> MISDIRECTED_REQUEST_ROUTE{ | |
+ new MisdirectedRequestRoute() | |
+}; | |
+ | |
RouteConstSharedPtr RouteMatcher::route(const RouteCallback& cb, | |
const Http::RequestHeaderMap& headers, | |
const StreamInfo::StreamInfo& stream_info, | |
uint64_t random_value) const { | |
- | |
const VirtualHostImpl* virtual_host = findVirtualHost(headers); | |
if (virtual_host) { | |
return virtual_host->getRouteFromEntries(cb, headers, stream_info, random_value); | |
- } else { | |
+ } | |
+ | |
+ ENVOY_LOG_MISC(info, "virtual host lookup miss"); | |
+ switch (stream_info.protocol().value_or(Http::Protocol::Http10)) { | |
+ case Http::Protocol::Http2: | |
+ case Http::Protocol::Http3: | |
+ ENVOY_LOG_MISC(info, "returning misdirected route"); | |
+ return MISDIRECTED_REQUEST_ROUTE; | |
+ default: /* no-op */ | |
return nullptr; | |
} | |
+ | |
} | |
const SslRedirector SslRedirectRoute::SSL_REDIRECTOR; | |
diff --git source/common/router/config_impl.h source/common/router/config_impl.h | |
index d5f51ec19..39d592913 100644 | |
--- source/common/router/config_impl.h | |
+++ source/common/router/config_impl.h | |
@@ -108,6 +108,33 @@ private: | |
static const SslRedirector SSL_REDIRECTOR; | |
}; | |
+class MisdirectedRequest : public DirectResponseEntry { | |
+public: | |
+ // Router::DirectResponseEntry | |
+ void finalizeResponseHeaders(Http::ResponseHeaderMap&, | |
+ const StreamInfo::StreamInfo&) const override {} | |
+ std::string newPath(const Http::RequestHeaderMap&) const override { return EMPTY_STRING; } | |
+ void rewritePathHeader(Http::RequestHeaderMap&, bool) const override {} | |
+ Http::Code responseCode() const override { return Http::Code::MisdirectedRequest; } | |
+ const std::string& responseBody() const override { return EMPTY_STRING; } | |
+ const std::string& routeName() const override { return EMPTY_STRING; } | |
+}; | |
+ | |
+class MisdirectedRequestRoute : public Route { | |
+public: | |
+ // Router::Route | |
+ const DirectResponseEntry* directResponseEntry() const override { return &REDIRECTOR; } | |
+ const RouteEntry* routeEntry() const override { return nullptr; } | |
+ const Decorator* decorator() const override { return nullptr; } | |
+ const RouteTracing* tracingConfig() const override { return nullptr; } | |
+ const RouteSpecificFilterConfig* perFilterConfig(const std::string&) const override { | |
+ return nullptr; | |
+ } | |
+ | |
+private: | |
+ static const MisdirectedRequest REDIRECTOR; | |
+}; | |
+ | |
/** | |
* Implementation of CorsPolicy that reads from the proto route and virtual host config. | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment