Skip to content

Commit 76edd47

Browse files
committed
Add endpoint::to_string(port) defaulted port value, and to_lower(port).
1 parent e5bd65f commit 76edd47

3 files changed

Lines changed: 74 additions & 34 deletions

File tree

include/bitcoin/system/config/endpoint.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,10 @@ class BC_API endpoint
6161
/// Methods.
6262
/// -----------------------------------------------------------------------
6363

64-
/// The endpoint is of the form host[:port], empty (zero) port is omitted.
65-
std::string to_string() const NOEXCEPT;
64+
/// The endpoint is of the form host[:port], empty port if zero (default).
65+
/// Specify non-zero default to explicitly serialize in case of default.
66+
std::string to_string(uint16_t default_port=0) const NOEXCEPT;
67+
std::string to_lower(uint16_t default_port=0) const NOEXCEPT;
6668

6769
/// Return a new endpoint that replaces host instances of "*" with
6870
/// "localhost". This is intended for clients that wish to connect

src/config/endpoint.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <bitcoin/system/config/utilities.hpp>
2525
#include <bitcoin/system/define.hpp>
2626
#include <bitcoin/system/serial/serial.hpp>
27+
#include <bitcoin/system/unicode/unicode.hpp>
2728

2829
namespace libbitcoin {
2930
namespace system {
@@ -85,9 +86,15 @@ endpoint endpoint::to_local() const NOEXCEPT
8586
return { host, port_ };
8687
}
8788

88-
std::string endpoint::to_string() const NOEXCEPT
89+
std::string endpoint::to_string(uint16_t default_port) const NOEXCEPT
8990
{
90-
return is_zero(port()) ? host() : host() + ":" + serialize(port());
91+
const auto value = is_zero(port()) ? default_port : port();
92+
return is_zero(value) ? host() : host() + ":" + serialize(value);
93+
}
94+
95+
std::string endpoint::to_lower(uint16_t default_port) const NOEXCEPT
96+
{
97+
return system::ascii_to_lower(to_string(default_port));
9198
}
9299

93100
// Operators.

test/config/endpoint.cpp

Lines changed: 61 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,84 +28,115 @@ using namespace boost::program_options;
2828

2929
BOOST_AUTO_TEST_CASE(endpoint__construct__empty__throws_invalid_option)
3030
{
31-
BOOST_REQUIRE_THROW(endpoint host(""), invalid_option_value);
31+
BOOST_REQUIRE_THROW(endpoint instance(""), invalid_option_value);
3232
}
3333

3434
BOOST_AUTO_TEST_CASE(endpoint__construct__question_mark__throws_invalid_option_value)
3535
{
36-
BOOST_REQUIRE_THROW(endpoint host("foo.bar?foobar:42"), invalid_option_value);
36+
BOOST_REQUIRE_THROW(endpoint instance("foo.bar?foobar:42"), invalid_option_value);
3737
}
3838

3939
BOOST_AUTO_TEST_CASE(endpoint__construct__forward_slash__throws_invalid_option_value)
4040
{
41-
BOOST_REQUIRE_THROW(endpoint host("foo.bar/foobar:42"), invalid_option_value);
41+
BOOST_REQUIRE_THROW(endpoint instance("foo.bar/foobar:42"), invalid_option_value);
4242
}
4343

4444
BOOST_AUTO_TEST_CASE(endpoint__construct__backslash__throws_invalid_option_value)
4545
{
46-
BOOST_REQUIRE_THROW(endpoint host("foo.bar\\foobar:42"), invalid_option_value);
46+
BOOST_REQUIRE_THROW(endpoint instance("foo.bar\\foobar:42"), invalid_option_value);
4747
}
4848

4949
BOOST_AUTO_TEST_CASE(endpoint__construct__host_colon__throws_invalid_option_value)
5050
{
51-
BOOST_REQUIRE_THROW(endpoint host("foo.bar:foobar:42"), invalid_option_value);
51+
BOOST_REQUIRE_THROW(endpoint instance("foo.bar:foobar:42"), invalid_option_value);
5252
}
5353

5454
BOOST_AUTO_TEST_CASE(endpoint__construct__ipv6_non_literal__throws_invalid_option_value)
5555
{
56-
BOOST_REQUIRE_THROW(endpoint host("a::bc:def::123:45:6"), invalid_option_value);
56+
BOOST_REQUIRE_THROW(endpoint instance("a::bc:def::123:45:6"), invalid_option_value);
5757
}
5858

5959
BOOST_AUTO_TEST_CASE(endpoint__construct__default__localhost)
6060
{
61-
endpoint host{};
62-
BOOST_REQUIRE_EQUAL(host.host(), "localhost");
63-
BOOST_REQUIRE_EQUAL(host.port(), 0u);
64-
BOOST_REQUIRE_EQUAL(host.to_string(), "localhost");
61+
endpoint instance{};
62+
BOOST_REQUIRE_EQUAL(instance.host(), "localhost");
63+
BOOST_REQUIRE_EQUAL(instance.port(), 0u);
64+
BOOST_REQUIRE_EQUAL(instance.to_string(), "localhost");
65+
BOOST_REQUIRE_EQUAL(instance.to_string(0), "localhost");
66+
BOOST_REQUIRE_EQUAL(instance.to_string(42), "localhost:42");
67+
BOOST_REQUIRE_EQUAL(instance.to_lower(), "localhost");
68+
BOOST_REQUIRE_EQUAL(instance.to_lower(0), "localhost");
69+
BOOST_REQUIRE_EQUAL(instance.to_lower(42), "localhost:42");
6570
}
6671

6772
BOOST_AUTO_TEST_CASE(endpoint__construct__host__expected_values)
6873
{
69-
endpoint host("foo");
70-
BOOST_REQUIRE_EQUAL(host.host(), "foo");
71-
BOOST_REQUIRE_EQUAL(host.port(), 0u);
72-
BOOST_REQUIRE_EQUAL(host.to_string(), "foo");
74+
endpoint instance("FOO");
75+
BOOST_REQUIRE_EQUAL(instance.host(), "FOO");
76+
BOOST_REQUIRE_EQUAL(instance.port(), 0u);
77+
BOOST_REQUIRE_EQUAL(instance.to_string(), "FOO");
78+
BOOST_REQUIRE_EQUAL(instance.to_string(0), "FOO");
79+
BOOST_REQUIRE_EQUAL(instance.to_string(42), "FOO:42");
80+
BOOST_REQUIRE_EQUAL(instance.to_lower(), "foo");
81+
BOOST_REQUIRE_EQUAL(instance.to_lower(0), "foo");
82+
BOOST_REQUIRE_EQUAL(instance.to_lower(42), "foo:42");
7383
}
7484

7585
BOOST_AUTO_TEST_CASE(endpoint__construct__host_port__expected_values)
7686
{
77-
endpoint endpoint("foo.bar:42");
78-
BOOST_REQUIRE_EQUAL(endpoint.host(), "foo.bar");
79-
BOOST_REQUIRE_EQUAL(endpoint.port(), 42u);
80-
BOOST_REQUIRE_EQUAL(endpoint.to_string(), "foo.bar:42");
87+
endpoint instance("foo.bar:42");
88+
BOOST_REQUIRE_EQUAL(instance.host(), "foo.bar");
89+
BOOST_REQUIRE_EQUAL(instance.port(), 42u);
90+
BOOST_REQUIRE_EQUAL(instance.to_string(), "foo.bar:42");
91+
BOOST_REQUIRE_EQUAL(instance.to_string(0), "foo.bar:42");
92+
BOOST_REQUIRE_EQUAL(instance.to_string(80), "foo.bar:42");
93+
BOOST_REQUIRE_EQUAL(instance.to_lower(), "foo.bar:42");
94+
BOOST_REQUIRE_EQUAL(instance.to_lower(0), "foo.bar:42");
95+
BOOST_REQUIRE_EQUAL(instance.to_lower(80), "foo.bar:42");
8196
}
8297

8398
BOOST_AUTO_TEST_CASE(endpoint__construct__ipv4_port__expected_values)
8499
{
85-
endpoint host("127.0.0.1:42");
86-
BOOST_REQUIRE_EQUAL(host.host(), "127.0.0.1");
87-
BOOST_REQUIRE_EQUAL(host.port(), 42u);
88-
BOOST_REQUIRE_EQUAL(host.to_string(), "127.0.0.1:42");
100+
endpoint instance("127.0.0.1:42");
101+
BOOST_REQUIRE_EQUAL(instance.host(), "127.0.0.1");
102+
BOOST_REQUIRE_EQUAL(instance.port(), 42u);
103+
BOOST_REQUIRE_EQUAL(instance.to_string(), "127.0.0.1:42");
104+
BOOST_REQUIRE_EQUAL(instance.to_string(0), "127.0.0.1:42");
105+
BOOST_REQUIRE_EQUAL(instance.to_string(80), "127.0.0.1:42");
106+
BOOST_REQUIRE_EQUAL(instance.to_lower(), "127.0.0.1:42");
107+
BOOST_REQUIRE_EQUAL(instance.to_lower(0), "127.0.0.1:42");
108+
BOOST_REQUIRE_EQUAL(instance.to_lower(80), "127.0.0.1:42");
89109
}
90110

91111
BOOST_AUTO_TEST_CASE(endpoint__construct__ipv6_port__expected_values)
92112
{
93-
endpoint host("[a::bc:def::123:45:6]:42");
94-
BOOST_REQUIRE_EQUAL(host.host(), "[a::bc:def::123:45:6]");
95-
BOOST_REQUIRE_EQUAL(host.port(), 42u);
96-
BOOST_REQUIRE_EQUAL(host.to_string(), "[a::bc:def::123:45:6]:42");
113+
// Requires lower case hex.
114+
endpoint instance("[a::bc:def::123:45:6]:42");
115+
BOOST_REQUIRE_EQUAL(instance.host(), "[a::bc:def::123:45:6]");
116+
BOOST_REQUIRE_EQUAL(instance.port(), 42u);
117+
BOOST_REQUIRE_EQUAL(instance.to_string(), "[a::bc:def::123:45:6]:42");
118+
BOOST_REQUIRE_EQUAL(instance.to_string(0), "[a::bc:def::123:45:6]:42");
119+
BOOST_REQUIRE_EQUAL(instance.to_string(80), "[a::bc:def::123:45:6]:42");
120+
BOOST_REQUIRE_EQUAL(instance.to_lower(), "[a::bc:def::123:45:6]:42");
121+
BOOST_REQUIRE_EQUAL(instance.to_lower(0), "[a::bc:def::123:45:6]:42");
122+
BOOST_REQUIRE_EQUAL(instance.to_lower(80), "[a::bc:def::123:45:6]:42");
97123
}
98124

99125
// to_local
100126

101127
BOOST_AUTO_TEST_CASE(endpoint__to_local__host_port__expected_values)
102128
{
103129
endpoint original("*:12345");
104-
const auto host = original.to_local();
105-
BOOST_REQUIRE_EQUAL(host.host(), "localhost");
106-
BOOST_REQUIRE_EQUAL(host.port(), 12345u);
107-
BOOST_REQUIRE_EQUAL(host.to_string(), "localhost:12345");
130+
const auto instance = original.to_local();
131+
BOOST_REQUIRE_EQUAL(instance.host(), "localhost");
132+
BOOST_REQUIRE_EQUAL(instance.port(), 12345u);
133+
BOOST_REQUIRE_EQUAL(instance.to_string(), "localhost:12345");
108134
BOOST_REQUIRE_EQUAL(original.to_string(), "*:12345");
135+
BOOST_REQUIRE_EQUAL(original.to_string(0), "*:12345");
136+
BOOST_REQUIRE_EQUAL(original.to_string(80), "*:12345");
137+
BOOST_REQUIRE_EQUAL(original.to_lower(), "*:12345");
138+
BOOST_REQUIRE_EQUAL(original.to_lower(0), "*:12345");
139+
BOOST_REQUIRE_EQUAL(original.to_lower(80), "*:12345");
109140
}
110141

111142
// equality

0 commit comments

Comments
 (0)