diff options
author | ivanzhukov <ivanzhukov@ydb.tech> | 2022-08-26 10:45:09 +0300 |
---|---|---|
committer | ivanzhukov <ivanzhukov@ydb.tech> | 2022-08-26 10:45:09 +0300 |
commit | 89cae858a59ecae5378edcd229962b6d1be5e5f8 (patch) | |
tree | 5848d1648d954926c8048c0e9edaa261255aceea | |
parent | af6b0b93037268a9ca1343dd09629cf910c944d9 (diff) | |
download | ydb-89cae858a59ecae5378edcd229962b6d1be5e5f8.tar.gz |
[http/client] Support unix domain sockets as a backend
Предыдущий заход: https://a.yandex-team.ru/review/2811077/details#comment--4489184
После изменений можно будет обращаться к HTTP серверу, слушающему на unix domain socket. Пример такого сервера:
```js
require('http').createServer((req, res) => {
console.log(req);
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify({
'metrics': [
{
'labels': {
'name': 'metric',
'some_key': 'some_value'
},
'type': 'GAUGE',
'value': 123
}
]
}, null, 4));
})
.listen('/home/ivanzhukov/test_ua/ua.sock');
// вместо .listen(7777);
```
-rw-r--r-- | util/network/address.cpp | 20 | ||||
-rw-r--r-- | util/network/address.h | 13 | ||||
-rw-r--r-- | util/network/sock.h | 18 | ||||
-rw-r--r-- | util/network/sock_ut.cpp | 11 |
4 files changed, 62 insertions, 0 deletions
diff --git a/util/network/address.cpp b/util/network/address.cpp index 140ad0d3d0a..47badf504f2 100644 --- a/util/network/address.cpp +++ b/util/network/address.cpp @@ -6,6 +6,12 @@ #include <sys/un.h> #endif +#ifndef UNIX_PATH_MAX +inline constexpr size_t UNIX_PATH_LIMIT = 108; +#else +inline constexpr size_t UNIX_PATH_LIMIT = UNIX_PATH_MAX; +#endif + using namespace NAddr; template <bool printPort> @@ -201,3 +207,17 @@ socklen_t NAddr::SockAddrLength(const sockaddr* addr) { ythrow yexception() << "unsupported address family: " << addr->sa_family; } + +TUnixSocketAddr::TUnixSocketAddr(TStringBuf path) { + Y_ENSURE(path.Size() <= UNIX_PATH_LIMIT - 1, + "Unix path \"" << path << "\" is longer than " << UNIX_PATH_LIMIT); + SockAddr_.Set(path); +} + +const sockaddr* TUnixSocketAddr::Addr() const { + return SockAddr_.SockAddr(); +} + +socklen_t TUnixSocketAddr::Len() const { + return SockAddr_.Len(); +} diff --git a/util/network/address.h b/util/network/address.h index 448fcac0c9d..fac61ce665a 100644 --- a/util/network/address.h +++ b/util/network/address.h @@ -5,6 +5,7 @@ #include <util/generic/ptr.h> #include <util/generic/string.h> +#include <util/network/sock.h> namespace NAddr { class IRemoteAddr { @@ -133,4 +134,16 @@ namespace NAddr { private: const sockaddr_in6 A_; }; + + class TUnixSocketAddr: public IRemoteAddr { + public: + explicit TUnixSocketAddr(TStringBuf path); + + const sockaddr* Addr() const override; + + socklen_t Len() const override; + + private: + TSockAddrLocal SockAddr_; + }; } diff --git a/util/network/sock.h b/util/network/sock.h index b10be2f7156..d5ebeccbb0f 100644 --- a/util/network/sock.h +++ b/util/network/sock.h @@ -77,6 +77,14 @@ struct TSockAddrLocal: public ISockAddr { strlcpy(Path, path, PathSize); } + inline void Set(TStringBuf path) noexcept { + Clear(); + in.sin_family = AF_INET; + in.sin_addr.s_addr = IpFromString("127.0.0.1"); + in.sin_port = 0; + strlcpy(Path, path.data(), Min(PathSize, path.size() + 1)); + } + sockaddr* SockAddr() { return (struct sockaddr*)(&in); } @@ -148,6 +156,10 @@ struct TSockAddrLocal: public sockaddr_un, public ISockAddr { Clear(); } + TSockAddrLocal(TStringBuf path) { + Set(path); + } + TSockAddrLocal(const char* path) { Set(path); } @@ -170,6 +182,12 @@ struct TSockAddrLocal: public sockaddr_un, public ISockAddr { strlcpy(sun_path, path, sizeof(sun_path)); } + inline void Set(TStringBuf path) noexcept { + Clear(); + sun_family = AF_UNIX; + strlcpy(sun_path, path.data(), Min(sizeof(sun_path), path.size() + 1)); + } + sockaddr* SockAddr() override { return (struct sockaddr*)(struct sockaddr_un*)this; } diff --git a/util/network/sock_ut.cpp b/util/network/sock_ut.cpp index fd8c7837478..c702e1ba04d 100644 --- a/util/network/sock_ut.cpp +++ b/util/network/sock_ut.cpp @@ -3,6 +3,7 @@ #include <library/cpp/testing/unittest/registar.h> #include <library/cpp/threading/future/legacy_future.h> +#include <util/string/split.h> #include <util/system/fs.h> Y_UNIT_TEST_SUITE(TSocketTest) { @@ -165,4 +166,14 @@ Y_UNIT_TEST_SUITE(TSocketTest) { NFs::Remove(localServerSockName); } + Y_UNIT_TEST(DetermingPath) { + const TString connectionString = "/var/run/some.sock http://localhost/endpoint"; + + TStringBuf sockPath, endpoint; + StringSplitter(connectionString).Split(' ').SkipEmpty().CollectInto(&sockPath, &endpoint); + + TSockAddrLocal sal; + sal.Set(sockPath); + UNIT_ASSERT_STRINGS_EQUAL(sal.ToString(), "/var/run/some.sock"); + } } |