sockaddr_resolver.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 
19 #include <algorithm>
20 #include <memory>
21 #include <string>
22 #include <type_traits>
23 #include <utility>
24 
25 #include "absl/memory/memory.h"
26 #include "absl/status/statusor.h"
27 #include "absl/strings/str_split.h"
28 #include "absl/strings/string_view.h"
29 
31 #include <grpc/support/log.h>
32 
44 
45 namespace grpc_core {
46 
47 namespace {
48 
49 class SockaddrResolver : public Resolver {
50  public:
51  SockaddrResolver(ServerAddressList addresses, ResolverArgs args);
52  ~SockaddrResolver() override;
53 
54  void StartLocked() override;
55 
56  void ShutdownLocked() override {}
57 
58  private:
59  std::unique_ptr<ResultHandler> result_handler_;
61  const grpc_channel_args* channel_args_ = nullptr;
62 };
63 
64 SockaddrResolver::SockaddrResolver(ServerAddressList addresses,
65  ResolverArgs args)
66  : result_handler_(std::move(args.result_handler)),
67  addresses_(std::move(addresses)),
69 
70 SockaddrResolver::~SockaddrResolver() {
72 }
73 
74 void SockaddrResolver::StartLocked() {
75  Result result;
76  result.addresses = std::move(addresses_);
77  // TODO(roth): Use std::move() once channel args is converted to C++.
78  result.args = channel_args_;
79  channel_args_ = nullptr;
80  result_handler_->ReportResult(std::move(result));
81 }
82 
83 //
84 // Factory
85 //
86 
87 bool ParseUri(const URI& uri,
88  bool parse(const URI& uri, grpc_resolved_address* dst),
89  ServerAddressList* addresses) {
90  if (!uri.authority().empty()) {
91  gpr_log(GPR_ERROR, "authority-based URIs not supported by the %s scheme",
92  uri.scheme().c_str());
93  return false;
94  }
95  // Construct addresses.
96  bool errors_found = false;
97  for (absl::string_view ith_path : absl::StrSplit(uri.path(), ',')) {
98  if (ith_path.empty()) {
99  // Skip targets which are empty.
100  continue;
101  }
102  auto ith_uri = URI::Create(uri.scheme(), "", std::string(ith_path), {}, "");
104  if (!ith_uri.ok() || !parse(*ith_uri, &addr)) {
105  errors_found = true;
106  break;
107  }
108  if (addresses != nullptr) {
109  addresses->emplace_back(addr, nullptr /* args */);
110  }
111  }
112  return !errors_found;
113 }
114 
115 OrphanablePtr<Resolver> CreateSockaddrResolver(
116  ResolverArgs args, bool parse(const URI& uri, grpc_resolved_address* dst)) {
117  ServerAddressList addresses;
118  if (!ParseUri(args.uri, parse, &addresses)) return nullptr;
119  // Instantiate resolver.
120  return MakeOrphanable<SockaddrResolver>(std::move(addresses),
121  std::move(args));
122 }
123 
124 class IPv4ResolverFactory : public ResolverFactory {
125  public:
126  bool IsValidUri(const URI& uri) const override {
127  return ParseUri(uri, grpc_parse_ipv4, nullptr);
128  }
129 
130  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
131  return CreateSockaddrResolver(std::move(args), grpc_parse_ipv4);
132  }
133 
134  absl::string_view scheme() const override { return "ipv4"; }
135 };
136 
137 class IPv6ResolverFactory : public ResolverFactory {
138  public:
139  bool IsValidUri(const URI& uri) const override {
140  return ParseUri(uri, grpc_parse_ipv6, nullptr);
141  }
142 
143  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
144  return CreateSockaddrResolver(std::move(args), grpc_parse_ipv6);
145  }
146 
147  absl::string_view scheme() const override { return "ipv6"; }
148 };
149 
150 #ifdef GRPC_HAVE_UNIX_SOCKET
151 class UnixResolverFactory : public ResolverFactory {
152  public:
153  bool IsValidUri(const URI& uri) const override {
154  return ParseUri(uri, grpc_parse_unix, nullptr);
155  }
156 
157  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
158  return CreateSockaddrResolver(std::move(args), grpc_parse_unix);
159  }
160 
161  std::string GetDefaultAuthority(const URI& /*uri*/) const override {
162  return "localhost";
163  }
164 
165  absl::string_view scheme() const override { return "unix"; }
166 };
167 
168 class UnixAbstractResolverFactory : public ResolverFactory {
169  public:
170  absl::string_view scheme() const override { return "unix-abstract"; }
171 
172  bool IsValidUri(const URI& uri) const override {
173  return ParseUri(uri, grpc_parse_unix_abstract, nullptr);
174  }
175 
176  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
177  return CreateSockaddrResolver(std::move(args), grpc_parse_unix_abstract);
178  }
179 
180  std::string GetDefaultAuthority(const URI& /*uri*/) const override {
181  return "localhost";
182  }
183 };
184 #endif // GRPC_HAVE_UNIX_SOCKET
185 
186 } // namespace
187 
189  builder->resolver_registry()->RegisterResolverFactory(
190  absl::make_unique<IPv4ResolverFactory>());
191  builder->resolver_registry()->RegisterResolverFactory(
192  absl::make_unique<IPv6ResolverFactory>());
193 #ifdef GRPC_HAVE_UNIX_SOCKET
194  builder->resolver_registry()->RegisterResolverFactory(
195  absl::make_unique<UnixResolverFactory>());
196  builder->resolver_registry()->RegisterResolverFactory(
197  absl::make_unique<UnixAbstractResolverFactory>());
198 #endif
199 }
200 
201 } // namespace grpc_core
absl::StrSplit
strings_internal::Splitter< typename strings_internal::SelectDelimiter< Delimiter >::type, AllowEmpty, absl::string_view > StrSplit(strings_internal::ConvertibleToStringView text, Delimiter d)
Definition: abseil-cpp/absl/strings/str_split.h:499
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
dst
static const char dst[]
Definition: test-fs-copyfile.c:37
orphanable.h
log.h
core_configuration.h
grpc_parse_unix_abstract
bool grpc_parse_unix_abstract(const grpc_core::URI &, grpc_resolved_address *)
Definition: parse_address.cc:126
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::CoreConfiguration::Builder
Definition: core_configuration.h:41
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_parse_ipv6
bool grpc_parse_ipv6(const grpc_core::URI &uri, grpc_resolved_address *resolved_addr)
Definition: parse_address.cc:282
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_resolved_address
Definition: resolved_address.h:34
resolved_address.h
grpc_channel_args
Definition: grpc_types.h:132
grpc_types.h
channel_args_
const grpc_channel_args * channel_args_
Definition: sockaddr_resolver.cc:61
resolver_factory.h
parse_address.h
profile_analyzer.builder
builder
Definition: profile_analyzer.py:159
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
re2::Result
TestInstance::Result Result
Definition: bloaty/third_party/re2/re2/testing/tester.cc:96
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
server_address.h
grpc_channel_args_copy
grpc_channel_args * grpc_channel_args_copy(const grpc_channel_args *src)
Definition: channel_args.cc:285
grpc_core::RegisterSockaddrResolver
void RegisterSockaddrResolver(CoreConfiguration::Builder *builder)
Definition: sockaddr_resolver.cc:188
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_core::ServerAddressList
std::vector< ServerAddress > ServerAddressList
Definition: server_address.h:120
result_handler_
std::unique_ptr< ResultHandler > result_handler_
Definition: sockaddr_resolver.cc:59
grpc_parse_unix
bool grpc_parse_unix(const grpc_core::URI &, grpc_resolved_address *)
Definition: parse_address.cc:121
resolver_registry.h
resolver.h
port.h
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
addresses_
ServerAddressList addresses_
Definition: sockaddr_resolver.cc:60
parse
static void parse(const char *s)
Definition: debug/trace.cc:121
channel_args.h
grpc_parse_ipv4
bool grpc_parse_ipv4(const grpc_core::URI &uri, grpc_resolved_address *resolved_addr)
Definition: parse_address.cc:187
uri_parser.h
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:13