summaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorcezarnik <[email protected]>2024-05-30 22:34:43 +0300
committercezarnik <[email protected]>2024-05-30 22:47:32 +0300
commitc80eadea50925fa825e58756b8f253dae8348991 (patch)
treeaf831577c71016fb44ddfae8460adaee02c70e21 /library/cpp
parent202c99ad8084981b2228a13b4b02b964c38fc31a (diff)
Support brackets in ipv6 endpoint notation
60a062b712a946277218f01266a01df505972b31
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/ipv6_address/ipv6_address.cpp16
-rw-r--r--library/cpp/ipv6_address/ipv6_address.h10
-rw-r--r--library/cpp/ipv6_address/ut/ipv6_address_ut.cpp20
3 files changed, 39 insertions, 7 deletions
diff --git a/library/cpp/ipv6_address/ipv6_address.cpp b/library/cpp/ipv6_address/ipv6_address.cpp
index c2b33bcbe86..aed4fd46722 100644
--- a/library/cpp/ipv6_address/ipv6_address.cpp
+++ b/library/cpp/ipv6_address/ipv6_address.cpp
@@ -118,6 +118,7 @@ TIpv6Address TIpv6Address::FromString(TStringBuf str) noexcept {
TString TIpv6Address::ToString(bool* ok) const noexcept {
return ToString(true, ok);
}
+
TString TIpv6Address::ToString(bool PrintScopeId, bool* ok) const noexcept {
TString result;
bool isOk = true;
@@ -271,14 +272,17 @@ IOutputStream& operator<<(IOutputStream& out, const TIpv6Address& ipv6Address) n
}
TString THostAddressAndPort::ToString() const noexcept {
- TStringStream Str;
- Str << *this;
- return Str.Str();
+ return ToString({});
}
-IOutputStream& operator<<(IOutputStream& Out, const THostAddressAndPort& HostAddressAndPort) noexcept {
- Out << HostAddressAndPort.Ip << ":" << HostAddressAndPort.Port;
- return Out;
+TString THostAddressAndPort::ToString(THostAddressAndPortPrintOptions options) const noexcept {
+ bool isBrackets = Ip.IsIpv6();
+ return TString::Join(
+ isBrackets ? "[" : "",
+ Ip.ToString(options.PrintScopeId),
+ isBrackets ? "]:" : ":",
+ ::ToString(Port)
+ );
}
namespace {
diff --git a/library/cpp/ipv6_address/ipv6_address.h b/library/cpp/ipv6_address/ipv6_address.h
index 44e5e79012a..93f8349d4cd 100644
--- a/library/cpp/ipv6_address/ipv6_address.h
+++ b/library/cpp/ipv6_address/ipv6_address.h
@@ -72,6 +72,10 @@ public:
return Ip != 0 && (Type_ == Ipv6 || Type_ == Ipv4);
}
+ constexpr bool IsIpv6() const noexcept {
+ return Type_ == Ipv6;
+ }
+
explicit constexpr operator bool() const noexcept {
return IsValid();
}
@@ -164,6 +168,10 @@ constexpr TIpv6Address Get1() noexcept {
return {1, TIpv6Address::Ipv6};
}
+struct THostAddressAndPortPrintOptions {
+ bool PrintScopeId = false;
+};
+
struct THostAddressAndPort {
constexpr THostAddressAndPort() noexcept = default;
constexpr THostAddressAndPort(const TIpv6Address& i, TIpPort p) noexcept {
@@ -182,11 +190,11 @@ struct THostAddressAndPort {
}
TString ToString() const noexcept;
+ TString ToString(THostAddressAndPortPrintOptions options) const noexcept;
TIpv6Address Ip {};
TIpPort Port {0};
};
-IOutputStream& operator<<(IOutputStream& Out, const THostAddressAndPort& HostAddressAndPort) noexcept;
///
/// Returns
diff --git a/library/cpp/ipv6_address/ut/ipv6_address_ut.cpp b/library/cpp/ipv6_address/ut/ipv6_address_ut.cpp
index f23aabe0eea..08f4ad22ae9 100644
--- a/library/cpp/ipv6_address/ut/ipv6_address_ut.cpp
+++ b/library/cpp/ipv6_address/ut/ipv6_address_ut.cpp
@@ -6,12 +6,14 @@ class TIpv6AddressTest: public TTestBase {
UNIT_TEST_SUITE(TIpv6AddressTest);
UNIT_TEST(ParseHostAndMayBePortFromString_data);
UNIT_TEST(CheckAddressValidity)
+ UNIT_TEST(CheckToStringConversion)
UNIT_TEST_SUITE_END();
private:
void ParseHostAndMayBePortFromString_data();
void CheckAddressValidity();
void HashCompileTest();
+ void CheckToStringConversion();
};
UNIT_TEST_SUITE_REGISTRATION(TIpv6AddressTest);
@@ -106,6 +108,24 @@ void TIpv6AddressTest::CheckAddressValidity() {
static_assert(Get1() == TIpv6Address(0, 0, 0, 0, 0, 0, 0, 1));
}
+void TIpv6AddressTest::CheckToStringConversion() {
+ {
+ TString ipPort = "[2aa2::786b]:789";
+ bool ok;
+ auto result = ParseHostAndMayBePortFromString(ipPort, 80, ok);
+ auto hostAddressAndPort = std::get<THostAddressAndPort>(result);
+ UNIT_ASSERT_EQUAL(hostAddressAndPort.ToString({}), ipPort);
+ UNIT_ASSERT_EQUAL(hostAddressAndPort.ToString(), ipPort);
+ }
+ {
+ TString ipPort = "[2aa2::786b%25]:789";
+ bool ok;
+ auto result = ParseHostAndMayBePortFromString(ipPort, 80, ok);
+ auto hostAddressAndPort = std::get<THostAddressAndPort>(result);
+ UNIT_ASSERT_EQUAL(hostAddressAndPort.ToString({.PrintScopeId = true}), ipPort);
+ }
+}
+
void TIpv6AddressTest::HashCompileTest() {
std::unordered_set<TIpv6Address> test;
Y_UNUSED(test);