22 #include <type_traits>
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"
49 class SockaddrResolver :
public Resolver {
52 ~SockaddrResolver()
override;
54 void StartLocked()
override;
56 void ShutdownLocked()
override {}
70 SockaddrResolver::~SockaddrResolver() {
74 void SockaddrResolver::StartLocked() {
87 bool ParseUri(
const URI& uri,
90 if (!uri.authority().empty()) {
92 uri.scheme().c_str());
96 bool errors_found =
false;
98 if (ith_path.empty()) {
102 auto ith_uri = URI::Create(uri.scheme(),
"",
std::string(ith_path), {},
"");
104 if (!ith_uri.ok() || !
parse(*ith_uri, &
addr)) {
108 if (addresses !=
nullptr) {
109 addresses->emplace_back(
addr,
nullptr );
112 return !errors_found;
115 OrphanablePtr<Resolver> CreateSockaddrResolver(
118 if (!ParseUri(
args.uri,
parse, &addresses))
return nullptr;
120 return MakeOrphanable<SockaddrResolver>(
std::move(addresses),
124 class IPv4ResolverFactory :
public ResolverFactory {
126 bool IsValidUri(
const URI& uri)
const override {
130 OrphanablePtr<Resolver> CreateResolver(ResolverArgs
args)
const override {
137 class IPv6ResolverFactory :
public ResolverFactory {
139 bool IsValidUri(
const URI& uri)
const override {
143 OrphanablePtr<Resolver> CreateResolver(ResolverArgs
args)
const override {
150 #ifdef GRPC_HAVE_UNIX_SOCKET
151 class UnixResolverFactory :
public ResolverFactory {
153 bool IsValidUri(
const URI& uri)
const override {
157 OrphanablePtr<Resolver> CreateResolver(ResolverArgs
args)
const override {
161 std::string GetDefaultAuthority(
const URI& )
const override {
168 class UnixAbstractResolverFactory :
public ResolverFactory {
172 bool IsValidUri(
const URI& uri)
const override {
176 OrphanablePtr<Resolver> CreateResolver(ResolverArgs
args)
const override {
180 std::string GetDefaultAuthority(
const URI& )
const override {
184 #endif // GRPC_HAVE_UNIX_SOCKET
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>());