diff options
author | xenoxeno <xeno@ydb.tech> | 2022-11-09 16:37:33 +0300 |
---|---|---|
committer | xenoxeno <xeno@ydb.tech> | 2022-11-09 16:37:33 +0300 |
commit | 0211ab89df33d2b2e9e55b797e40219f32998c3f (patch) | |
tree | 144e56a06397ecdf7ca618f7e12f4d62300c0e8d | |
parent | 28f0a1aee239e92629105cb66a941dad9a2f5165 (diff) | |
download | ydb-0211ab89df33d2b2e9e55b797e40219f32998c3f.tar.gz |
guess socket type on creation
-rw-r--r-- | library/cpp/actors/http/http_proxy_acceptor.cpp | 16 | ||||
-rw-r--r-- | library/cpp/actors/http/http_proxy_sock64.h | 29 |
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) { |