From 66f2d8980d44a89296e7ffc8baedf2ecfd5b5ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BE=84=E6=BD=AD?= Date: Mon, 8 Jan 2024 19:39:49 +0800 Subject: [PATCH] Support scopedRDS (#764) --- .../patches/envoy/20240104-enhance-srds.patch | 483 +++++++++ .../20240104-enhance-srds.patch | 931 ++++++++++++++++++ .../patches/istio/20240104-enhance-srds.patch | 633 ++++++++++++ 3 files changed, 2047 insertions(+) create mode 100644 envoy/1.20/patches/envoy/20240104-enhance-srds.patch create mode 100644 envoy/1.20/patches/go-control-plane/20240104-enhance-srds.patch create mode 100644 istio/1.12/patches/istio/20240104-enhance-srds.patch diff --git a/envoy/1.20/patches/envoy/20240104-enhance-srds.patch b/envoy/1.20/patches/envoy/20240104-enhance-srds.patch new file mode 100644 index 000000000..85416b2ca --- /dev/null +++ b/envoy/1.20/patches/envoy/20240104-enhance-srds.patch @@ -0,0 +1,483 @@ +diff -Naur envoy/api/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto envoy-new/api/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto +--- envoy/api/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto 2024-01-04 21:07:40.000000000 +0800 ++++ envoy-new/api/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto 2024-01-04 21:09:13.000000000 +0800 +@@ -888,11 +888,31 @@ + } + } + ++ message HostValueExtractor { ++ option (udpa.annotations.versioning).previous_message_type = ++ "envoy.config.filter.network.http_connection_manager.v2.ScopedRoutes.ScopeKeyBuilder." ++ "FragmentBuilder.HostValueExtractor"; ++ ++ // The maximum number of host superset recomputes. If not specified, defaults to 100. ++ google.protobuf.UInt32Value max_recompute_num = 1; ++ } ++ ++ message LocalPortValueExtractor { ++ option (udpa.annotations.versioning).previous_message_type = ++ "envoy.config.filter.network.http_connection_manager.v2.ScopedRoutes.ScopeKeyBuilder." ++ "FragmentBuilder.LocalPortValueExtractor"; ++ } ++ ++ + oneof type { + option (validate.required) = true; + + // Specifies how a header field's value should be extracted. + HeaderValueExtractor header_value_extractor = 1; ++ ++ HostValueExtractor host_value_extractor = 101; ++ ++ LocalPortValueExtractor local_port_value_extractor = 102; + } + } + +diff -Naur envoy/envoy/router/scopes.h envoy-new/envoy/router/scopes.h +--- envoy/envoy/router/scopes.h 2024-01-04 21:07:38.000000000 +0800 ++++ envoy-new/envoy/router/scopes.h 2024-01-04 21:09:13.000000000 +0800 +@@ -92,7 +92,12 @@ + * @param headers the request headers to match the scoped routing configuration against. + * @return ConfigConstSharedPtr the router's Config matching the request headers. + */ ++#if defined ALIMESH ++ virtual ConfigConstSharedPtr getRouteConfig(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info) const PURE; ++#else + virtual ConfigConstSharedPtr getRouteConfig(const Http::HeaderMap& headers) const PURE; ++#endif + + /** + * Based on the incoming HTTP request headers, returns the hash value of its scope key. +@@ -100,6 +105,12 @@ + * @return unique_ptr of the scope key computed from header. + */ + virtual ScopeKeyPtr computeScopeKey(const Http::HeaderMap&) const { return {}; } ++ ++#if defined(ALIMESH) ++ virtual ScopeKeyPtr computeScopeKey(const Http::HeaderMap&, const StreamInfo::StreamInfo&) const { ++ return {}; ++ }; ++#endif + }; + + using ScopedConfigConstSharedPtr = std::shared_ptr; +diff -Naur envoy/source/common/http/conn_manager_impl.cc envoy-new/source/common/http/conn_manager_impl.cc +--- envoy/source/common/http/conn_manager_impl.cc 2024-01-04 21:07:41.000000000 +0800 ++++ envoy-new/source/common/http/conn_manager_impl.cc 2024-01-04 21:09:13.000000000 +0800 +@@ -577,8 +577,13 @@ + requestVhdsUpdate(host_header, thread_local_dispatcher, std::move(route_config_updated_cb)); + return; + } else if (parent_.snapped_scoped_routes_config_ != nullptr) { ++#if defined(ALIMESH) ++ Router::ScopeKeyPtr scope_key = parent_.snapped_scoped_routes_config_->computeScopeKey( ++ *parent_.request_headers_, parent_.connection()->streamInfo()); ++#else + Router::ScopeKeyPtr scope_key = + parent_.snapped_scoped_routes_config_->computeScopeKey(*parent_.request_headers_); ++#endif + // If scope_key is not null, the scope exists but RouteConfiguration is not initialized. + if (scope_key != nullptr) { + requestSrdsUpdate(std::move(scope_key), thread_local_dispatcher, +@@ -1197,7 +1202,13 @@ + void ConnectionManagerImpl::ActiveStream::snapScopedRouteConfig() { + // NOTE: if a RDS subscription hasn't got a RouteConfiguration back, a Router::NullConfigImpl is + // returned, in that case we let it pass. ++#if defined(ALIMESH) ++ snapped_route_config_ = ++ snapped_scoped_routes_config_->getRouteConfig(*request_headers_, connection()->streamInfo()); ++#else + snapped_route_config_ = snapped_scoped_routes_config_->getRouteConfig(*request_headers_); ++ ++#endif + if (snapped_route_config_ == nullptr) { + ENVOY_STREAM_LOG(trace, "can't find SRDS scope.", *this); + // TODO(stevenzzzz): Consider to pass an error message to router filter, so that it can +diff -Naur envoy/source/common/router/scoped_config_impl.cc envoy-new/source/common/router/scoped_config_impl.cc +--- envoy/source/common/router/scoped_config_impl.cc 2024-01-04 21:07:36.000000000 +0800 ++++ envoy-new/source/common/router/scoped_config_impl.cc 2024-01-04 21:09:13.000000000 +0800 +@@ -6,6 +6,160 @@ + namespace Envoy { + namespace Router { + ++#if defined(ALIMESH) ++namespace { ++ ++std::string maskFirstDNSLabel(absl::string_view host) { ++ if (host == "*") { ++ return std::string(host); ++ } ++ if (host.size() < 2) { ++ return "*"; ++ } ++ size_t start_pos = (host[0] == '*' && host[1] == '.') ? 2 : 0; ++ size_t dot_pos = host.find('.', start_pos); ++ if (dot_pos != absl::string_view::npos) { ++ return absl::StrCat("*", absl::string_view(host.data() + dot_pos, host.size() - dot_pos)); ++ } ++ return "*"; ++} ++ ++} // namespace ++ ++LocalPortValueExtractorImpl::LocalPortValueExtractorImpl( ++ ScopedRoutes::ScopeKeyBuilder::FragmentBuilder&& config) ++ : FragmentBuilderBase(std::move(config)) { ++ ASSERT(config_.type_case() == ++ ScopedRoutes::ScopeKeyBuilder::FragmentBuilder::kLocalPortValueExtractor, ++ "local_port_value_extractor is not set."); ++} ++ ++std::unique_ptr LocalPortValueExtractorImpl::computeFragment( ++ const Http::HeaderMap&, const StreamInfo::StreamInfo& info, ReComputeCbPtr&) const { ++ auto port = info.downstreamAddressProvider().localAddress()->ip()->port(); ++ return std::make_unique(std::to_string(long(port))); ++} ++ ++HostValueExtractorImpl::HostValueExtractorImpl( ++ ScopedRoutes::ScopeKeyBuilder::FragmentBuilder&& config) ++ : FragmentBuilderBase(std::move(config)), ++ host_value_extractor_config_(config_.host_value_extractor()), ++ max_recompute_num_(PROTOBUF_GET_WRAPPED_OR_DEFAULT( ++ host_value_extractor_config_, max_recompute_num, DefaultMaxRecomputeNum)) { ++ ASSERT(config_.type_case() == ScopedRoutes::ScopeKeyBuilder::FragmentBuilder::kHostValueExtractor, ++ "host_value_extractor is not set."); ++} ++ ++std::unique_ptr ++HostValueExtractorImpl::reComputeHelper(const std::string& host, ReComputeCbPtr& next_recompute, ++ uint32_t recompute_seq) const { ++ if (recompute_seq == max_recompute_num_) { ++ ENVOY_LOG_MISC(warn, ++ "recompute host fragment failed, maximum number of recalculations exceeded"); ++ return nullptr; ++ } ++ if (host == "*") { ++ *next_recompute = nullptr; ++ return nullptr; ++ } ++ auto masked_host = maskFirstDNSLabel(host); ++ *next_recompute = [this, masked_host, recompute_seq, ++ next_recompute]() mutable -> std::unique_ptr { ++ return reComputeHelper(masked_host, next_recompute, recompute_seq + 1); ++ }; ++ return std::make_unique(masked_host); ++} ++ ++std::unique_ptr ++HostValueExtractorImpl::computeFragment(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo&, ++ ReComputeCbPtr& recompute) const { ++ auto fragment = computeFragment(headers); ++ auto host = static_cast(headers).getHostValue(); ++ *recompute = [this, host, recompute]() mutable -> std::unique_ptr { ++ return reComputeHelper(std::string(host), recompute, 0); ++ }; ++ return fragment; ++} ++ ++std::unique_ptr ++HostValueExtractorImpl::computeFragment(const Http::HeaderMap& headers) const { ++ return std::make_unique( ++ static_cast(headers).getHostValue()); ++} ++ ++std::unique_ptr ++HeaderValueExtractorImpl::computeFragment(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo&, ReComputeCbPtr&) const { ++ return computeFragment(headers); ++} ++ ++ScopeKeyPtr ScopeKeyBuilderImpl::computeScopeKey(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info, ++ std::function& recompute) const { ++ ScopeKey key; ++ bool recomputeable = false; ++ auto recompute_cbs = std::make_shared>(); ++ for (const auto& builder : fragment_builders_) { ++ // returns nullopt if a null fragment is found. ++ ReComputeCbPtr recompute_fragment_cb = std::make_shared(); ++ std::unique_ptr fragment = ++ builder->computeFragment(headers, info, recompute_fragment_cb); ++ if (fragment == nullptr) { ++ return nullptr; ++ } ++ if (*recompute_fragment_cb == nullptr) { ++ auto key_fragment = static_cast(fragment.get()); ++ auto copied_fragment = std::make_shared(*key_fragment); ++ auto recompute_cb = ++ std::make_shared([copied_fragment]() -> std::unique_ptr { ++ return std::make_unique(*copied_fragment); ++ }); ++ recompute_cbs->push_back(recompute_cb); ++ } else { ++ recomputeable = true; ++ recompute_cbs->push_back(recompute_fragment_cb); ++ } ++ key.addFragment(std::move(fragment)); ++ } ++ if (recomputeable) { ++ recompute = [&recompute, recompute_cbs]() mutable -> ScopeKeyPtr { ++ ScopeKey new_key; ++ for (auto& cb : *recompute_cbs) { ++ auto new_fragment = (*cb)(); ++ if (new_fragment == nullptr) { ++ return nullptr; ++ } ++ if (*cb == nullptr) { ++ recompute = nullptr; ++ } ++ new_key.addFragment(std::move(new_fragment)); ++ } ++ return std::make_unique(std::move(new_key)); ++ }; ++ } ++ return std::make_unique(std::move(key)); ++} ++ ++ScopeKeyPtr ScopedConfigImpl::computeScopeKey(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info) const { ++ std::function recompute; ++ ScopeKeyPtr scope_key = scope_key_builder_.computeScopeKey(headers, info, recompute); ++ if (scope_key == nullptr) { ++ return nullptr; ++ } ++ decltype(scoped_route_info_by_key_.begin()) iter; ++ do { ++ iter = scoped_route_info_by_key_.find(scope_key->hash()); ++ if (iter != scoped_route_info_by_key_.end()) { ++ return scope_key; ++ } ++ } while (recompute != nullptr && (scope_key = recompute())); ++ return nullptr; ++} ++ ++#endif ++ + bool ScopeKey::operator!=(const ScopeKey& other) const { return !(*this == other); } + + bool ScopeKey::operator==(const ScopeKey& other) const { +@@ -95,6 +249,16 @@ + : ScopeKeyBuilderBase(std::move(config)) { + for (const auto& fragment_builder : config_.fragments()) { + switch (fragment_builder.type_case()) { ++#if defined(ALIMESH) ++ case ScopedRoutes::ScopeKeyBuilder::FragmentBuilder::kHostValueExtractor: ++ fragment_builders_.emplace_back(std::make_unique( ++ ScopedRoutes::ScopeKeyBuilder::FragmentBuilder(fragment_builder))); ++ break; ++ case ScopedRoutes::ScopeKeyBuilder::FragmentBuilder::kLocalPortValueExtractor: ++ fragment_builders_.emplace_back(std::make_unique( ++ ScopedRoutes::ScopeKeyBuilder::FragmentBuilder(fragment_builder))); ++ break; ++#endif + case ScopedRoutes::ScopeKeyBuilder::FragmentBuilder::kHeaderValueExtractor: + fragment_builders_.emplace_back(std::make_unique( + ScopedRoutes::ScopeKeyBuilder::FragmentBuilder(fragment_builder))); +@@ -143,6 +307,22 @@ + } + + Router::ConfigConstSharedPtr ++#if defined(ALIMESH) ++ScopedConfigImpl::getRouteConfig(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info) const { ++ std::function recompute; ++ ScopeKeyPtr scope_key = scope_key_builder_.computeScopeKey(headers, info, recompute); ++ if (scope_key == nullptr) { ++ return nullptr; ++ } ++ decltype(scoped_route_info_by_key_.begin()) iter; ++ do { ++ iter = scoped_route_info_by_key_.find(scope_key->hash()); ++ if (iter != scoped_route_info_by_key_.end()) { ++ return iter->second->routeConfig(); ++ } ++ } while (recompute != nullptr && (scope_key = recompute())); ++#else + ScopedConfigImpl::getRouteConfig(const Http::HeaderMap& headers) const { + ScopeKeyPtr scope_key = scope_key_builder_.computeScopeKey(headers); + if (scope_key == nullptr) { +@@ -152,6 +332,7 @@ + if (iter != scoped_route_info_by_key_.end()) { + return iter->second->routeConfig(); + } ++#endif + return nullptr; + } + +diff -Naur envoy/source/common/router/scoped_config_impl.h envoy-new/source/common/router/scoped_config_impl.h +--- envoy/source/common/router/scoped_config_impl.h 2024-01-04 21:07:36.000000000 +0800 ++++ envoy-new/source/common/router/scoped_config_impl.h 2024-01-04 21:09:13.000000000 +0800 +@@ -22,6 +22,11 @@ + + using envoy::extensions::filters::network::http_connection_manager::v3::ScopedRoutes; + ++#if defined(ALIMESH) ++using ReComputeCb = std::function()>; ++using ReComputeCbPtr = std::shared_ptr; ++#endif ++ + /** + * Base class for fragment builders. + */ +@@ -36,6 +41,12 @@ + virtual std::unique_ptr + computeFragment(const Http::HeaderMap& headers) const PURE; + ++#if defined(ALIMESH) ++ virtual std::unique_ptr ++ computeFragment(const Http::HeaderMap& headers, const StreamInfo::StreamInfo& info, ++ ReComputeCbPtr& recompute) const PURE; ++#endif ++ + protected: + const ScopedRoutes::ScopeKeyBuilder::FragmentBuilder config_; + }; +@@ -47,11 +58,54 @@ + std::unique_ptr + computeFragment(const Http::HeaderMap& headers) const override; + ++#if defined(ALIMESH) ++ std::unique_ptr computeFragment(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info, ++ ReComputeCbPtr& recompute) const override; ++#endif ++ + private: + const ScopedRoutes::ScopeKeyBuilder::FragmentBuilder::HeaderValueExtractor& + header_value_extractor_config_; + }; + ++#if defined(ALIMESH) ++class HostValueExtractorImpl : public FragmentBuilderBase { ++public: ++ explicit HostValueExtractorImpl(ScopedRoutes::ScopeKeyBuilder::FragmentBuilder&& config); ++ ++ std::unique_ptr ++ computeFragment(const Http::HeaderMap& headers) const override; ++ ++ std::unique_ptr computeFragment(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info, ++ ReComputeCbPtr& recompute) const override; ++ ++private: ++ std::unique_ptr reComputeHelper(const std::string& host, ++ ReComputeCbPtr& next_recompute, ++ uint32_t recompute_seq) const; ++ ++ static constexpr uint32_t DefaultMaxRecomputeNum = 100; ++ ++ const ScopedRoutes::ScopeKeyBuilder::FragmentBuilder::HostValueExtractor& ++ host_value_extractor_config_; ++ const uint32_t max_recompute_num_; ++}; ++ ++class LocalPortValueExtractorImpl : public FragmentBuilderBase { ++public: ++ explicit LocalPortValueExtractorImpl(ScopedRoutes::ScopeKeyBuilder::FragmentBuilder&& config); ++ ++ std::unique_ptr computeFragment(const Http::HeaderMap&) const override { ++ return nullptr; ++ }; ++ ++ std::unique_ptr computeFragment(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info, ++ ReComputeCbPtr& recompute) const override; ++}; ++#endif + /** + * Base class for ScopeKeyBuilder implementations. + */ +@@ -64,6 +118,12 @@ + // Computes scope key for given headers, returns nullptr if a key can't be computed. + virtual ScopeKeyPtr computeScopeKey(const Http::HeaderMap& headers) const PURE; + ++#if defined(ALIMESH) ++ virtual ScopeKeyPtr computeScopeKey(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info, ++ std::function& recompute) const PURE; ++#endif ++ + protected: + const ScopedRoutes::ScopeKeyBuilder config_; + }; +@@ -74,6 +134,11 @@ + + ScopeKeyPtr computeScopeKey(const Http::HeaderMap& headers) const override; + ++#if defined(ALIMESH) ++ ScopeKeyPtr computeScopeKey(const Http::HeaderMap& headers, const StreamInfo::StreamInfo& info, ++ std::function& recompute) const override; ++#endif ++ + private: + std::vector> fragment_builders_; + }; +@@ -118,10 +183,20 @@ + void removeRoutingScopes(const std::vector& scope_names); + + // Envoy::Router::ScopedConfig ++#if defined(ALIMESH) ++ Router::ConfigConstSharedPtr getRouteConfig(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info) const override; ++#else + Router::ConfigConstSharedPtr getRouteConfig(const Http::HeaderMap& headers) const override; ++#endif + // The return value is not null only if the scope corresponding to the header exists. + ScopeKeyPtr computeScopeKey(const Http::HeaderMap& headers) const override; + ++#if defined(ALIMESH) ++ ScopeKeyPtr computeScopeKey(const Http::HeaderMap& headers, ++ const StreamInfo::StreamInfo& info) const override; ++#endif ++ + private: + ScopeKeyBuilderImpl scope_key_builder_; + // From scope name to cached ScopedRouteInfo. +@@ -135,9 +210,16 @@ + */ + class NullScopedConfigImpl : public ScopedConfig { + public: ++#if defined(ALIMESH) ++ Router::ConfigConstSharedPtr getRouteConfig(const Http::HeaderMap&, ++ const StreamInfo::StreamInfo&) const override { ++ return std::make_shared(); ++ } ++#else + Router::ConfigConstSharedPtr getRouteConfig(const Http::HeaderMap&) const override { + return std::make_shared(); + } ++#endif + }; + + } // namespace Router +diff -Naur envoy/source/extensions/filters/http/on_demand/on_demand_update.cc envoy-new/source/extensions/filters/http/on_demand/on_demand_update.cc +--- envoy/source/extensions/filters/http/on_demand/on_demand_update.cc 2024-01-04 21:07:33.000000000 +0800 ++++ envoy-new/source/extensions/filters/http/on_demand/on_demand_update.cc 2024-01-04 21:09:13.000000000 +0800 +@@ -50,7 +50,11 @@ + // This is the callback which is called when an update requested in requestRouteConfigUpdate() + // has been propagated to workers, at which point the request processing is restarted from the + // beginning. ++#if defined(ALIMESH) ++void OnDemandRouteUpdate::onRouteConfigUpdateCompletion(bool) { ++#else + void OnDemandRouteUpdate::onRouteConfigUpdateCompletion(bool route_exists) { ++#endif + filter_iteration_state_ = Http::FilterHeadersStatus::Continue; + + // Don't call continueDecoding in the middle of decodeHeaders() +@@ -58,12 +62,14 @@ + return; + } + ++#if !defined(ALIMESH) + if (route_exists && // route can be resolved after an on-demand + // VHDS update + !callbacks_->decodingBuffer() && // Redirects with body not yet supported. + callbacks_->recreateStream(/*headers=*/nullptr)) { + return; + } ++#endif + + // route cannot be resolved after an on-demand VHDS update or + // recreating stream failed, continue the filter-chain diff --git a/envoy/1.20/patches/go-control-plane/20240104-enhance-srds.patch b/envoy/1.20/patches/go-control-plane/20240104-enhance-srds.patch new file mode 100644 index 000000000..6d45861e6 --- /dev/null +++ b/envoy/1.20/patches/go-control-plane/20240104-enhance-srds.patch @@ -0,0 +1,931 @@ +diff -Naur go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go go-control-plane-new/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go +--- go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go 2024-01-04 21:07:22.000000000 +0800 ++++ go-control-plane-new/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go 2024-01-04 21:02:10.000000000 +0800 +@@ -2286,6 +2286,8 @@ + + // Types that are assignable to Type: + // *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_ ++ // *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor_ ++ // *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor_ + Type isScopedRoutes_ScopeKeyBuilder_FragmentBuilder_Type `protobuf_oneof:"type"` + } + +@@ -2335,6 +2337,20 @@ + return nil + } + ++func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder) GetHostValueExtractor() *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor { ++ if x, ok := x.GetType().(*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor_); ok { ++ return x.HostValueExtractor ++ } ++ return nil ++} ++ ++func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder) GetLocalPortValueExtractor() *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor { ++ if x, ok := x.GetType().(*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor_); ok { ++ return x.LocalPortValueExtractor ++ } ++ return nil ++} ++ + type isScopedRoutes_ScopeKeyBuilder_FragmentBuilder_Type interface { + isScopedRoutes_ScopeKeyBuilder_FragmentBuilder_Type() + } +@@ -2344,9 +2360,23 @@ + HeaderValueExtractor *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor `protobuf:"bytes,1,opt,name=header_value_extractor,json=headerValueExtractor,proto3,oneof"` + } + ++type ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor_ struct { ++ HostValueExtractor *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor `protobuf:"bytes,101,opt,name=host_value_extractor,json=hostValueExtractor,proto3,oneof"` ++} ++ ++type ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor_ struct { ++ LocalPortValueExtractor *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor `protobuf:"bytes,102,opt,name=local_port_value_extractor,json=localPortValueExtractor,proto3,oneof"` ++} ++ + func (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_) isScopedRoutes_ScopeKeyBuilder_FragmentBuilder_Type() { + } + ++func (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor_) isScopedRoutes_ScopeKeyBuilder_FragmentBuilder_Type() { ++} ++ ++func (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor_) isScopedRoutes_ScopeKeyBuilder_FragmentBuilder_Type() { ++} ++ + // Specifies how the value of a header should be extracted. + // The following example maps the structure of a header to the fields in this message. + // +@@ -2475,6 +2505,92 @@ + func (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_Element) isScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_ExtractType() { + } + ++type ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor struct { ++ state protoimpl.MessageState ++ sizeCache protoimpl.SizeCache ++ unknownFields protoimpl.UnknownFields ++ ++ // The maximum number of host superset recomputes. If not specified, defaults to 100. ++ MaxRecomputeNum *wrappers.UInt32Value `protobuf:"bytes,1,opt,name=max_recompute_num,json=maxRecomputeNum,proto3" json:"max_recompute_num,omitempty"` ++} ++ ++func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor) Reset() { ++ *x = ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor{} ++ if protoimpl.UnsafeEnabled { ++ mi := &file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[18] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++ } ++} ++ ++func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor) ProtoMessage() {} ++ ++func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor) ProtoReflect() protoreflect.Message { ++ mi := &file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[18] ++ if protoimpl.UnsafeEnabled && x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor.ProtoReflect.Descriptor instead. ++func (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor) Descriptor() ([]byte, []int) { ++ return file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_rawDescGZIP(), []int{5, 0, 0, 1} ++} ++ ++func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor) GetMaxRecomputeNum() *wrappers.UInt32Value { ++ if x != nil { ++ return x.MaxRecomputeNum ++ } ++ return nil ++} ++ ++type ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor struct { ++ state protoimpl.MessageState ++ sizeCache protoimpl.SizeCache ++ unknownFields protoimpl.UnknownFields ++} ++ ++func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor) Reset() { ++ *x = ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor{} ++ if protoimpl.UnsafeEnabled { ++ mi := &file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[19] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++ } ++} ++ ++func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor) ProtoMessage() {} ++ ++func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor) ProtoReflect() protoreflect.Message { ++ mi := &file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[19] ++ if protoimpl.UnsafeEnabled && x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor.ProtoReflect.Descriptor instead. ++func (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor) Descriptor() ([]byte, []int) { ++ return file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_rawDescGZIP(), []int{5, 0, 0, 2} ++} ++ + // Specifies a header field's key value pair to match on. + type ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement struct { + state protoimpl.MessageState +@@ -2494,7 +2610,7 @@ + func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement) Reset() { + *x = ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement{} + if protoimpl.UnsafeEnabled { +- mi := &file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[18] ++ mi := &file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +@@ -2507,7 +2623,7 @@ + func (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement) ProtoMessage() {} + + func (x *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement) ProtoReflect() protoreflect.Message { +- mi := &file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[18] ++ mi := &file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { +@@ -3079,7 +3195,7 @@ + 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, +- 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xe9, 0x0e, 0x0a, 0x0c, 0x53, 0x63, 0x6f, 0x70, 0x65, ++ 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xe1, 0x14, 0x0a, 0x0c, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x11, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6b, +@@ -3114,7 +3230,7 @@ + 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x64, 0x52, 0x64, 0x73, 0x48, 0x00, 0x52, 0x09, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, +- 0x73, 0x1a, 0xd9, 0x09, 0x0a, 0x0f, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, ++ 0x73, 0x1a, 0xd1, 0x0f, 0x0a, 0x0f, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x91, 0x01, 0x0a, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x69, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, +@@ -3124,7 +3240,7 @@ + 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x09, +- 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0xd5, 0x07, 0x0a, 0x0f, 0x46, 0x72, ++ 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0xcd, 0x0d, 0x0a, 0x0f, 0x46, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0xb6, 0x01, + 0x0a, 0x16, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x65, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x7e, +@@ -3137,131 +3253,178 @@ + 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, + 0x52, 0x14, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, +- 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x8f, 0x05, 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, +- 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, +- 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, +- 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, +- 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, +- 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, +- 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x05, 0x69, 0x6e, 0x64, +- 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, +- 0x78, 0x12, 0xa5, 0x01, 0x0a, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, +- 0x01, 0x28, 0x0b, 0x32, 0x88, 0x01, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, +- 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, ++ 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0xb0, 0x01, 0x0a, 0x14, 0x68, 0x6f, 0x73, 0x74, 0x5f, ++ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, ++ 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x7c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, ++ 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, ++ 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, ++ 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, ++ 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, ++ 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, ++ 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, ++ 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, ++ 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x12, 0x68, 0x6f, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, ++ 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0xc1, 0x01, 0x0a, 0x1a, 0x6c, 0x6f, ++ 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x65, ++ 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x81, ++ 0x01, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, ++ 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, ++ 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, ++ 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, ++ 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, ++ 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, ++ 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, ++ 0x50, 0x6f, 0x72, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, ++ 0x6f, 0x72, 0x48, 0x00, 0x52, 0x17, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x56, ++ 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x8f, 0x05, ++ 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, ++ 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, ++ 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, ++ 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, ++ 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, ++ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, ++ 0x12, 0x16, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, ++ 0x00, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0xa5, 0x01, 0x0a, 0x07, 0x65, 0x6c, 0x65, ++ 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x88, 0x01, 0x2e, 0x65, 0x6e, ++ 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, ++ 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, ++ 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, ++ 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, ++ 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, ++ 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, ++ 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, ++ 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4b, 0x76, 0x45, 0x6c, ++ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, ++ 0x1a, 0xdb, 0x01, 0x0a, 0x09, 0x4b, 0x76, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, ++ 0x0a, 0x09, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, ++ 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x70, 0x61, ++ 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, ++ 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, 0x65, 0x79, ++ 0x3a, 0x8b, 0x01, 0x9a, 0xc5, 0x88, 0x1e, 0x85, 0x01, 0x0a, 0x82, 0x01, 0x65, 0x6e, 0x76, 0x6f, ++ 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, +- 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, ++ 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, +- 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4b, 0x76, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, +- 0x52, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0xdb, 0x01, 0x0a, 0x09, 0x4b, 0x76, +- 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x09, 0x73, 0x65, 0x70, 0x61, 0x72, +- 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, +- 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x19, +- 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, +- 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x3a, 0x8b, 0x01, 0x9a, 0xc5, 0x88, 0x1e, +- 0x85, 0x01, 0x0a, 0x82, 0x01, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, ++ 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4b, 0x76, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x7f, ++ 0x9a, 0xc5, 0x88, 0x1e, 0x7a, 0x0a, 0x78, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, ++ 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, ++ 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, ++ 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, ++ 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, ++ 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, ++ 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, ++ 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, ++ 0x0e, 0x0a, 0x0c, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x1a, ++ 0xdd, 0x01, 0x0a, 0x12, 0x48, 0x6f, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, ++ 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x48, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, ++ 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, ++ 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, ++ 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, ++ 0x0f, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4e, 0x75, 0x6d, ++ 0x3a, 0x7d, 0x9a, 0xc5, 0x88, 0x1e, 0x78, 0x0a, 0x76, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, ++ 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, ++ 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, ++ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, ++ 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, ++ 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, ++ 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x6f, 0x73, ++ 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x1a, ++ 0x9e, 0x01, 0x0a, 0x17, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x56, 0x61, 0x6c, ++ 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x82, 0x01, 0x9a, 0xc5, ++ 0x88, 0x1e, 0x7d, 0x0a, 0x7b, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, + 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, +- 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, +- 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4b, 0x76, +- 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x7f, 0x9a, 0xc5, 0x88, 0x1e, 0x7a, 0x0a, 0x78, +- 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, +- 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, +- 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, +- 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, +- 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, +- 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, +- 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, +- 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0e, 0x0a, 0x0c, 0x65, 0x78, 0x74, 0x72, +- 0x61, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x6a, 0x9a, 0xc5, 0x88, 0x1e, 0x65, 0x0a, +- 0x63, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, +- 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, +- 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, +- 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, +- 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, +- 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, +- 0x6c, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x03, 0xf8, 0x42, +- 0x01, 0x3a, 0x5a, 0x9a, 0xc5, 0x88, 0x1e, 0x55, 0x0a, 0x53, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, +- 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, +- 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, +- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, +- 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, +- 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x3a, 0x4a, 0x9a, +- 0xc5, 0x88, 0x1e, 0x45, 0x0a, 0x43, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, +- 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, +- 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, +- 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, +- 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x42, 0x17, 0x0a, 0x10, 0x63, 0x6f, 0x6e, +- 0x66, 0x69, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x03, 0xf8, +- 0x42, 0x01, 0x22, 0xf1, 0x01, 0x0a, 0x09, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, +- 0x12, 0x65, 0x0a, 0x18, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x5f, 0x72, 0x64, 0x73, 0x5f, 0x63, +- 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, +- 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, +- 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, +- 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, +- 0x52, 0x15, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, +- 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x72, 0x64, 0x73, 0x5f, +- 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, +- 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, +- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x47, 0x9a, +- 0xc5, 0x88, 0x1e, 0x42, 0x0a, 0x40, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, +- 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, +- 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, +- 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, +- 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x22, 0xcc, 0x02, 0x0a, 0x0a, 0x48, 0x74, 0x74, 0x70, 0x46, +- 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, +- 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, +- 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, +- 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, +- 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, +- 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x58, 0x0a, +- 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, +- 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, +- 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x45, +- 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, +- 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x69, +- 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x6f, 0x70, +- 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, +- 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x3a, 0x48, 0x9a, 0xc5, 0x88, 0x1e, 0x43, 0x0a, +- 0x41, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, +- 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, +- 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, +- 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x46, 0x69, 0x6c, 0x74, +- 0x65, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, +- 0x65, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x06, 0x63, +- 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x9f, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, +- 0x74, 0x49, 0x44, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, +- 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, +- 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, +- 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, +- 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x50, 0x9a, 0xc5, 0x88, 0x1e, 0x4b, 0x0a, 0x49, 0x65, 0x6e, ++ 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, ++ 0x72, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, ++ 0x3a, 0x6a, 0x9a, 0xc5, 0x88, 0x1e, 0x65, 0x0a, 0x63, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, ++ 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, ++ 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, ++ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, ++ 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, ++ 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, ++ 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x04, ++ 0x74, 0x79, 0x70, 0x65, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x3a, 0x5a, 0x9a, 0xc5, 0x88, 0x1e, 0x55, ++ 0x0a, 0x53, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, ++ 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, ++ 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, ++ 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, ++ 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, ++ 0x69, 0x6c, 0x64, 0x65, 0x72, 0x3a, 0x4a, 0x9a, 0xc5, 0x88, 0x1e, 0x45, 0x0a, 0x43, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, +- 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x45, 0x78, +- 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8e, 0x01, 0x0a, 0x20, 0x45, 0x6e, 0x76, 0x6f, +- 0x79, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, +- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x6a, 0x0a, 0x06, +- 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x52, 0x2e, 0x65, +- 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, +- 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, +- 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, +- 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, +- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, +- 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x71, 0x0a, 0x49, 0x69, 0x6f, 0x2e, 0x65, +- 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, +- 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, +- 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, +- 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, +- 0x65, 0x72, 0x2e, 0x76, 0x33, 0x42, 0x1a, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, +- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, +- 0x6f, 0x50, 0x01, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, +- 0x74, 0x6f, 0x33, ++ 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, ++ 0x73, 0x42, 0x17, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x63, ++ 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, 0xf1, 0x01, 0x0a, 0x09, 0x53, ++ 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x12, 0x65, 0x0a, 0x18, 0x73, 0x63, 0x6f, 0x70, ++ 0x65, 0x64, 0x5f, 0x72, 0x64, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, ++ 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, ++ 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, ++ 0x33, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x08, ++ 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x15, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, ++ 0x52, 0x64, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, ++ 0x34, 0x0a, 0x16, 0x73, 0x72, 0x64, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, ++ 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, ++ 0x14, 0x73, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4c, 0x6f, ++ 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x47, 0x9a, 0xc5, 0x88, 0x1e, 0x42, 0x0a, 0x40, 0x65, 0x6e, ++ 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, ++ 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, ++ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, ++ 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x22, 0xcc, ++ 0x02, 0x0a, 0x0a, 0x48, 0x74, 0x74, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, ++ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, ++ 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x74, 0x79, ++ 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, ++ 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, ++ 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, ++ 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x58, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, ++ 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, ++ 0x2b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, ++ 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, ++ 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0f, ++ 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, ++ 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x06, ++ 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, ++ 0x3a, 0x48, 0x9a, 0xc5, 0x88, 0x1e, 0x43, 0x0a, 0x41, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, ++ 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, ++ 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, ++ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, ++ 0x48, 0x74, 0x74, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, ++ 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, ++ 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x9f, 0x01, ++ 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x45, 0x78, 0x74, 0x65, 0x6e, ++ 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, ++ 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, ++ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, ++ 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x50, 0x9a, ++ 0xc5, 0x88, 0x1e, 0x4b, 0x0a, 0x49, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, ++ 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, ++ 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, ++ 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x71, ++ 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, ++ 0x8e, 0x01, 0x0a, 0x20, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x48, ++ 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, ++ 0x61, 0x67, 0x65, 0x72, 0x12, 0x6a, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, ++ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x52, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, ++ 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, ++ 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, ++ 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, ++ 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, ++ 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, ++ 0x42, 0x71, 0x0a, 0x49, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, ++ 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, ++ 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, ++ 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, ++ 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x42, 0x1a, 0x48, ++ 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, ++ 0x61, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0xba, 0x80, 0xc8, 0xd1, 0x06, ++ 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + } + + var ( +@@ -3277,7 +3440,7 @@ + } + + var file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +-var file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes = make([]protoimpl.MessageInfo, 19) ++var file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes = make([]protoimpl.MessageInfo, 21) + var file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_goTypes = []interface{}{ + (HttpConnectionManager_CodecType)(0), // 0: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.CodecType + (HttpConnectionManager_ServerHeaderTransformation)(0), // 1: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.ServerHeaderTransformation +@@ -3302,102 +3465,107 @@ + (*ScopedRoutes_ScopeKeyBuilder)(nil), // 20: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder + (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder)(nil), // 21: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder + (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor)(nil), // 22: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HeaderValueExtractor +- (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement)(nil), // 23: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HeaderValueExtractor.KvElement +- (*v32.RouteConfiguration)(nil), // 24: envoy.config.route.v3.RouteConfiguration +- (*wrappers.BoolValue)(nil), // 25: google.protobuf.BoolValue +- (*v3.HttpProtocolOptions)(nil), // 26: envoy.config.core.v3.HttpProtocolOptions +- (*v3.Http1ProtocolOptions)(nil), // 27: envoy.config.core.v3.Http1ProtocolOptions +- (*v3.Http2ProtocolOptions)(nil), // 28: envoy.config.core.v3.Http2ProtocolOptions +- (*v3.Http3ProtocolOptions)(nil), // 29: envoy.config.core.v3.Http3ProtocolOptions +- (*v3.SchemeHeaderTransformation)(nil), // 30: envoy.config.core.v3.SchemeHeaderTransformation +- (*wrappers.UInt32Value)(nil), // 31: google.protobuf.UInt32Value +- (*duration.Duration)(nil), // 32: google.protobuf.Duration +- (*v31.AccessLog)(nil), // 33: envoy.config.accesslog.v3.AccessLog +- (*v3.TypedExtensionConfig)(nil), // 34: envoy.config.core.v3.TypedExtensionConfig +- (*v3.SubstitutionFormatString)(nil), // 35: envoy.config.core.v3.SubstitutionFormatString +- (*v31.AccessLogFilter)(nil), // 36: envoy.config.accesslog.v3.AccessLogFilter +- (*v3.DataSource)(nil), // 37: envoy.config.core.v3.DataSource +- (*v3.HeaderValueOption)(nil), // 38: envoy.config.core.v3.HeaderValueOption +- (*v3.ConfigSource)(nil), // 39: envoy.config.core.v3.ConfigSource +- (*v32.ScopedRouteConfiguration)(nil), // 40: envoy.config.route.v3.ScopedRouteConfiguration +- (*any.Any)(nil), // 41: google.protobuf.Any +- (*v3.ExtensionConfigSource)(nil), // 42: envoy.config.core.v3.ExtensionConfigSource +- (*v33.Percent)(nil), // 43: envoy.type.v3.Percent +- (*v34.CustomTag)(nil), // 44: envoy.type.tracing.v3.CustomTag +- (*v35.Tracing_Http)(nil), // 45: envoy.config.trace.v3.Tracing.Http +- (*v36.PathTransformation)(nil), // 46: envoy.type.http.v3.PathTransformation ++ (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor)(nil), // 23: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HostValueExtractor ++ (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor)(nil), // 24: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.LocalPortValueExtractor ++ (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement)(nil), // 25: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HeaderValueExtractor.KvElement ++ (*v32.RouteConfiguration)(nil), // 26: envoy.config.route.v3.RouteConfiguration ++ (*wrappers.BoolValue)(nil), // 27: google.protobuf.BoolValue ++ (*v3.HttpProtocolOptions)(nil), // 28: envoy.config.core.v3.HttpProtocolOptions ++ (*v3.Http1ProtocolOptions)(nil), // 29: envoy.config.core.v3.Http1ProtocolOptions ++ (*v3.Http2ProtocolOptions)(nil), // 30: envoy.config.core.v3.Http2ProtocolOptions ++ (*v3.Http3ProtocolOptions)(nil), // 31: envoy.config.core.v3.Http3ProtocolOptions ++ (*v3.SchemeHeaderTransformation)(nil), // 32: envoy.config.core.v3.SchemeHeaderTransformation ++ (*wrappers.UInt32Value)(nil), // 33: google.protobuf.UInt32Value ++ (*duration.Duration)(nil), // 34: google.protobuf.Duration ++ (*v31.AccessLog)(nil), // 35: envoy.config.accesslog.v3.AccessLog ++ (*v3.TypedExtensionConfig)(nil), // 36: envoy.config.core.v3.TypedExtensionConfig ++ (*v3.SubstitutionFormatString)(nil), // 37: envoy.config.core.v3.SubstitutionFormatString ++ (*v31.AccessLogFilter)(nil), // 38: envoy.config.accesslog.v3.AccessLogFilter ++ (*v3.DataSource)(nil), // 39: envoy.config.core.v3.DataSource ++ (*v3.HeaderValueOption)(nil), // 40: envoy.config.core.v3.HeaderValueOption ++ (*v3.ConfigSource)(nil), // 41: envoy.config.core.v3.ConfigSource ++ (*v32.ScopedRouteConfiguration)(nil), // 42: envoy.config.route.v3.ScopedRouteConfiguration ++ (*any.Any)(nil), // 43: google.protobuf.Any ++ (*v3.ExtensionConfigSource)(nil), // 44: envoy.config.core.v3.ExtensionConfigSource ++ (*v33.Percent)(nil), // 45: envoy.type.v3.Percent ++ (*v34.CustomTag)(nil), // 46: envoy.type.tracing.v3.CustomTag ++ (*v35.Tracing_Http)(nil), // 47: envoy.config.trace.v3.Tracing.Http ++ (*v36.PathTransformation)(nil), // 48: envoy.type.http.v3.PathTransformation + } + var file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_depIdxs = []int32{ + 0, // 0: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.codec_type:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.CodecType + 8, // 1: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.rds:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.Rds +- 24, // 2: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.route_config:type_name -> envoy.config.route.v3.RouteConfiguration ++ 26, // 2: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.route_config:type_name -> envoy.config.route.v3.RouteConfiguration + 10, // 3: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.scoped_routes:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes + 12, // 4: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.http_filters:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter +- 25, // 5: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.add_user_agent:type_name -> google.protobuf.BoolValue ++ 27, // 5: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.add_user_agent:type_name -> google.protobuf.BoolValue + 15, // 6: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.tracing:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing +- 26, // 7: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.common_http_protocol_options:type_name -> envoy.config.core.v3.HttpProtocolOptions +- 27, // 8: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.http_protocol_options:type_name -> envoy.config.core.v3.Http1ProtocolOptions +- 28, // 9: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.http2_protocol_options:type_name -> envoy.config.core.v3.Http2ProtocolOptions +- 29, // 10: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.http3_protocol_options:type_name -> envoy.config.core.v3.Http3ProtocolOptions ++ 28, // 7: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.common_http_protocol_options:type_name -> envoy.config.core.v3.HttpProtocolOptions ++ 29, // 8: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.http_protocol_options:type_name -> envoy.config.core.v3.Http1ProtocolOptions ++ 30, // 9: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.http2_protocol_options:type_name -> envoy.config.core.v3.Http2ProtocolOptions ++ 31, // 10: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.http3_protocol_options:type_name -> envoy.config.core.v3.Http3ProtocolOptions + 1, // 11: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.server_header_transformation:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.ServerHeaderTransformation +- 30, // 12: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.scheme_header_transformation:type_name -> envoy.config.core.v3.SchemeHeaderTransformation +- 31, // 13: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.max_request_headers_kb:type_name -> google.protobuf.UInt32Value +- 32, // 14: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.stream_idle_timeout:type_name -> google.protobuf.Duration +- 32, // 15: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.request_timeout:type_name -> google.protobuf.Duration +- 32, // 16: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.request_headers_timeout:type_name -> google.protobuf.Duration +- 32, // 17: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.drain_timeout:type_name -> google.protobuf.Duration +- 32, // 18: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.delayed_close_timeout:type_name -> google.protobuf.Duration +- 33, // 19: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.access_log:type_name -> envoy.config.accesslog.v3.AccessLog +- 25, // 20: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.use_remote_address:type_name -> google.protobuf.BoolValue +- 34, // 21: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.original_ip_detection_extensions:type_name -> envoy.config.core.v3.TypedExtensionConfig ++ 32, // 12: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.scheme_header_transformation:type_name -> envoy.config.core.v3.SchemeHeaderTransformation ++ 33, // 13: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.max_request_headers_kb:type_name -> google.protobuf.UInt32Value ++ 34, // 14: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.stream_idle_timeout:type_name -> google.protobuf.Duration ++ 34, // 15: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.request_timeout:type_name -> google.protobuf.Duration ++ 34, // 16: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.request_headers_timeout:type_name -> google.protobuf.Duration ++ 34, // 17: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.drain_timeout:type_name -> google.protobuf.Duration ++ 34, // 18: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.delayed_close_timeout:type_name -> google.protobuf.Duration ++ 35, // 19: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.access_log:type_name -> envoy.config.accesslog.v3.AccessLog ++ 27, // 20: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.use_remote_address:type_name -> google.protobuf.BoolValue ++ 36, // 21: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.original_ip_detection_extensions:type_name -> envoy.config.core.v3.TypedExtensionConfig + 16, // 22: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.internal_address_config:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.InternalAddressConfig +- 25, // 23: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.generate_request_id:type_name -> google.protobuf.BoolValue ++ 27, // 23: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.generate_request_id:type_name -> google.protobuf.BoolValue + 2, // 24: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.forward_client_cert_details:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.ForwardClientCertDetails + 17, // 25: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.set_current_client_cert_details:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.SetCurrentClientCertDetails + 18, // 26: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.upgrade_configs:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.UpgradeConfig +- 25, // 27: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.normalize_path:type_name -> google.protobuf.BoolValue ++ 27, // 27: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.normalize_path:type_name -> google.protobuf.BoolValue + 3, // 28: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.path_with_escaped_slashes_action:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.PathWithEscapedSlashesAction + 13, // 29: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.request_id_extension:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.RequestIDExtension + 6, // 30: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.local_reply_config:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.LocalReplyConfig +- 25, // 31: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.stream_error_on_invalid_http_message:type_name -> google.protobuf.BoolValue ++ 27, // 31: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.stream_error_on_invalid_http_message:type_name -> google.protobuf.BoolValue + 19, // 32: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.path_normalization_options:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.PathNormalizationOptions + 7, // 33: envoy.extensions.filters.network.http_connection_manager.v3.LocalReplyConfig.mappers:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper +- 35, // 34: envoy.extensions.filters.network.http_connection_manager.v3.LocalReplyConfig.body_format:type_name -> envoy.config.core.v3.SubstitutionFormatString +- 36, // 35: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.filter:type_name -> envoy.config.accesslog.v3.AccessLogFilter +- 31, // 36: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.status_code:type_name -> google.protobuf.UInt32Value +- 37, // 37: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.body:type_name -> envoy.config.core.v3.DataSource +- 35, // 38: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.body_format_override:type_name -> envoy.config.core.v3.SubstitutionFormatString +- 38, // 39: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.headers_to_add:type_name -> envoy.config.core.v3.HeaderValueOption +- 39, // 40: envoy.extensions.filters.network.http_connection_manager.v3.Rds.config_source:type_name -> envoy.config.core.v3.ConfigSource +- 40, // 41: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRouteConfigurationsList.scoped_route_configurations:type_name -> envoy.config.route.v3.ScopedRouteConfiguration ++ 37, // 34: envoy.extensions.filters.network.http_connection_manager.v3.LocalReplyConfig.body_format:type_name -> envoy.config.core.v3.SubstitutionFormatString ++ 38, // 35: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.filter:type_name -> envoy.config.accesslog.v3.AccessLogFilter ++ 33, // 36: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.status_code:type_name -> google.protobuf.UInt32Value ++ 39, // 37: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.body:type_name -> envoy.config.core.v3.DataSource ++ 37, // 38: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.body_format_override:type_name -> envoy.config.core.v3.SubstitutionFormatString ++ 40, // 39: envoy.extensions.filters.network.http_connection_manager.v3.ResponseMapper.headers_to_add:type_name -> envoy.config.core.v3.HeaderValueOption ++ 41, // 40: envoy.extensions.filters.network.http_connection_manager.v3.Rds.config_source:type_name -> envoy.config.core.v3.ConfigSource ++ 42, // 41: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRouteConfigurationsList.scoped_route_configurations:type_name -> envoy.config.route.v3.ScopedRouteConfiguration + 20, // 42: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.scope_key_builder:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder +- 39, // 43: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.rds_config_source:type_name -> envoy.config.core.v3.ConfigSource ++ 41, // 43: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.rds_config_source:type_name -> envoy.config.core.v3.ConfigSource + 9, // 44: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.scoped_route_configurations_list:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRouteConfigurationsList + 11, // 45: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.scoped_rds:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRds +- 39, // 46: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRds.scoped_rds_config_source:type_name -> envoy.config.core.v3.ConfigSource +- 41, // 47: envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter.typed_config:type_name -> google.protobuf.Any +- 42, // 48: envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter.config_discovery:type_name -> envoy.config.core.v3.ExtensionConfigSource +- 41, // 49: envoy.extensions.filters.network.http_connection_manager.v3.RequestIDExtension.typed_config:type_name -> google.protobuf.Any ++ 41, // 46: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRds.scoped_rds_config_source:type_name -> envoy.config.core.v3.ConfigSource ++ 43, // 47: envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter.typed_config:type_name -> google.protobuf.Any ++ 44, // 48: envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter.config_discovery:type_name -> envoy.config.core.v3.ExtensionConfigSource ++ 43, // 49: envoy.extensions.filters.network.http_connection_manager.v3.RequestIDExtension.typed_config:type_name -> google.protobuf.Any + 5, // 50: envoy.extensions.filters.network.http_connection_manager.v3.EnvoyMobileHttpConnectionManager.config:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager +- 43, // 51: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.client_sampling:type_name -> envoy.type.v3.Percent +- 43, // 52: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.random_sampling:type_name -> envoy.type.v3.Percent +- 43, // 53: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.overall_sampling:type_name -> envoy.type.v3.Percent +- 31, // 54: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.max_path_tag_length:type_name -> google.protobuf.UInt32Value +- 44, // 55: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.custom_tags:type_name -> envoy.type.tracing.v3.CustomTag +- 45, // 56: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.provider:type_name -> envoy.config.trace.v3.Tracing.Http +- 25, // 57: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.SetCurrentClientCertDetails.subject:type_name -> google.protobuf.BoolValue ++ 45, // 51: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.client_sampling:type_name -> envoy.type.v3.Percent ++ 45, // 52: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.random_sampling:type_name -> envoy.type.v3.Percent ++ 45, // 53: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.overall_sampling:type_name -> envoy.type.v3.Percent ++ 33, // 54: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.max_path_tag_length:type_name -> google.protobuf.UInt32Value ++ 46, // 55: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.custom_tags:type_name -> envoy.type.tracing.v3.CustomTag ++ 47, // 56: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.provider:type_name -> envoy.config.trace.v3.Tracing.Http ++ 27, // 57: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.SetCurrentClientCertDetails.subject:type_name -> google.protobuf.BoolValue + 12, // 58: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.UpgradeConfig.filters:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter +- 25, // 59: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.UpgradeConfig.enabled:type_name -> google.protobuf.BoolValue +- 46, // 60: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.PathNormalizationOptions.forwarding_transformation:type_name -> envoy.type.http.v3.PathTransformation +- 46, // 61: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.PathNormalizationOptions.http_filter_transformation:type_name -> envoy.type.http.v3.PathTransformation ++ 27, // 59: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.UpgradeConfig.enabled:type_name -> google.protobuf.BoolValue ++ 48, // 60: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.PathNormalizationOptions.forwarding_transformation:type_name -> envoy.type.http.v3.PathTransformation ++ 48, // 61: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.PathNormalizationOptions.http_filter_transformation:type_name -> envoy.type.http.v3.PathTransformation + 21, // 62: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.fragments:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder + 22, // 63: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.header_value_extractor:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HeaderValueExtractor +- 23, // 64: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HeaderValueExtractor.element:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HeaderValueExtractor.KvElement +- 65, // [65:65] is the sub-list for method output_type +- 65, // [65:65] is the sub-list for method input_type +- 65, // [65:65] is the sub-list for extension type_name +- 65, // [65:65] is the sub-list for extension extendee +- 0, // [0:65] is the sub-list for field type_name ++ 23, // 64: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.host_value_extractor:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HostValueExtractor ++ 24, // 65: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.local_port_value_extractor:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.LocalPortValueExtractor ++ 25, // 66: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HeaderValueExtractor.element:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HeaderValueExtractor.KvElement ++ 33, // 67: envoy.extensions.filters.network.http_connection_manager.v3.ScopedRoutes.ScopeKeyBuilder.FragmentBuilder.HostValueExtractor.max_recompute_num:type_name -> google.protobuf.UInt32Value ++ 68, // [68:68] is the sub-list for method output_type ++ 68, // [68:68] is the sub-list for method input_type ++ 68, // [68:68] is the sub-list for extension type_name ++ 68, // [68:68] is the sub-list for extension extendee ++ 0, // [0:68] is the sub-list for field type_name + } + + func init() { +@@ -3625,6 +3793,30 @@ + } + } + file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { ++ switch v := v.(*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor); i { ++ case 0: ++ return &v.state ++ case 1: ++ return &v.sizeCache ++ case 2: ++ return &v.unknownFields ++ default: ++ return nil ++ } ++ } ++ file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { ++ switch v := v.(*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor); i { ++ case 0: ++ return &v.state ++ case 1: ++ return &v.sizeCache ++ case 2: ++ return &v.unknownFields ++ default: ++ return nil ++ } ++ } ++ file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement); i { + case 0: + return &v.state +@@ -3653,6 +3845,8 @@ + } + file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[16].OneofWrappers = []interface{}{ + (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_)(nil), ++ (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor_)(nil), ++ (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor_)(nil), + } + file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_msgTypes[17].OneofWrappers = []interface{}{ + (*ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_Index)(nil), +@@ -3664,7 +3858,7 @@ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_rawDesc, + NumEnums: 5, +- NumMessages: 19, ++ NumMessages: 21, + NumExtensions: 0, + NumServices: 0, + }, +diff -Naur go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go go-control-plane-new/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go +--- go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go 2024-01-04 21:07:22.000000000 +0800 ++++ go-control-plane-new/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go 2024-01-04 21:02:10.000000000 +0800 +@@ -1986,6 +1986,30 @@ + } + } + ++ case *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor_: ++ ++ if v, ok := interface{}(m.GetHostValueExtractor()).(interface{ Validate() error }); ok { ++ if err := v.Validate(); err != nil { ++ return ScopedRoutes_ScopeKeyBuilder_FragmentBuilderValidationError{ ++ field: "HostValueExtractor", ++ reason: "embedded message failed validation", ++ cause: err, ++ } ++ } ++ } ++ ++ case *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor_: ++ ++ if v, ok := interface{}(m.GetLocalPortValueExtractor()).(interface{ Validate() error }); ok { ++ if err := v.Validate(); err != nil { ++ return ScopedRoutes_ScopeKeyBuilder_FragmentBuilderValidationError{ ++ field: "LocalPortValueExtractor", ++ reason: "embedded message failed validation", ++ cause: err, ++ } ++ } ++ } ++ + default: + return ScopedRoutes_ScopeKeyBuilder_FragmentBuilderValidationError{ + field: "Type", +@@ -2162,6 +2186,172 @@ + } = ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractorValidationError{} + + // Validate checks the field values on ++// ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor with the ++// rules defined in the proto definition for this message. If any rules are ++// violated, an error is returned. ++func (m *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor) Validate() error { ++ if m == nil { ++ return nil ++ } ++ ++ if v, ok := interface{}(m.GetMaxRecomputeNum()).(interface{ Validate() error }); ok { ++ if err := v.Validate(); err != nil { ++ return ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError{ ++ field: "MaxRecomputeNum", ++ reason: "embedded message failed validation", ++ cause: err, ++ } ++ } ++ } ++ ++ return nil ++} ++ ++// ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError ++// is the validation error returned by ++// ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor.Validate if ++// the designated constraints aren't met. ++type ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError struct { ++ field string ++ reason string ++ cause error ++ key bool ++} ++ ++// Field function returns field value. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError) Field() string { ++ return e.field ++} ++ ++// Reason function returns reason value. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError) Reason() string { ++ return e.reason ++} ++ ++// Cause function returns cause value. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError) Cause() error { ++ return e.cause ++} ++ ++// Key function returns key value. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError) Key() bool { ++ return e.key ++} ++ ++// ErrorName returns error name. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError) ErrorName() string { ++ return "ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError" ++} ++ ++// Error satisfies the builtin error interface ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError) Error() string { ++ cause := "" ++ if e.cause != nil { ++ cause = fmt.Sprintf(" | caused by: %v", e.cause) ++ } ++ ++ key := "" ++ if e.key { ++ key = "key for " ++ } ++ ++ return fmt.Sprintf( ++ "invalid %sScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor.%s: %s%s", ++ key, ++ e.field, ++ e.reason, ++ cause) ++} ++ ++var _ error = ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError{} ++ ++var _ interface { ++ Field() string ++ Reason() string ++ Key() bool ++ Cause() error ++ ErrorName() string ++} = ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractorValidationError{} ++ ++// Validate checks the field values on ++// ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor with ++// the rules defined in the proto definition for this message. If any rules ++// are violated, an error is returned. ++func (m *ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor) Validate() error { ++ if m == nil { ++ return nil ++ } ++ ++ return nil ++} ++ ++// ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError ++// is the validation error returned by ++// ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor.Validate ++// if the designated constraints aren't met. ++type ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError struct { ++ field string ++ reason string ++ cause error ++ key bool ++} ++ ++// Field function returns field value. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError) Field() string { ++ return e.field ++} ++ ++// Reason function returns reason value. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError) Reason() string { ++ return e.reason ++} ++ ++// Cause function returns cause value. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError) Cause() error { ++ return e.cause ++} ++ ++// Key function returns key value. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError) Key() bool { ++ return e.key ++} ++ ++// ErrorName returns error name. ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError) ErrorName() string { ++ return "ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError" ++} ++ ++// Error satisfies the builtin error interface ++func (e ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError) Error() string { ++ cause := "" ++ if e.cause != nil { ++ cause = fmt.Sprintf(" | caused by: %v", e.cause) ++ } ++ ++ key := "" ++ if e.key { ++ key = "key for " ++ } ++ ++ return fmt.Sprintf( ++ "invalid %sScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor.%s: %s%s", ++ key, ++ e.field, ++ e.reason, ++ cause) ++} ++ ++var _ error = ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError{} ++ ++var _ interface { ++ Field() string ++ Reason() string ++ Key() bool ++ Cause() error ++ ErrorName() string ++} = ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractorValidationError{} ++ ++// Validate checks the field values on + // ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement + // with the rules defined in the proto definition for this message. If any + // rules are violated, an error is returned. diff --git a/istio/1.12/patches/istio/20240104-enhance-srds.patch b/istio/1.12/patches/istio/20240104-enhance-srds.patch new file mode 100644 index 000000000..e4705187f --- /dev/null +++ b/istio/1.12/patches/istio/20240104-enhance-srds.patch @@ -0,0 +1,633 @@ +diff -Naur istio/pilot/pkg/features/pilot.go istio-new/pilot/pkg/features/pilot.go +--- istio/pilot/pkg/features/pilot.go 2024-01-05 17:58:08.000000000 +0800 ++++ istio-new/pilot/pkg/features/pilot.go 2024-01-04 21:20:00.000000000 +0800 +@@ -569,6 +569,12 @@ + // Added by ingress + CustomCACertConfigMapName = env.RegisterStringVar("CUSTOM_CA_CERT_NAME", "", + "Defines the configmap's name of istio's root ca certificate").Get() ++ HostRDSMergeSubset = env.RegisterBoolVar("HOST_RDS_MERGE_SUBSET", true, ++ "If enabled, if host A is a subset of B, then we merge B's routes into A's hostRDS").Get() ++ EnableScopedRDS = env.RegisterBoolVar("ENBALE_SCOPED_RDS", true, ++ "If enabled, each host in virtualservice will have an independent RDS, which is used with SRDS").Get() ++ OnDemandRDS = env.RegisterBoolVar("ON_DEMAND_RDS", false, ++ "If enabled, the on demand filter will be added to the HCM filters").Get() + // End added by ingress + ) + +diff -Naur istio/pilot/pkg/networking/core/configgen.go istio-new/pilot/pkg/networking/core/configgen.go +--- istio/pilot/pkg/networking/core/configgen.go 2024-01-05 17:58:02.000000000 +0800 ++++ istio-new/pilot/pkg/networking/core/configgen.go 2024-01-04 21:20:00.000000000 +0800 +@@ -17,6 +17,7 @@ + import ( + core "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" + listener "github.com/envoyproxy/go-control-plane/envoy/config/listener/v3" ++ route "github.com/envoyproxy/go-control-plane/envoy/config/route/v3" + discovery "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3" + + meshconfig "istio.io/api/mesh/v1alpha1" +@@ -44,6 +45,10 @@ + // BuildHTTPRoutes returns the list of HTTP routes for the given proxy. This is the RDS output + BuildHTTPRoutes(node *model.Proxy, req *model.PushRequest, routeNames []string) ([]*discovery.Resource, model.XdsLogDetails) + ++ // Added by ingress ++ BuildScopedRoutes(node *model.Proxy, push *model.PushContext) []*route.ScopedRouteConfiguration ++ // End added by ingress ++ + // BuildNameTable returns list of hostnames and the associated IPs + BuildNameTable(node *model.Proxy, push *model.PushContext) *dnsProto.NameTable + +diff -Naur istio/pilot/pkg/networking/core/v1alpha3/gateway.go istio-new/pilot/pkg/networking/core/v1alpha3/gateway.go +--- istio/pilot/pkg/networking/core/v1alpha3/gateway.go 2024-01-05 17:58:07.000000000 +0800 ++++ istio-new/pilot/pkg/networking/core/v1alpha3/gateway.go 2024-01-05 11:19:54.000000000 +0800 +@@ -41,7 +41,9 @@ + "istio.io/istio/pilot/pkg/networking/plugin" + "istio.io/istio/pilot/pkg/networking/util" + authn_model "istio.io/istio/pilot/pkg/security/model" ++ "istio.io/istio/pilot/pkg/util/sets" + "istio.io/istio/pkg/config" ++ "istio.io/istio/pkg/config/constants" + "istio.io/istio/pkg/config/gateway" + "istio.io/istio/pkg/config/host" + "istio.io/istio/pkg/config/protocol" +@@ -104,10 +106,15 @@ + // We can also have QUIC on a given port along with HTTPS/TLS on a given port. It does not + // cause port-conflict as they use different transport protocols + opts := &buildListenerOpts{ +- push: builder.push, +- proxy: builder.node, +- bind: bind, +- port: &model.Port{Port: int(port.Number)}, ++ push: builder.push, ++ proxy: builder.node, ++ bind: bind, ++ port: &model.Port{ ++ Port: int(port.Number), ++ // Added by ingress ++ Protocol: protocol.Parse(port.Protocol), ++ // End added by ingress ++ }, + bindToPort: true, + class: istionetworking.ListenerClassGateway, + transport: transport, +@@ -340,6 +347,269 @@ + return nameToServiceMap + } + ++// Added by ingress ++func (configgen *ConfigGeneratorImpl) BuildScopedRoutes(node *model.Proxy, push *model.PushContext) []*route.ScopedRouteConfiguration { ++ if node.MergedGateway == nil { ++ log.Warnf("buildScopedRoutes: no gateways for router %v", node.ID) ++ return nil ++ } ++ merged := node.MergedGateway ++ var out []*route.ScopedRouteConfiguration ++ gatewayVirtualServices := make(map[string][]config.Config) ++ serverIterator := func(listenerPort int, mergedServers map[model.ServerPort]*model.MergedServers) sets.Set { ++ hostSet := sets.NewSet() ++ for port, servers := range mergedServers { ++ if port.Number != uint32(listenerPort) { ++ continue ++ } ++ for _, server := range servers.Servers { ++ gatewayName := merged.GatewayNameForServer[server] ++ ++ var virtualServices []config.Config ++ var exists bool ++ ++ if virtualServices, exists = gatewayVirtualServices[gatewayName]; !exists { ++ virtualServices = push.VirtualServicesForGateway(node, gatewayName) ++ gatewayVirtualServices[gatewayName] = virtualServices ++ } ++ for _, virtualService := range virtualServices { ++ for _, host := range virtualService.Spec.(*networking.VirtualService).Hosts { ++ hostSet.Insert(host) ++ } ++ } ++ } ++ } ++ return hostSet ++ } ++ buildPortHostScopedRoute := func(listenerPort model.ServerPort) { ++ p := protocol.Parse(listenerPort.Protocol) ++ if !p.IsHTTP() && p != protocol.HTTPS { ++ return ++ } ++ port := strconv.Itoa(int(listenerPort.Number)) ++ hostSet := serverIterator(int(listenerPort.Number), merged.MergedServers). ++ Union(serverIterator(int(listenerPort.Number), merged.MergedQUICTransportServers)) ++ for host, _ := range hostSet { ++ portKey := &route.ScopedRouteConfiguration_Key_Fragment{ ++ Type: &route.ScopedRouteConfiguration_Key_Fragment_StringKey{ ++ StringKey: port, ++ }, ++ } ++ hostKey := &route.ScopedRouteConfiguration_Key_Fragment{ ++ Type: &route.ScopedRouteConfiguration_Key_Fragment_StringKey{ ++ StringKey: host, ++ }, ++ } ++ name := strings.Join([]string{port, host}, ".") ++ out = append(out, &route.ScopedRouteConfiguration{ ++ OnDemand: features.OnDemandRDS, ++ Name: name, ++ RouteConfigurationName: constants.HigressHostRDSNamePrefix + name, ++ Key: &route.ScopedRouteConfiguration_Key{ ++ Fragments: []*route.ScopedRouteConfiguration_Key_Fragment{portKey, hostKey}, ++ }, ++ }) ++ } ++ } ++ for _, port := range merged.ServerPorts { ++ buildPortHostScopedRoute(port) ++ } ++ return out ++} ++ ++type virtualServiceContext struct { ++ virtualService config.Config ++ server *networking.Server ++ gatewayName string ++} ++ ++func (configgen *ConfigGeneratorImpl) buildHostRDSConfig(node *model.Proxy, push *model.PushContext, ++ routeName string) *route.RouteConfiguration { ++ var ( ++ hostRDSPort string ++ hostRDSHost string ++ ) ++ portAndHost := strings.SplitN(strings.TrimPrefix(routeName, constants.HigressHostRDSNamePrefix), ".", 2) ++ if len(portAndHost) != 2 { ++ log.Errorf("Invalid route %s when using Higress hostRDS", routeName) ++ return nil ++ } ++ hostRDSPort = portAndHost[0] ++ hostRDSHost = portAndHost[1] ++ merged := node.MergedGateway ++ log.Debugf("buildGatewayRoutes: gateways after merging: %v", merged) ++ rdsPort, err := strconv.Atoi(hostRDSPort) ++ if err != nil { ++ log.Errorf("Invalid port %s of route %s when using Higress hostRDS", hostRDSPort, routeName) ++ return nil ++ } ++ listenerPort := uint32(rdsPort) ++ globalHTTPFilters := mseingress.ExtractGlobalHTTPFilters(node, push) ++ ++ isH3DiscoveryNeeded := false ++ ++ // When this is true, we add alt-svc header to the response to tell the client ++ // that HTTP/3 over QUIC is available on the same port for this host. This is ++ // very important for discovering HTTP/3 services ++ for port, servers := range merged.MergedQUICTransportServers { ++ if port.Number == listenerPort && len(servers.Servers) > 0 { ++ isH3DiscoveryNeeded = true ++ break ++ } ++ } ++ ++ gatewayRoutes := make(map[string]map[string][]*route.Route) ++ gatewayVirtualServices := make(map[string][]config.Config) ++ var selectedVirtualServices []virtualServiceContext ++ var vHost *route.VirtualHost ++ serverIterator := func(mergedServers map[model.ServerPort]*model.MergedServers) { ++ for port, servers := range mergedServers { ++ if port.Number != listenerPort { ++ continue ++ } ++ for _, server := range servers.Servers { ++ gatewayName := merged.GatewayNameForServer[server] ++ ++ var virtualServices []config.Config ++ var exists bool ++ ++ if virtualServices, exists = gatewayVirtualServices[gatewayName]; !exists { ++ virtualServices = push.VirtualServicesForGateway(node, gatewayName) ++ gatewayVirtualServices[gatewayName] = virtualServices ++ } ++ for _, virtualService := range virtualServices { ++ hostMatch := false ++ var selectHost string ++ virtualServiceHosts := host.NewNames(virtualService.Spec.(*networking.VirtualService).Hosts) ++ for _, hostname := range virtualServiceHosts { ++ // exact match ++ if hostname == host.Name(hostRDSHost) { ++ hostMatch = true ++ selectHost = hostRDSHost ++ break ++ } ++ if features.HostRDSMergeSubset { ++ // subset match ++ if host.Name(hostRDSHost).SubsetOf(hostname) { ++ hostMatch = true ++ selectHost = string(hostname) ++ } ++ } ++ } ++ if !hostMatch { ++ continue ++ } ++ copiedVS := virtualService.DeepCopy() ++ copiedVS.Spec.(*networking.VirtualService).Hosts = []string{selectHost} ++ selectedVirtualServices = append(selectedVirtualServices, virtualServiceContext{ ++ virtualService: copiedVS, ++ server: server, ++ gatewayName: gatewayName, ++ }) ++ } ++ } ++ } ++ } ++ serverIterator(merged.MergedServers) ++ serverIterator(merged.MergedQUICTransportServers) ++ // Sort by subset ++ // before: ["*.abc.com", "*.com", "www.abc.com"] ++ // after: ["www.abc.com", "*.abc.com", "*.com"] ++ sort.SliceStable(selectedVirtualServices, func(i, j int) bool { ++ return host.Name(selectedVirtualServices[i].virtualService.Spec.(*networking.VirtualService).Hosts[0]).SubsetOf( ++ host.Name(selectedVirtualServices[j].virtualService.Spec.(*networking.VirtualService).Hosts[0])) ++ }) ++ port := int(listenerPort) ++ for _, ctx := range selectedVirtualServices { ++ virtualService := ctx.virtualService ++ server := ctx.server ++ gatewayName := ctx.gatewayName ++ // Make sure we can obtain services which are visible to this virtualService as much as possible. ++ nameToServiceMap := buildNameToServiceMapForHTTPRoutes(node, push, virtualService) ++ ++ var routes []*route.Route ++ var exists bool ++ var err error ++ if _, exists = gatewayRoutes[gatewayName]; !exists { ++ gatewayRoutes[gatewayName] = make(map[string][]*route.Route) ++ } ++ ++ vskey := virtualService.Name + "/" + virtualService.Namespace ++ ++ if routes, exists = gatewayRoutes[gatewayName][vskey]; !exists { ++ hashByDestination := istio_route.GetConsistentHashForVirtualService(push, node, virtualService, nameToServiceMap) ++ routes, err = istio_route.BuildHTTPRoutesForVirtualServiceWithHTTPFilters(node, virtualService, nameToServiceMap, ++ hashByDestination, port, map[string]bool{gatewayName: true}, isH3DiscoveryNeeded, push.Mesh, globalHTTPFilters) ++ if err != nil { ++ log.Debugf("%s omitting routes for virtual service %v/%v due to error: %v", node.ID, virtualService.Namespace, virtualService.Name, err) ++ continue ++ } ++ gatewayRoutes[gatewayName][vskey] = routes ++ } ++ ++ if vHost != nil { ++ vHost.Routes = append(vHost.Routes, routes...) ++ if server.Tls != nil && server.Tls.HttpsRedirect { ++ vHost.RequireTls = route.VirtualHost_ALL ++ } ++ } else { ++ vHost = &route.VirtualHost{ ++ Name: util.DomainName(hostRDSHost, port), ++ Domains: buildGatewayVirtualHostDomains(hostRDSHost, port), ++ Routes: routes, ++ IncludeRequestAttemptCount: true, ++ TypedPerFilterConfig: mseingress.ConstructTypedPerFilterConfigForVHost(globalHTTPFilters, virtualService), ++ } ++ if server.Tls != nil && server.Tls.HttpsRedirect { ++ vHost.RequireTls = route.VirtualHost_ALL ++ } ++ } ++ ++ // check all hostname if is not exist with HttpsRedirect set to true ++ // create VirtualHost to redirect ++ for _, hostname := range server.Hosts { ++ if !server.GetTls().GetHttpsRedirect() { ++ continue ++ } ++ if vHost != nil && host.Name(hostname) == host.Name(hostRDSHost) { ++ vHost.RequireTls = route.VirtualHost_ALL ++ continue ++ } ++ vHost = &route.VirtualHost{ ++ Name: util.DomainName(hostname, port), ++ Domains: buildGatewayVirtualHostDomains(hostname, port), ++ IncludeRequestAttemptCount: true, ++ RequireTls: route.VirtualHost_ALL, ++ } ++ } ++ ++ } ++ var virtualHosts []*route.VirtualHost ++ if vHost == nil { ++ log.Warnf("constructed http route config for route %s on port %d with no vhosts; Setting up a default 404 vhost", routeName, port) ++ virtualHosts = []*route.VirtualHost{{ ++ Name: util.DomainName("blackhole", port), ++ Domains: []string{"*"}, ++ // Empty route list will cause Envoy to 404 NR any requests ++ Routes: []*route.Route{}, ++ }} ++ } else { ++ vHost.Routes = istio_route.CombineVHostRoutes(vHost.Routes) ++ virtualHosts = append(virtualHosts, vHost) ++ } ++ ++ routeCfg := &route.RouteConfiguration{ ++ // Retain the routeName as its used by EnvoyFilter patching logic ++ Name: routeName, ++ VirtualHosts: virtualHosts, ++ ValidateClusters: proto.BoolFalse, ++ } ++ ++ return routeCfg ++} ++ ++// End added by ingress ++ + func (configgen *ConfigGeneratorImpl) buildGatewayHTTPRouteConfig(node *model.Proxy, push *model.PushContext, + routeName string) *route.RouteConfiguration { + if node.MergedGateway == nil { +@@ -351,6 +621,12 @@ + } + } + ++ // Added by ingress ++ if strings.HasPrefix(routeName, constants.HigressHostRDSNamePrefix) { ++ return configgen.buildHostRDSConfig(node, push, routeName) ++ } ++ // End added by ingress ++ + merged := node.MergedGateway + log.Debugf("buildGatewayRoutes: gateways after merging: %v", merged) + +@@ -670,7 +946,9 @@ + // TLS mode | Mesh-wide SDS | Ingress SDS | Resulting Configuration + // SIMPLE/MUTUAL | ENABLED | ENABLED | support SDS at ingress gateway to terminate SSL communication outside the mesh + // ISTIO_MUTUAL | ENABLED | DISABLED | support SDS at gateway to terminate workload mTLS, with internal workloads +-// | for egress or with another trusted cluster for ingress) ++// ++// | for egress or with another trusted cluster for ingress) ++// + // ISTIO_MUTUAL | DISABLED | DISABLED | use file-mounted secret paths to terminate workload mTLS from gateway + // + // Note that ISTIO_MUTUAL TLS mode and ingressSds should not be used simultaneously on the same ingress gateway. +diff -Naur istio/pilot/pkg/networking/core/v1alpha3/listener.go istio-new/pilot/pkg/networking/core/v1alpha3/listener.go +--- istio/pilot/pkg/networking/core/v1alpha3/listener.go 2024-01-05 17:58:07.000000000 +0800 ++++ istio-new/pilot/pkg/networking/core/v1alpha3/listener.go 2024-01-05 17:31:10.000000000 +0800 +@@ -1279,8 +1279,48 @@ + + notimeout := durationpb.New(0 * time.Second) + connectionManager.StreamIdleTimeout = notimeout +- +- if httpOpts.rds != "" { ++ // Added by ingress ++ enableSRDS := false ++ if features.EnableScopedRDS && ++ (listenerOpts.port.Protocol.IsHTTP() || (listenerOpts.port.Protocol == protocol.HTTPS)) { ++ enableSRDS = true ++ portFragment := &hcm.ScopedRoutes_ScopeKeyBuilder_FragmentBuilder{ ++ Type: &hcm.ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor_{ ++ LocalPortValueExtractor: &hcm.ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_LocalPortValueExtractor{}, ++ }} ++ hostFragment := &hcm.ScopedRoutes_ScopeKeyBuilder_FragmentBuilder{ ++ Type: &hcm.ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor_{ ++ HostValueExtractor: &hcm.ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HostValueExtractor{}, ++ }} ++ scopedRoutes := &hcm.HttpConnectionManager_ScopedRoutes{ ++ ScopedRoutes: &hcm.ScopedRoutes{ ++ Name: constants.DefaultScopedRouteName, ++ ScopeKeyBuilder: &hcm.ScopedRoutes_ScopeKeyBuilder{ ++ Fragments: []*hcm.ScopedRoutes_ScopeKeyBuilder_FragmentBuilder{portFragment, hostFragment}, ++ }, ++ RdsConfigSource: &core.ConfigSource{ ++ ConfigSourceSpecifier: &core.ConfigSource_Ads{ ++ Ads: &core.AggregatedConfigSource{}, ++ }, ++ InitialFetchTimeout: durationpb.New(0), ++ ResourceApiVersion: core.ApiVersion_V3, ++ }, ++ ConfigSpecifier: &hcm.ScopedRoutes_ScopedRds{ ++ ScopedRds: &hcm.ScopedRds{ ++ ScopedRdsConfigSource: &core.ConfigSource{ ++ ConfigSourceSpecifier: &core.ConfigSource_Ads{ ++ Ads: &core.AggregatedConfigSource{}, ++ }, ++ InitialFetchTimeout: durationpb.New(0), ++ ResourceApiVersion: core.ApiVersion_V3, ++ }, ++ }, ++ }, ++ }, ++ } ++ connectionManager.RouteSpecifier = scopedRoutes ++ } else if httpOpts.rds != "" { ++ // End added by ingress + rds := &hcm.HttpConnectionManager_Rds{ + Rds: &hcm.Rds{ + ConfigSource: &core.ConfigSource{ +@@ -1304,8 +1344,15 @@ + + filters := make([]*hcm.HttpFilter, len(httpFilters)) + copy(filters, httpFilters) +- // Make sure cors filter always in the first. +- filters = append([]*hcm.HttpFilter{xdsfilters.Cors}, filters...) ++ // Added by ingress ++ // Now only support onDemandRDS when enable SRDS ++ if features.OnDemandRDS && enableSRDS { ++ filters = append([]*hcm.HttpFilter{xdsfilters.OnDemand, xdsfilters.Cors}, filters...) ++ } else { ++ // End added by ingress ++ // Make sure cors filter always in the first. ++ filters = append([]*hcm.HttpFilter{xdsfilters.Cors}, filters...) ++ } + + if features.MetadataExchange { + filters = append(filters, xdsfilters.HTTPMx) +diff -Naur istio/pilot/pkg/xds/ads.go istio-new/pilot/pkg/xds/ads.go +--- istio/pilot/pkg/xds/ads.go 2024-01-05 17:58:08.000000000 +0800 ++++ istio-new/pilot/pkg/xds/ads.go 2024-01-05 17:31:44.000000000 +0800 +@@ -797,15 +797,18 @@ + + // PushOrder defines the order that updates will be pushed in. Any types not listed here will be pushed in random + // order after the types listed here +-var PushOrder = []string{v3.ClusterType, v3.EndpointType, v3.ListenerType, v3.RouteType, v3.SecretType} ++var PushOrder = []string{v3.ClusterType, v3.EndpointType, v3.ListenerType, v3.ScopedRouteType, v3.RouteType, v3.SecretType} + + // KnownOrderedTypeUrls has typeUrls for which we know the order of push. + var KnownOrderedTypeUrls = map[string]struct{}{ + v3.ClusterType: {}, + v3.EndpointType: {}, + v3.ListenerType: {}, +- v3.RouteType: {}, +- v3.SecretType: {}, ++ // Added by ingress ++ v3.ScopedRouteType: {}, ++ // End added by ingress ++ v3.RouteType: {}, ++ v3.SecretType: {}, + } + + // orderWatchedResources orders the resources in accordance with known push order. +diff -Naur istio/pilot/pkg/xds/discovery.go istio-new/pilot/pkg/xds/discovery.go +--- istio/pilot/pkg/xds/discovery.go 2024-01-05 17:58:07.000000000 +0800 ++++ istio-new/pilot/pkg/xds/discovery.go 2024-01-04 21:20:00.000000000 +0800 +@@ -589,6 +589,9 @@ + s.Generators[v3.ClusterType] = &CdsGenerator{Server: s} + s.Generators[v3.ListenerType] = &LdsGenerator{Server: s} + s.Generators[v3.RouteType] = &RdsGenerator{Server: s} ++ // Added by ingress ++ s.Generators[v3.ScopedRouteType] = &SrdsGenerator{Server: s} ++ // End added by ingress + s.Generators[v3.EndpointType] = edsGen + s.Generators[v3.NameTableType] = &NdsGenerator{Server: s} + s.Generators[v3.ExtensionConfigurationType] = &EcdsGenerator{Server: s} +diff -Naur istio/pilot/pkg/xds/filters/filters.go istio-new/pilot/pkg/xds/filters/filters.go +--- istio/pilot/pkg/xds/filters/filters.go 2024-01-05 17:58:03.000000000 +0800 ++++ istio-new/pilot/pkg/xds/filters/filters.go 2024-01-04 21:20:00.000000000 +0800 +@@ -21,6 +21,7 @@ + fault "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/fault/v3" + grpcstats "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/grpc_stats/v3" + grpcweb "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/grpc_web/v3" ++ ondemand "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/on_demand/v3" + router "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/router/v3" + httpwasm "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/wasm/v3" + httpinspector "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/listener/http_inspector/v3" +@@ -54,6 +55,14 @@ + // Define static filters to be reused across the codebase. This avoids duplicate marshaling/unmarshaling + // This should not be used for filters that will be mutated + var ( ++ // Added by ingress ++ OnDemand = &hcm.HttpFilter{ ++ Name: "envoy.filters.http.on_demand.v3.OnDemand", ++ ConfigType: &hcm.HttpFilter_TypedConfig{ ++ TypedConfig: util.MessageToAny(&ondemand.OnDemand{}), ++ }, ++ } ++ // End added by ingress + Cors = &hcm.HttpFilter{ + Name: wellknown.CORS, + ConfigType: &hcm.HttpFilter_TypedConfig{ +diff -Naur istio/pilot/pkg/xds/srds.go istio-new/pilot/pkg/xds/srds.go +--- istio/pilot/pkg/xds/srds.go 1970-01-01 08:00:00.000000000 +0800 ++++ istio-new/pilot/pkg/xds/srds.go 2024-01-05 13:45:49.000000000 +0800 +@@ -0,0 +1,79 @@ ++// Copyright Istio Authors ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. ++ ++package xds ++ ++import ( ++ discovery "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3" ++ "istio.io/istio/pilot/pkg/features" ++ "istio.io/istio/pilot/pkg/model" ++ "istio.io/istio/pilot/pkg/networking/util" ++ "istio.io/istio/pkg/config" ++ "istio.io/istio/pkg/config/schema/gvk" ++) ++ ++type SrdsGenerator struct { ++ Server *DiscoveryServer ++} ++ ++var _ model.XdsResourceGenerator = &SrdsGenerator{} ++ ++// Map of all configs that do not impact SRDS ++var skippedSrdsConfigs = map[config.GroupVersionKind]struct{}{ ++ gvk.WorkloadEntry: {}, ++ gvk.WorkloadGroup: {}, ++ gvk.RequestAuthentication: {}, ++ gvk.PeerAuthentication: {}, ++ gvk.Secret: {}, ++} ++ ++func srdsNeedsPush(req *model.PushRequest) bool { ++ if !features.EnableScopedRDS { ++ return false ++ } ++ if req == nil { ++ return true ++ } ++ if !req.Full { ++ // SRDS only handles full push ++ return false ++ } ++ // If none set, we will always push ++ if len(req.ConfigsUpdated) == 0 { ++ return true ++ } ++ for config := range req.ConfigsUpdated { ++ if _, f := skippedSrdsConfigs[config.Kind]; !f { ++ return true ++ } ++ } ++ return false ++} ++ ++func (s SrdsGenerator) Generate(proxy *model.Proxy, push *model.PushContext, w *model.WatchedResource, ++ req *model.PushRequest) (model.Resources, model.XdsLogDetails, error) { ++ if !srdsNeedsPush(req) { ++ return nil, model.DefaultXdsLogDetails, nil ++ } ++ ++ scopedRoutes := s.Server.ConfigGenerator.BuildScopedRoutes(proxy, push) ++ resources := model.Resources{} ++ for _, sr := range scopedRoutes { ++ resources = append(resources, &discovery.Resource{ ++ Name: sr.Name, ++ Resource: util.MessageToAny(sr), ++ }) ++ } ++ return resources, model.DefaultXdsLogDetails, nil ++} +diff -Naur istio/pilot/pkg/xds/v3/model.go istio-new/pilot/pkg/xds/v3/model.go +--- istio/pilot/pkg/xds/v3/model.go 2024-01-05 17:58:03.000000000 +0800 ++++ istio-new/pilot/pkg/xds/v3/model.go 2024-01-05 16:55:49.000000000 +0800 +@@ -31,6 +31,10 @@ + SecretType = resource.SecretType + ExtensionConfigurationType = resource.ExtensionConfigType + ++ // Added by ingress ++ ScopedRouteType = apiTypePrefix + "envoy.config.route.v3.ScopedRouteConfiguration" ++ // End added by ingress ++ + NameTableType = apiTypePrefix + "istio.networking.nds.v1.NameTable" + HealthInfoType = apiTypePrefix + "istio.v1.HealthInformation" + ProxyConfigType = apiTypePrefix + "istio.mesh.v1alpha1.ProxyConfig" +@@ -61,6 +65,10 @@ + return "PCDS" + case ExtensionConfigurationType: + return "ECDS" ++ // Added by ingress ++ case ScopedRouteType: ++ return "SRDS" ++ // End added by ingress + default: + return typeURL + } +@@ -87,6 +95,10 @@ + return "ecds" + case BootstrapType: + return "bds" ++ // Added by ingress ++ case ScopedRouteType: ++ return "srds" ++ // End added by ingress + default: + return typeURL + } +diff -Naur istio/pkg/config/constants/constants.go istio-new/pkg/config/constants/constants.go +--- istio/pkg/config/constants/constants.go 2024-01-05 17:58:08.000000000 +0800 ++++ istio-new/pkg/config/constants/constants.go 2024-01-04 21:20:00.000000000 +0800 +@@ -143,4 +143,9 @@ + // CertProviderNone does not create any certificates for the control plane. It is assumed that some external + // load balancer, such as an Istio Gateway, is terminating the TLS. + CertProviderNone = "none" ++ ++ // Added by ingress ++ HigressHostRDSNamePrefix = "higress-rds-" ++ DefaultScopedRouteName = "scoped-route" ++ // End added by ingress + )