diff options
author | Haavard <havardpe@yahoo-inc.com> | 2017-04-07 13:42:01 +0000 |
---|---|---|
committer | Haavard <havardpe@yahoo-inc.com> | 2017-04-07 13:44:37 +0000 |
commit | e4d73b77d98cb1a8461ce765b5cf9d39612648fb (patch) | |
tree | 6e3635f4f1e2bc396fd7992ca229673c76299449 /vespalib | |
parent | 9074fb3e8509d803dfcc4484c3dc1e9d6d39c909 (diff) |
do not include wildcard ip in address spec
also use 'localhost' as fallback for client addresses
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/tests/net/socket/socket_test.cpp | 48 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/net/socket_address.cpp | 23 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/net/socket_address.h | 1 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/net/socket_spec.cpp | 3 |
4 files changed, 69 insertions, 6 deletions
diff --git a/vespalib/src/tests/net/socket/socket_test.cpp b/vespalib/src/tests/net/socket/socket_test.cpp index a5a97e7d1ae..44380f7d31e 100644 --- a/vespalib/src/tests/net/socket/socket_test.cpp +++ b/vespalib/src/tests/net/socket/socket_test.cpp @@ -10,6 +10,23 @@ using namespace vespalib; +vespalib::string get_meta(const SocketAddress &addr) { + vespalib::string meta; + if (addr.is_ipv4()) { + meta = "ipv4"; + } else if (addr.is_ipv6()) { + meta = "ipv6"; + } else if (addr.is_ipc()) { + meta = "ipc"; + } else { + meta = "???"; + } + if (addr.is_wildcard()) { + meta += " wildcard"; + } + return meta; +} + vespalib::string read_bytes(Socket &socket, size_t wanted_bytes) { char tmp[64]; vespalib::string result; @@ -44,8 +61,11 @@ Socket::UP connect_sockets(bool is_server, ServerSocket &server_socket) { if (is_server) { return server_socket.accept(); } else { - vespalib::string spec = server_socket.address().spec(); - fprintf(stderr, "connecting to: %s\n", spec.c_str()); + auto server = server_socket.address(); + auto spec = server.spec(); + auto client = SocketSpec(spec).client_address(); + fprintf(stderr, "connecting to '%s' (server: %s) (client: %s)\n", + spec.c_str(), get_meta(server).c_str(), get_meta(client).c_str()); return Socket::connect(SocketSpec(spec)); } } @@ -56,7 +76,9 @@ TEST("my local address") { auto list = SocketAddress::resolve(4080); fprintf(stderr, "resolve(4080):\n"); for (const auto &addr: list) { - fprintf(stderr, " %s\n", addr.spec().c_str()); + EXPECT_TRUE(addr.is_wildcard()); + EXPECT_EQUAL(addr.port(), 4080); + fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str()); } } @@ -64,16 +86,32 @@ TEST("yahoo.com address") { auto list = SocketAddress::resolve(80, "yahoo.com"); fprintf(stderr, "resolve(80, 'yahoo.com'):\n"); for (const auto &addr: list) { - fprintf(stderr, " %s\n", addr.spec().c_str()); + EXPECT_TRUE(!addr.is_wildcard()); + EXPECT_EQUAL(addr.port(), 80); + fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str()); } } TEST("ipc address") { auto addr = SocketAddress::from_path("my_socket"); EXPECT_TRUE(addr.is_ipc()); + EXPECT_TRUE(!addr.is_wildcard()); + EXPECT_EQUAL(addr.port(), -1); EXPECT_EQUAL(vespalib::string("my_socket"), addr.path()); fprintf(stderr, "from_path(my_socket)\n"); - fprintf(stderr, " %s\n", addr.spec().c_str()); + fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str()); +} + +TEST("local client/server addresses") { + auto spec = SocketSpec("tcp/123"); + auto client = spec.client_address(); + auto server = spec.server_address(); + EXPECT_TRUE(!client.is_wildcard()); + EXPECT_EQUAL(client.port(), 123); + EXPECT_TRUE(server.is_wildcard()); + EXPECT_EQUAL(server.port(), 123); + fprintf(stderr, "client(tcp/123): %s (%s)\n", client.spec().c_str(), get_meta(client).c_str()); + fprintf(stderr, "server(tcp/123): %s (%s)\n", server.spec().c_str(), get_meta(server).c_str()); } struct ServerWrapper { diff --git a/vespalib/src/vespa/vespalib/net/socket_address.cpp b/vespalib/src/vespa/vespalib/net/socket_address.cpp index d6cb5a3582b..1484c650156 100644 --- a/vespalib/src/vespa/vespalib/net/socket_address.cpp +++ b/vespalib/src/vespa/vespalib/net/socket_address.cpp @@ -11,6 +11,26 @@ namespace vespalib { +namespace { + +const in6_addr ipv6_wildcard = IN6ADDR_ANY_INIT; + +} // namespace vespalib::<unnamed> + +bool +SocketAddress::is_wildcard() const +{ + if (is_ipv4()) { + const sockaddr_in *addr = reinterpret_cast<const sockaddr_in *>(&_addr); + return (addr->sin_addr.s_addr == htonl(INADDR_ANY)); + } + if (is_ipv6()) { + const sockaddr_in6 *addr = reinterpret_cast<const sockaddr_in6 *>(&_addr); + return (memcmp(&addr->sin6_addr, &ipv6_wildcard, sizeof(in6_addr)) == 0); + } + return false; +} + vespalib::string SocketAddress::ip_address() const { @@ -69,6 +89,9 @@ SocketAddress::port() const vespalib::string SocketAddress::spec() const { + if (is_wildcard()) { + return make_string("tcp/%d", port()); + } if (is_ipv4()) { return make_string("tcp/%s:%d", ip_address().c_str(), port()); } diff --git a/vespalib/src/vespa/vespalib/net/socket_address.h b/vespalib/src/vespa/vespalib/net/socket_address.h index a71b676f274..e614aca5365 100644 --- a/vespalib/src/vespa/vespalib/net/socket_address.h +++ b/vespalib/src/vespa/vespalib/net/socket_address.h @@ -32,6 +32,7 @@ public: bool is_ipv4() const { return (valid() && (_addr.ss_family == AF_INET)); } bool is_ipv6() const { return (valid() && (_addr.ss_family == AF_INET6)); } bool is_ipc() const { return (valid() && (_addr.ss_family == AF_UNIX)); } + bool is_wildcard() const; int port() const; vespalib::string ip_address() const; vespalib::string path() const; diff --git a/vespalib/src/vespa/vespalib/net/socket_spec.cpp b/vespalib/src/vespa/vespalib/net/socket_spec.cpp index 6427225dbae..061ba5879f5 100644 --- a/vespalib/src/vespa/vespalib/net/socket_spec.cpp +++ b/vespalib/src/vespa/vespalib/net/socket_spec.cpp @@ -20,7 +20,8 @@ SocketSpec::address(bool server) const if (!_path.empty()) { return SocketAddress::from_path(_path); } - const char *node = _host.empty() ? nullptr : _host.c_str(); + const char *fallback = server ? nullptr : "localhost"; + const char *node = _host.empty() ? fallback : _host.c_str(); if (server) { return SocketAddress::select_local(_port, node); } else { |