Line data Source code
1 : #include "source/common/upstream/transport_socket_match_impl.h" 2 : 3 : #include "envoy/config/cluster/v3/cluster.pb.h" 4 : #include "envoy/config/core/v3/base.pb.h" 5 : #include "envoy/server/transport_socket_config.h" 6 : 7 : #include "source/common/config/utility.h" 8 : 9 : namespace Envoy { 10 : namespace Upstream { 11 : 12 : TransportSocketMatcherImpl::TransportSocketMatcherImpl( 13 : const Protobuf::RepeatedPtrField<envoy::config::cluster::v3::Cluster::TransportSocketMatch>& 14 : socket_matches, 15 : Server::Configuration::TransportSocketFactoryContext& factory_context, 16 : Network::UpstreamTransportSocketFactoryPtr& default_factory, Stats::Scope& stats_scope) 17 : : stats_scope_(stats_scope), 18 159 : default_match_("default", std::move(default_factory), generateStats("default")) { 19 159 : for (const auto& socket_match : socket_matches) { 20 0 : const auto& socket_config = socket_match.transport_socket(); 21 0 : auto& config_factory = Config::Utility::getAndCheckFactory< 22 0 : Server::Configuration::UpstreamTransportSocketConfigFactory>(socket_config); 23 0 : ProtobufTypes::MessagePtr message = Config::Utility::translateToFactoryConfig( 24 0 : socket_config, factory_context.messageValidationVisitor(), config_factory); 25 0 : FactoryMatch factory_match( 26 0 : socket_match.name(), config_factory.createTransportSocketFactory(*message, factory_context), 27 0 : generateStats(absl::StrCat(socket_match.name(), "."))); 28 0 : for (const auto& kv : socket_match.match().fields()) { 29 0 : factory_match.label_set.emplace_back(kv.first, kv.second); 30 0 : } 31 0 : matches_.emplace_back(std::move(factory_match)); 32 0 : } 33 159 : } 34 : 35 159 : TransportSocketMatchStats TransportSocketMatcherImpl::generateStats(const std::string& prefix) { 36 159 : return {ALL_TRANSPORT_SOCKET_MATCH_STATS(POOL_COUNTER_PREFIX(stats_scope_, prefix))}; 37 159 : } 38 : 39 : TransportSocketMatcher::MatchData 40 159 : TransportSocketMatcherImpl::resolve(const envoy::config::core::v3::Metadata* metadata) const { 41 159 : for (const auto& match : matches_) { 42 0 : if (Config::Metadata::metadataLabelMatch( 43 0 : match.label_set, metadata, 44 0 : Envoy::Config::MetadataFilters::get().ENVOY_TRANSPORT_SOCKET_MATCH, false)) { 45 0 : return {*match.factory, match.stats, match.name}; 46 0 : } 47 0 : } 48 159 : return {*default_match_.factory, default_match_.stats, default_match_.name}; 49 159 : } 50 : 51 : } // namespace Upstream 52 : } // namespace Envoy