aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxenoxeno <xeno@ydb.tech>2022-11-09 16:37:33 +0300
committerxenoxeno <xeno@ydb.tech>2022-11-09 16:37:33 +0300
commit0211ab89df33d2b2e9e55b797e40219f32998c3f (patch)
tree144e56a06397ecdf7ca618f7e12f4d62300c0e8d
parent28f0a1aee239e92629105cb66a941dad9a2f5165 (diff)
downloadydb-0211ab89df33d2b2e9e55b797e40219f32998c3f.tar.gz
guess socket type on creation
-rw-r--r--library/cpp/actors/http/http_proxy_acceptor.cpp16
-rw-r--r--library/cpp/actors/http/http_proxy_sock64.h29
2 files changed, 38 insertions, 7 deletions
diff --git a/library/cpp/actors/http/http_proxy_acceptor.cpp b/library/cpp/actors/http/http_proxy_acceptor.cpp
index 643f3ce7bf..0e8842aa07 100644
--- a/library/cpp/actors/http/http_proxy_acceptor.cpp
+++ b/library/cpp/actors/http/http_proxy_acceptor.cpp
@@ -19,13 +19,7 @@ public:
: NActors::TActor<TAcceptorActor>(&TAcceptorActor::StateInit)
, Owner(owner)
, Poller(poller)
- , Socket(new TSocketDescriptor())
{
- // for unit tests :(
- SetSockOpt(Socket->Socket, SOL_SOCKET, SO_REUSEADDR, (int)true);
-#ifdef SO_REUSEPORT
- SetSockOpt(Socket->Socket, SOL_SOCKET, SO_REUSEPORT, (int)true);
-#endif
}
static constexpr char ActorName[] = "HTTP_ACCEPTOR_ACTOR";
@@ -47,7 +41,15 @@ protected:
}
void HandleInit(TEvHttpProxy::TEvAddListeningPort::TPtr event, const NActors::TActorContext& ctx) {
- SocketAddressType bindAddress(Socket->Socket.MakeAddress(event->Get()->Address,event->Get()->Port));
+ TString address = event->Get()->Address;
+ ui16 port = event->Get()->Port;
+ Socket = new TSocketDescriptor(SocketType::GuessAddressFamily(address));
+ // for unit tests :(
+ SetSockOpt(Socket->Socket, SOL_SOCKET, SO_REUSEADDR, (int)true);
+#ifdef SO_REUSEPORT
+ SetSockOpt(Socket->Socket, SOL_SOCKET, SO_REUSEPORT, (int)true);
+#endif
+ SocketAddressType bindAddress(Socket->Socket.MakeAddress(address, port));
Endpoint = std::make_shared<TPrivateEndpointInfo>(event->Get()->CompressContentTypes);
Endpoint->Owner = ctx.SelfID;
Endpoint->Proxy = Owner;
diff --git a/library/cpp/actors/http/http_proxy_sock64.h b/library/cpp/actors/http/http_proxy_sock64.h
index 29b7b34b47..9b7db8f662 100644
--- a/library/cpp/actors/http/http_proxy_sock64.h
+++ b/library/cpp/actors/http/http_proxy_sock64.h
@@ -67,6 +67,35 @@ public:
throw yexception() << "Unable to resolve address " << address;
}
+ static int GuessAddressFamily(const TString& address) {
+ if (!address) {
+ return 0;
+ }
+ if (NHttp::IsIPv6(address)) {
+ return AF_INET6;
+ } else if (NHttp::IsIPv4(address)) {
+ return AF_INET;
+ }
+ struct addrinfo hints = {
+ .ai_flags = AI_PASSIVE,
+ .ai_family = 0,
+ .ai_socktype = SOCK_STREAM,
+ };
+ struct addrinfo* gai_res = nullptr;
+ int gai_ret = getaddrinfo(address.data(), nullptr, &hints, &gai_res);
+ if (gai_ret == 0 && gai_res->ai_addr) {
+ switch (gai_res->ai_addr->sa_family) {
+ case AF_INET:
+ case AF_INET6:
+ return gai_res->ai_addr->sa_family;
+ }
+ }
+ if (gai_res) {
+ freeaddrinfo(gai_res);
+ }
+ return 0;
+ }
+
static std::shared_ptr<ISockAddr> MakeAddress(const sockaddr_storage& storage) {
std::shared_ptr<ISockAddr> addr;
switch (storage.ss_family) {