resolver_registry.cc
Go to the documentation of this file.
1 //
2 // Copyright 2015 gRPC authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
18 
20 
21 #include "absl/status/status.h"
22 #include "absl/status/statusor.h"
23 #include "absl/strings/str_cat.h"
24 #include "absl/strings/str_format.h"
25 
26 #include <grpc/support/log.h>
27 
28 namespace grpc_core {
29 
30 //
31 // ResolverRegistry::Builder
32 //
33 
35 
38 }
39 
41  std::unique_ptr<ResolverFactory> factory) {
42  auto p = state_.factories.emplace(factory->scheme(), std::move(factory));
43  GPR_ASSERT(p.second);
44 }
45 
47  absl::string_view scheme) const {
48  return state_.factories.find(scheme) != state_.factories.end();
49 }
50 
52  state_.factories.clear();
53  state_.default_prefix = "dns:///";
54 }
55 
58 }
59 
60 //
61 // ResolverRegistry
62 //
63 
65  std::string canonical_target;
66  URI uri;
67  ResolverFactory* factory =
68  FindResolverFactory(target, &uri, &canonical_target);
69  if (factory == nullptr) return false;
70  return factory->IsValidUri(uri);
71 }
72 
75  grpc_pollset_set* pollset_set,
76  std::shared_ptr<WorkSerializer> work_serializer,
77  std::unique_ptr<Resolver::ResultHandler> result_handler) const {
78  std::string canonical_target;
79  ResolverArgs resolver_args;
80  ResolverFactory* factory =
81  FindResolverFactory(target, &resolver_args.uri, &canonical_target);
82  if (factory == nullptr) return nullptr;
83  resolver_args.args = args;
84  resolver_args.pollset_set = pollset_set;
85  resolver_args.work_serializer = std::move(work_serializer);
86  resolver_args.result_handler = std::move(result_handler);
87  return factory->CreateResolver(std::move(resolver_args));
88 }
89 
91  absl::string_view target) const {
92  std::string canonical_target;
93  URI uri;
94  ResolverFactory* factory =
95  FindResolverFactory(target, &uri, &canonical_target);
96  if (factory == nullptr) return "";
97  return factory->GetDefaultAuthority(uri);
98 }
99 
101  absl::string_view target) const {
102  std::string canonical_target;
103  URI uri;
104  FindResolverFactory(target, &uri, &canonical_target);
105  return canonical_target.empty() ? std::string(target) : canonical_target;
106 }
107 
109  absl::string_view scheme) const {
110  auto it = state_.factories.find(scheme);
111  if (it == state_.factories.end()) return nullptr;
112  return it->second.get();
113 }
114 
115 // Returns the factory for the scheme of \a target. If \a target does
116 // not parse as a URI, prepends \a default_prefix_ and tries again.
117 // If URI parsing is successful (in either attempt), sets \a uri to
118 // point to the parsed URI.
120  absl::string_view target, URI* uri, std::string* canonical_target) const {
121  GPR_ASSERT(uri != nullptr);
123  ResolverFactory* factory =
124  tmp_uri.ok() ? LookupResolverFactory(tmp_uri->scheme()) : nullptr;
125  if (factory != nullptr) {
126  *uri = std::move(*tmp_uri);
127  return factory;
128  }
129  *canonical_target = absl::StrCat(state_.default_prefix, target);
130  absl::StatusOr<URI> tmp_uri2 = URI::Parse(*canonical_target);
131  factory = tmp_uri2.ok() ? LookupResolverFactory(tmp_uri2->scheme()) : nullptr;
132  if (factory != nullptr) {
133  *uri = std::move(*tmp_uri2);
134  return factory;
135  }
136  if (!tmp_uri.ok() || !tmp_uri2.ok()) {
137  gpr_log(GPR_ERROR, "%s",
138  absl::StrFormat("Error parsing URI(s). '%s':%s; '%s':%s", target,
139  tmp_uri.status().ToString(), *canonical_target,
140  tmp_uri2.status().ToString())
141  .c_str());
142  return nullptr;
143  }
144  gpr_log(GPR_ERROR, "Don't know how to resolve '%s' or '%s'.",
145  std::string(target).c_str(), canonical_target->c_str());
146  return nullptr;
147 }
148 
149 } // namespace grpc_core
grpc_core::ResolverRegistry::Builder::HasResolverFactory
bool HasResolverFactory(absl::string_view scheme) const
Returns true iff scheme already has a registered factory.
Definition: resolver_registry.cc:46
grpc_core::ResolverRegistry::LookupResolverFactory
ResolverFactory * LookupResolverFactory(absl::string_view scheme) const
Definition: resolver_registry.cc:108
regen-readme.it
it
Definition: regen-readme.py:15
log.h
grpc_core::ResolverFactory::CreateResolver
virtual OrphanablePtr< Resolver > CreateResolver(ResolverArgs args) const =0
Returns a new resolver instance.
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
absl::StrFormat
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &... args)
Definition: abseil-cpp/absl/strings/str_format.h:338
grpc_core
Definition: call_metric_recorder.h:31
performance.loadtest_config.default_prefix
str default_prefix()
Definition: loadtest_config.py:53
grpc_pollset_set
struct grpc_pollset_set grpc_pollset_set
Definition: iomgr_fwd.h:23
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_core::URI
Definition: uri_parser.h:31
grpc_core::ResolverRegistry::Builder::Builder
Builder()
Definition: resolver_registry.cc:34
grpc_core::ResolverFactory::GetDefaultAuthority
virtual std::string GetDefaultAuthority(const URI &uri) const
Definition: resolver_factory.h:71
grpc_core::URI::Parse
static absl::StatusOr< URI > Parse(absl::string_view uri_text)
Definition: uri_parser.cc:209
grpc_core::ResolverFactory::IsValidUri
virtual bool IsValidUri(const URI &uri) const =0
grpc_core::ResolverRegistry::State::default_prefix
std::string default_prefix
Definition: resolver_registry.h:44
grpc_channel_args
Definition: grpc_types.h:132
grpc_core::ResolverRegistry::AddDefaultPrefixIfNeeded
std::string AddDefaultPrefixIfNeeded(absl::string_view target) const
Returns target with the default prefix prepended, if needed.
Definition: resolver_registry.cc:100
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_core::ResolverArgs::args
const grpc_channel_args * args
Channel args to be included in resolver results.
Definition: resolver_factory.h:45
grpc_core::ResolverRegistry::ResolverRegistry
ResolverRegistry(const ResolverRegistry &)=delete
grpc_core::ResolverRegistry::state_
State state_
Definition: resolver_registry.h:119
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
grpc_core::ResolverRegistry::FindResolverFactory
ResolverFactory * FindResolverFactory(absl::string_view target, URI *uri, std::string *canonical_target) const
Definition: resolver_registry.cc:119
grpc_core::ResolverRegistry::State::factories
std::map< absl::string_view, std::unique_ptr< ResolverFactory > > factories
Definition: resolver_registry.h:43
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_core::ResolverArgs
Definition: resolver_factory.h:41
grpc_core::ResolverRegistry::GetDefaultAuthority
std::string GetDefaultAuthority(absl::string_view target) const
Returns the default authority to pass from a client for target.
Definition: resolver_registry.cc:90
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
resolver_registry.h
grpc_core::ResolverRegistry::CreateResolver
OrphanablePtr< Resolver > CreateResolver(absl::string_view target, const grpc_channel_args *args, grpc_pollset_set *pollset_set, std::shared_ptr< WorkSerializer > work_serializer, std::unique_ptr< Resolver::ResultHandler > result_handler) const
Definition: resolver_registry.cc:73
grpc_core::ResolverArgs::uri
URI uri
The parsed URI to resolve.
Definition: resolver_factory.h:43
grpc_core::ResolverRegistry::Builder::SetDefaultPrefix
void SetDefaultPrefix(std::string default_prefix)
Sets the default URI prefix to default_prefix.
Definition: resolver_registry.cc:36
absl::StatusOr::ok
ABSL_MUST_USE_RESULT bool ok() const
Definition: abseil-cpp/absl/status/statusor.h:491
grpc_core::ResolverRegistry
Definition: resolver_registry.h:39
grpc_core::ResolverRegistry::IsValidTarget
bool IsValidTarget(absl::string_view target) const
Checks whether the user input target is valid to create a resolver.
Definition: resolver_registry.cc:64
grpc_core::OrphanablePtr
std::unique_ptr< T, Deleter > OrphanablePtr
Definition: orphanable.h:64
grpc_core::ResolverArgs::pollset_set
grpc_pollset_set * pollset_set
Used to drive I/O in the name resolution process.
Definition: resolver_factory.h:47
grpc_core::ResolverRegistry::Builder::Reset
void Reset()
Wipe everything in the registry and reset to empty.
Definition: resolver_registry.cc:51
grpc_core::ResolverRegistry::Builder::Build
ResolverRegistry Build()
Definition: resolver_registry.cc:56
grpc_core::ResolverArgs::work_serializer
std::shared_ptr< WorkSerializer > work_serializer
The work_serializer under which all resolver calls will be run.
Definition: resolver_factory.h:49
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
grpc_core::ResolverFactory
Definition: resolver_factory.h:54
grpc_core::ResolverArgs::result_handler
std::unique_ptr< Resolver::ResultHandler > result_handler
The result handler to be used by the resolver.
Definition: resolver_factory.h:51
setup.target
target
Definition: third_party/bloaty/third_party/protobuf/python/setup.py:179
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory
void RegisterResolverFactory(std::unique_ptr< ResolverFactory > factory)
Definition: resolver_registry.cc:40
absl::StatusOr::status
const Status & status() const &
Definition: abseil-cpp/absl/status/statusor.h:678
port_platform.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:11