-
Notifications
You must be signed in to change notification settings - Fork 5.3k
router: add a route name field in route.Route list #6776
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
19c49d7
fdca10a
11c45f0
7bdb127
d97ed27
57bb834
06b503a
1c5dae1
cb11c75
c6fec15
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -377,6 +377,11 @@ StreamInfoFormatter::StreamInfoFormatter(const std::string& field_name) { | |
| return UnspecifiedValueString; | ||
| } | ||
| }; | ||
| } else if (field_name == "ROUTE_NAME") { | ||
|
||
| field_extractor_ = [](const StreamInfo::StreamInfo& stream_info) { | ||
| std::string route_name = stream_info.getRouteName(); | ||
| return route_name.empty() ? UnspecifiedValueString : route_name; | ||
| }; | ||
| } else if (field_name == "DOWNSTREAM_PEER_URI_SAN") { | ||
| field_extractor_ = | ||
| sslConnectionInfoStringExtractor([](const Ssl::ConnectionInfo& connection_info) { | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -112,6 +112,31 @@ TEST_F(AccessLogImplTest, DownstreamDisconnect) { | |
| output_); | ||
| } | ||
|
|
||
| TEST_F(AccessLogImplTest, RouteName) { | ||
|
||
| const std::string json = R"EOF( | ||
| { | ||
| "path": "/dev/null", | ||
| "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH):256% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %ROUTE_NAME% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\"\n" | ||
| } | ||
| )EOF"; | ||
|
|
||
| InstanceSharedPtr log = AccessLogFactory::fromProto(parseAccessLogFromJson(json), context_); | ||
|
|
||
| EXPECT_CALL(*file_, write(_)); | ||
| stream_info_.route_name_ = "route-test-name"; | ||
| stream_info_.response_flags_ = StreamInfo::ResponseFlag::UpstreamConnectionFailure; | ||
| request_headers_.addCopy(Http::Headers::get().UserAgent, "user-agent-set"); | ||
| request_headers_.addCopy(Http::Headers::get().RequestId, "id"); | ||
| request_headers_.addCopy(Http::Headers::get().Host, "host"); | ||
| request_headers_.addCopy(Http::Headers::get().ForwardedFor, "x.x.x.x"); | ||
|
|
||
| log->log(&request_headers_, &response_headers_, &response_trailers_, stream_info_); | ||
| EXPECT_EQ( | ||
| "[1999-01-01T00:00:00.000Z] \"GET / HTTP/1.1\" 0 UF route-test-name 1 2 3 - \"x.x.x.x\" " | ||
| "\"user-agent-set\" \"id\" \"host\"\n", | ||
| output_); | ||
| } | ||
|
|
||
| TEST_F(AccessLogImplTest, EnvoyUpstreamServiceTime) { | ||
| const std::string json = R"EOF( | ||
| { | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2908,6 +2908,38 @@ static Http::TestHeaderMapImpl genRedirectHeaders(const std::string& host, const | |
| return headers; | ||
| } | ||
|
|
||
| TEST_F(RouteMatcherTest, RouteName) { | ||
| std::string yaml = R"EOF( | ||
| virtual_hosts: | ||
| - name: "www2" | ||
| domains: ["www.lyft.com"] | ||
| routes: | ||
| - name: "route-test" | ||
| match: { prefix: "/"} | ||
| route: | ||
| cluster: "ufesservice" | ||
| - name: redirect | ||
| domains: [redirect.lyft.com] | ||
| routes: | ||
| - name: "route-test-2" | ||
| match: { path: /host } | ||
| redirect: { host_redirect: new.lyft.com } | ||
| )EOF"; | ||
| NiceMock<Server::Configuration::MockFactoryContext> factory_context; | ||
| TestConfigImpl config(parseRouteConfigurationFromV2Yaml(yaml), factory_context, false); | ||
| { | ||
| Http::TestHeaderMapImpl headers = genHeaders("www.lyft.com", "/", "GET"); | ||
| EXPECT_EQ("route-test", config.route(headers, 0)->routeEntry()->routeName()); | ||
| } | ||
|
|
||
| { | ||
| Http::TestHeaderMapImpl headers = | ||
| genRedirectHeaders("redirect.lyft.com", "/host", false, false); | ||
| const DirectResponseEntry* redirect = config.route(headers, 0)->directResponseEntry(); | ||
| EXPECT_EQ("route-test-2", redirect->routeName()); | ||
| } | ||
| } | ||
|
|
||
| TEST_F(RouteMatcherTest, DirectResponse) { | ||
| const auto pathname = | ||
| TestEnvironment::writeStringToFileForTest("direct_response_body", "Example text 3"); | ||
|
|
@@ -5618,4 +5650,4 @@ name: foo | |
|
|
||
| } // namespace | ||
| } // namespace Router | ||
| } // namespace Envoy | ||
| } // namespace Envoy | ||
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2253,12 +2253,16 @@ TEST_F(RouterTest, AltStatName) { | |
|
|
||
| TEST_F(RouterTest, Redirect) { | ||
|
||
| MockDirectResponseEntry direct_response; | ||
| std::string route_name("route-test-name"); | ||
| EXPECT_CALL(direct_response, newPath(_)).WillOnce(Return("hello")); | ||
| EXPECT_CALL(direct_response, routeName()).WillOnce(ReturnRef(route_name)); | ||
| EXPECT_CALL(direct_response, rewritePathHeader(_, _)); | ||
| EXPECT_CALL(direct_response, responseCode()).WillOnce(Return(Http::Code::MovedPermanently)); | ||
| EXPECT_CALL(direct_response, responseBody()).WillOnce(ReturnRef(EMPTY_STRING)); | ||
| EXPECT_CALL(direct_response, finalizeResponseHeaders(_, _)); | ||
| EXPECT_CALL(*callbacks_.route_, directResponseEntry()).WillRepeatedly(Return(&direct_response)); | ||
| absl::string_view route_name_view(route_name); | ||
| EXPECT_CALL(callbacks_.stream_info_, setRouteName(route_name_view)); | ||
|
|
||
| Http::TestHeaderMapImpl response_headers{{":status", "301"}, {"location", "hello"}}; | ||
| EXPECT_CALL(callbacks_, encodeHeaders_(HeaderMapEqualRef(&response_headers), true)); | ||
|
|
@@ -2270,12 +2274,16 @@ TEST_F(RouterTest, Redirect) { | |
|
|
||
| TEST_F(RouterTest, RedirectFound) { | ||
| MockDirectResponseEntry direct_response; | ||
| std::string route_name("route-test-name"); | ||
| EXPECT_CALL(direct_response, newPath(_)).WillOnce(Return("hello")); | ||
| EXPECT_CALL(direct_response, routeName()).WillOnce(ReturnRef(route_name)); | ||
| EXPECT_CALL(direct_response, rewritePathHeader(_, _)); | ||
| EXPECT_CALL(direct_response, responseCode()).WillOnce(Return(Http::Code::Found)); | ||
| EXPECT_CALL(direct_response, responseBody()).WillOnce(ReturnRef(EMPTY_STRING)); | ||
| EXPECT_CALL(direct_response, finalizeResponseHeaders(_, _)); | ||
| EXPECT_CALL(*callbacks_.route_, directResponseEntry()).WillRepeatedly(Return(&direct_response)); | ||
| absl::string_view route_name_view(route_name); | ||
| EXPECT_CALL(callbacks_.stream_info_, setRouteName(route_name_view)); | ||
|
|
||
| Http::TestHeaderMapImpl response_headers{{":status", "302"}, {"location", "hello"}}; | ||
| EXPECT_CALL(callbacks_, encodeHeaders_(HeaderMapEqualRef(&response_headers), true)); | ||
|
|
@@ -2287,9 +2295,13 @@ TEST_F(RouterTest, RedirectFound) { | |
|
|
||
| TEST_F(RouterTest, DirectResponse) { | ||
| NiceMock<MockDirectResponseEntry> direct_response; | ||
| std::string route_name("route-test-name"); | ||
| EXPECT_CALL(direct_response, routeName()).WillOnce(ReturnRef(route_name)); | ||
| EXPECT_CALL(direct_response, responseCode()).WillRepeatedly(Return(Http::Code::OK)); | ||
| EXPECT_CALL(direct_response, responseBody()).WillRepeatedly(ReturnRef(EMPTY_STRING)); | ||
| EXPECT_CALL(*callbacks_.route_, directResponseEntry()).WillRepeatedly(Return(&direct_response)); | ||
| absl::string_view route_name_view(route_name); | ||
| EXPECT_CALL(callbacks_.stream_info_, setRouteName(route_name_view)); | ||
|
|
||
| Http::TestHeaderMapImpl response_headers{{":status", "200"}}; | ||
| EXPECT_CALL(callbacks_, encodeHeaders_(HeaderMapEqualRef(&response_headers), true)); | ||
|
|
@@ -2303,10 +2315,14 @@ TEST_F(RouterTest, DirectResponse) { | |
|
|
||
| TEST_F(RouterTest, DirectResponseWithBody) { | ||
| NiceMock<MockDirectResponseEntry> direct_response; | ||
| std::string route_name("route-test-name"); | ||
| EXPECT_CALL(direct_response, routeName()).WillOnce(ReturnRef(route_name)); | ||
| EXPECT_CALL(direct_response, responseCode()).WillRepeatedly(Return(Http::Code::OK)); | ||
| const std::string response_body("static response"); | ||
| EXPECT_CALL(direct_response, responseBody()).WillRepeatedly(ReturnRef(response_body)); | ||
| EXPECT_CALL(*callbacks_.route_, directResponseEntry()).WillRepeatedly(Return(&direct_response)); | ||
| absl::string_view route_name_view(route_name); | ||
| EXPECT_CALL(callbacks_.stream_info_, setRouteName(route_name_view)); | ||
|
|
||
| Http::TestHeaderMapImpl response_headers{ | ||
| {":status", "200"}, {"content-length", "15"}, {"content-type", "text/plain"}}; | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.