Skip to content

Commit

Permalink
add more filter state
Browse files Browse the repository at this point in the history
Signed-off-by: Kuat Yessenov <kuat@google.com>
  • Loading branch information
kyessenov committed Aug 15, 2023
1 parent cbfd3da commit a80dd8d
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ The following list of filter state objects are consumed by Envoy extensions:
:widths: 1, 3

``envoy.tcp_proxy.cluster``, :ref:`TCP proxy <config_network_filters_tcp_proxy>` dynamic cluster selection on a per-connection basis
``envoy.network.transport_socket.original_dst_address``, :ref:`Original destination cluster <arch_overview_load_balancing_types_original_destination>` dynamic address selection
2 changes: 2 additions & 0 deletions source/common/network/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,9 @@ envoy_cc_library(
srcs = ["filter_state_dst_address.cc"],
hdrs = ["filter_state_dst_address.h"],
deps = [
":utility_lib",
"//envoy/network:address_interface",
"//envoy/registry",
"//envoy/stream_info:filter_state_interface",
"//source/common/common:macros",
],
Expand Down
16 changes: 16 additions & 0 deletions source/common/network/filter_state_dst_address.cc
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
#include "source/common/network/filter_state_dst_address.h"

#include "envoy/registry/registry.h"

#include "source/common/network/utility.h"

namespace Envoy {
namespace Network {

const std::string& DestinationAddress::key() {
CONSTRUCT_ON_FIRST_USE(std::string, "envoy.network.transport_socket.original_dst_address");
}

class DestinationAddressFactory : public StreamInfo::FilterState::ObjectFactory {
public:
std::string name() const override { return DestinationAddress::key(); }
std::unique_ptr<StreamInfo::FilterState::Object>
createFromBytes(absl::string_view data) const override {
const auto address = Utility::parseInternetAddressAndPortNoThrow(std::string(data));
return address ? std::make_unique<DestinationAddress>(address) : nullptr;
}
};

REGISTER_FACTORY(DestinationAddressFactory, StreamInfo::FilterState::ObjectFactory);

} // namespace Network
} // namespace Envoy
3 changes: 3 additions & 0 deletions source/common/network/filter_state_dst_address.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ class DestinationAddress : public StreamInfo::FilterState::Object {

DestinationAddress(Network::Address::InstanceConstSharedPtr address) : address_(address) {}
Network::Address::InstanceConstSharedPtr address() const { return address_; }
absl::optional<std::string> serializeAsString() const override {
return address_ ? absl::make_optional(address_->asString()) : absl::nullopt;
}

private:
const Network::Address::InstanceConstSharedPtr address_;
Expand Down
13 changes: 13 additions & 0 deletions test/extensions/clusters/original_dst/original_dst_cluster_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1162,6 +1162,19 @@ TEST_F(OriginalDstClusterTest, UseFilterStateWithPortOverride) {
EXPECT_EQ("10.10.11.11:443", host1->address()->asString());
}

TEST(DestinationAddress, ObjectFactory) {
const std::string name = "envoy.network.transport_socket.original_dst_address";
auto* factory =
Registry::FactoryRegistry<StreamInfo::FilterState::ObjectFactory>::getFactory(name);
ASSERT_NE(nullptr, factory);
EXPECT_EQ(name, factory->name());
const std::string address = "10.0.0.10:8080";
auto object = factory->createFromBytes(address);
ASSERT_NE(nullptr, object);
EXPECT_EQ(address, object->serializeAsString());
EXPECT_EQ(nullptr, factory->createFromBytes("foo"));
}

} // namespace
} // namespace Upstream
} // namespace Envoy

0 comments on commit a80dd8d

Please sign in to comment.