aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/restricted/aws/aws-crt-cpp/source/io/HostResolver.cpp
diff options
context:
space:
mode:
authordakovalkov <dakovalkov@yandex-team.com>2023-12-03 13:33:55 +0300
committerdakovalkov <dakovalkov@yandex-team.com>2023-12-03 14:04:39 +0300
commit2a718325637e5302334b6d0a6430f63168f8dbb3 (patch)
tree64be81080b7df9ec1d86d053a0c394ae53fcf1fe /contrib/restricted/aws/aws-crt-cpp/source/io/HostResolver.cpp
parente0d94a470142d95c3007e9c5d80380994940664a (diff)
downloadydb-2a718325637e5302334b6d0a6430f63168f8dbb3.tar.gz
Update contrib/libs/aws-sdk-cpp to 1.11.37
Diffstat (limited to 'contrib/restricted/aws/aws-crt-cpp/source/io/HostResolver.cpp')
-rw-r--r--contrib/restricted/aws/aws-crt-cpp/source/io/HostResolver.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/contrib/restricted/aws/aws-crt-cpp/source/io/HostResolver.cpp b/contrib/restricted/aws/aws-crt-cpp/source/io/HostResolver.cpp
new file mode 100644
index 0000000000..18173fc413
--- /dev/null
+++ b/contrib/restricted/aws/aws-crt-cpp/source/io/HostResolver.cpp
@@ -0,0 +1,121 @@
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+#include <aws/crt/io/HostResolver.h>
+
+#include <aws/crt/io/EventLoopGroup.h>
+
+#include <aws/common/string.h>
+#include <aws/crt/Api.h>
+
+namespace Aws
+{
+ namespace Crt
+ {
+ namespace Io
+ {
+ HostResolver::~HostResolver() {}
+
+ DefaultHostResolver::DefaultHostResolver(
+ EventLoopGroup &elGroup,
+ size_t maxHosts,
+ size_t maxTTL,
+ Allocator *allocator) noexcept
+ : m_resolver(nullptr), m_allocator(allocator), m_initialized(false)
+ {
+ AWS_ZERO_STRUCT(m_config);
+
+ struct aws_host_resolver_default_options resolver_options;
+ AWS_ZERO_STRUCT(resolver_options);
+ resolver_options.max_entries = maxHosts;
+ resolver_options.el_group = elGroup.GetUnderlyingHandle();
+
+ m_resolver = aws_host_resolver_new_default(allocator, &resolver_options);
+ if (m_resolver != nullptr)
+ {
+ m_initialized = true;
+ }
+
+ m_config.impl = aws_default_dns_resolve;
+ m_config.impl_data = nullptr;
+ m_config.max_ttl = maxTTL;
+ }
+
+ DefaultHostResolver::DefaultHostResolver(size_t maxHosts, size_t maxTTL, Allocator *allocator) noexcept
+ : DefaultHostResolver(
+ *Crt::ApiHandle::GetOrCreateStaticDefaultEventLoopGroup(),
+ maxHosts,
+ maxTTL,
+ allocator)
+ {
+ }
+
+ DefaultHostResolver::~DefaultHostResolver()
+ {
+ aws_host_resolver_release(m_resolver);
+ m_initialized = false;
+ }
+
+ /**
+ * @private
+ */
+ struct DefaultHostResolveArgs
+ {
+ Allocator *allocator;
+ HostResolver *resolver;
+ OnHostResolved onResolved;
+ aws_string *host;
+ };
+
+ void DefaultHostResolver::s_onHostResolved(
+ struct aws_host_resolver *,
+ const struct aws_string *hostName,
+ int errCode,
+ const struct aws_array_list *hostAddresses,
+ void *userData)
+ {
+ DefaultHostResolveArgs *args = static_cast<DefaultHostResolveArgs *>(userData);
+
+ size_t len = aws_array_list_length(hostAddresses);
+ Vector<HostAddress> addresses;
+
+ for (size_t i = 0; i < len; ++i)
+ {
+ HostAddress *address_ptr = NULL;
+ aws_array_list_get_at_ptr(hostAddresses, reinterpret_cast<void **>(&address_ptr), i);
+ addresses.push_back(*address_ptr);
+ }
+
+ String host(aws_string_c_str(hostName), hostName->len);
+ args->onResolved(*args->resolver, addresses, errCode);
+ aws_string_destroy(args->host);
+ Delete(args, args->allocator);
+ }
+
+ bool DefaultHostResolver::ResolveHost(const String &host, const OnHostResolved &onResolved) noexcept
+ {
+ DefaultHostResolveArgs *args = New<DefaultHostResolveArgs>(m_allocator);
+ if (!args)
+ {
+ return false;
+ }
+
+ args->host = aws_string_new_from_array(
+ m_allocator, reinterpret_cast<const uint8_t *>(host.data()), host.length());
+ args->onResolved = onResolved;
+ args->resolver = this;
+ args->allocator = m_allocator;
+
+ if (!args->host ||
+ aws_host_resolver_resolve_host(m_resolver, args->host, s_onHostResolved, &m_config, args))
+ {
+ Delete(args, m_allocator);
+ return false;
+ }
+
+ return true;
+ }
+ } // namespace Io
+ } // namespace Crt
+} // namespace Aws