aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2018-10-19 10:38:44 +0000
committerHåvard Pettersen <havardpe@oath.com>2018-10-19 10:38:44 +0000
commitaab0f55030432494d970adab1116d6ed5223ab31 (patch)
tree2a5849808336f22b4c51cbe46850b15ab84963c5
parenta50c6e8b47c6d6e1e7f82dfced1b3cd8f9fc87cd (diff)
half_close for sync crypto sockets
-rw-r--r--vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp27
-rw-r--r--vespalib/src/vespa/vespalib/net/sync_crypto_socket.cpp10
-rw-r--r--vespalib/src/vespa/vespalib/net/sync_crypto_socket.h1
3 files changed, 38 insertions, 0 deletions
diff --git a/vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp b/vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp
index b299990fd4e..20f134b3ba2 100644
--- a/vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp
+++ b/vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp
@@ -42,6 +42,12 @@ vespalib::string read_bytes(SyncCryptoSocket &socket, size_t wanted_bytes) {
return vespalib::string(data.data, wanted_bytes);
}
+void read_EOF(SyncCryptoSocket &socket) {
+ char buf[16];
+ auto res = socket.read(buf, sizeof(buf));
+ ASSERT_EQUAL(res, 0);
+}
+
//-----------------------------------------------------------------------------
void write_bytes(SyncCryptoSocket &socket, const vespalib::string &message) {
@@ -49,6 +55,26 @@ void write_bytes(SyncCryptoSocket &socket, const vespalib::string &message) {
ASSERT_EQUAL(size_t(res), message.size());
}
+void write_EOF(SyncCryptoSocket &socket) {
+ ASSERT_EQUAL(socket.half_close(), 0);
+}
+
+//-----------------------------------------------------------------------------
+
+void verify_graceful_shutdown(SyncCryptoSocket &socket, bool is_server) {
+ if(is_server) {
+ TEST_DO(write_EOF(socket));
+ TEST_DO(read_EOF(socket));
+ TEST_DO(read_EOF(socket));
+ TEST_DO(read_EOF(socket));
+ } else {
+ TEST_DO(read_EOF(socket));
+ TEST_DO(read_EOF(socket));
+ TEST_DO(read_EOF(socket));
+ TEST_DO(write_EOF(socket));
+ }
+}
+
//-----------------------------------------------------------------------------
void verify_socket_io(SyncCryptoSocket &socket, bool is_server) {
@@ -73,6 +99,7 @@ void verify_crypto_socket(SocketPair &sockets, CryptoEngine &engine, bool is_ser
SyncCryptoSocket::UP my_socket = SyncCryptoSocket::create(engine, std::move(my_handle), is_server);
ASSERT_TRUE(my_socket);
TEST_DO(verify_socket_io(*my_socket, is_server));
+ TEST_DO(verify_graceful_shutdown(*my_socket, is_server));
}
//-----------------------------------------------------------------------------
diff --git a/vespalib/src/vespa/vespalib/net/sync_crypto_socket.cpp b/vespalib/src/vespa/vespalib/net/sync_crypto_socket.cpp
index 788d0e94bdd..e9b1579fbf6 100644
--- a/vespalib/src/vespa/vespalib/net/sync_crypto_socket.cpp
+++ b/vespalib/src/vespa/vespalib/net/sync_crypto_socket.cpp
@@ -79,6 +79,16 @@ SyncCryptoSocket::write(const char *buf, size_t len)
return written;
}
+ssize_t
+SyncCryptoSocket::half_close()
+{
+ auto half_close_res = _socket->half_close();
+ while (is_blocked(half_close_res, errno)) {
+ half_close_res = _socket->half_close();
+ }
+ return half_close_res;
+}
+
SyncCryptoSocket::UP
SyncCryptoSocket::create(CryptoEngine &engine, SocketHandle socket, bool is_server)
{
diff --git a/vespalib/src/vespa/vespalib/net/sync_crypto_socket.h b/vespalib/src/vespa/vespalib/net/sync_crypto_socket.h
index 94e80f1ad53..00d6cbca0db 100644
--- a/vespalib/src/vespa/vespalib/net/sync_crypto_socket.h
+++ b/vespalib/src/vespa/vespalib/net/sync_crypto_socket.h
@@ -28,6 +28,7 @@ public:
~SyncCryptoSocket();
ssize_t read(char *buf, size_t len);
ssize_t write(const char *buf, size_t len);
+ ssize_t half_close();
static UP create(CryptoEngine &engine, SocketHandle socket, bool is_server);
};