diff options
| author | cezarnik <[email protected]> | 2024-05-30 22:34:43 +0300 |
|---|---|---|
| committer | cezarnik <[email protected]> | 2024-05-30 22:47:32 +0300 |
| commit | c80eadea50925fa825e58756b8f253dae8348991 (patch) | |
| tree | af831577c71016fb44ddfae8460adaee02c70e21 | |
| parent | 202c99ad8084981b2228a13b4b02b964c38fc31a (diff) | |
Support brackets in ipv6 endpoint notation
60a062b712a946277218f01266a01df505972b31
| -rw-r--r-- | library/cpp/ipv6_address/ipv6_address.cpp | 16 | ||||
| -rw-r--r-- | library/cpp/ipv6_address/ipv6_address.h | 10 | ||||
| -rw-r--r-- | library/cpp/ipv6_address/ut/ipv6_address_ut.cpp | 20 |
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); |
