diff options
Diffstat (limited to 'grpc/src/core/ext/xds/xds_routing.h')
-rw-r--r-- | grpc/src/core/ext/xds/xds_routing.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/grpc/src/core/ext/xds/xds_routing.h b/grpc/src/core/ext/xds/xds_routing.h new file mode 100644 index 00000000..18df4ce4 --- /dev/null +++ b/grpc/src/core/ext/xds/xds_routing.h @@ -0,0 +1,101 @@ +// +// +// Copyright 2021 gRPC 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. +// +// + +#ifndef GRPC_CORE_EXT_XDS_XDS_ROUTING_H +#define GRPC_CORE_EXT_XDS_XDS_ROUTING_H + +#include <grpc/support/port_platform.h> + +#include <vector> + +#include "absl/strings/string_view.h" + +#include <grpc/support/log.h> + +#include "src/core/ext/xds/xds_listener.h" +#include "src/core/ext/xds/xds_route_config.h" +#include "src/core/lib/matchers/matchers.h" +#include "src/core/lib/transport/metadata_batch.h" + +namespace grpc_core { + +class XdsRouting { + public: + class VirtualHostListIterator { + public: + virtual ~VirtualHostListIterator() = default; + // Returns the number of virtual hosts in the list. + virtual size_t Size() const = 0; + // Returns the domain list for the virtual host at the specified index. + virtual const std::vector<std::string>& GetDomainsForVirtualHost( + size_t index) const = 0; + }; + + class RouteListIterator { + public: + virtual ~RouteListIterator() = default; + // Number of routes. + virtual size_t Size() const = 0; + // Returns the matchers for the route at the specified index. + virtual const XdsRouteConfigResource::Route::Matchers& GetMatchersForRoute( + size_t index) const = 0; + }; + + // Returns the index of the selected virtual host in the list. + static absl::optional<size_t> FindVirtualHostForDomain( + const VirtualHostListIterator& vhost_iterator, absl::string_view domain); + + // Returns the index in route_list_iterator to use for a request with + // the specified path and metadata, or nullopt if no route matches. + static absl::optional<size_t> GetRouteForRequest( + const RouteListIterator& route_list_iterator, absl::string_view path, + grpc_metadata_batch* initial_metadata); + + // Returns true if \a domain_pattern is a valid domain pattern, false + // otherwise. + static bool IsValidDomainPattern(absl::string_view domain_pattern); + + // Returns the metadata value(s) for the specified key. + // As special cases, binary headers return a value of absl::nullopt, and + // "content-type" header returns "application/grpc". + static absl::optional<absl::string_view> GetHeaderValue( + grpc_metadata_batch* initial_metadata, absl::string_view header_name, + std::string* concatenated_value); + + struct GeneratePerHttpFilterConfigsResult { + // Map of field name to list of elements for that field + std::map<std::string, std::vector<std::string>> per_filter_configs; + grpc_error_handle error = GRPC_ERROR_NONE; + // Guaranteed to be nullptr if error is GRPC_ERROR_NONE + grpc_channel_args* args = nullptr; + }; + + // Generates a map of per_filter_configs. \a args is consumed. + static GeneratePerHttpFilterConfigsResult GeneratePerHTTPFilterConfigs( + const std::vector<XdsListenerResource::HttpConnectionManager::HttpFilter>& + http_filters, + const XdsRouteConfigResource::VirtualHost& vhost, + const XdsRouteConfigResource::Route& route, + const XdsRouteConfigResource::Route::RouteAction::ClusterWeight* + cluster_weight, + grpc_channel_args* args); +}; + +} // namespace grpc_core + +#endif // GRPC_CORE_EXT_XDS_XDS_ROUTING_H |