Skip to content

Instantly share code, notes, and snippets.

@jpeach
Created July 17, 2020 01:25
Show Gist options
  • Save jpeach/e01f5f752eed5ffd09ea1f18634d1fc5 to your computer and use it in GitHub Desktop.
Save jpeach/e01f5f752eed5ffd09ea1f18634d1fc5 to your computer and use it in GitHub Desktop.
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