aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorivanzhukov <ivanzhukov@ydb.tech>2022-08-26 10:45:09 +0300
committerivanzhukov <ivanzhukov@ydb.tech>2022-08-26 10:45:09 +0300
commit89cae858a59ecae5378edcd229962b6d1be5e5f8 (patch)
tree5848d1648d954926c8048c0e9edaa261255aceea
parentaf6b0b93037268a9ca1343dd09629cf910c944d9 (diff)
downloadydb-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.cpp20
-rw-r--r--util/network/address.h13
-rw-r--r--util/network/sock.h18
-rw-r--r--util/network/sock_ut.cpp11
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");
+ }
}