diff options
author | Håvard Pettersen <havardpe@oath.com> | 2018-10-19 10:38:44 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2018-10-19 10:38:44 +0000 |
commit | aab0f55030432494d970adab1116d6ed5223ab31 (patch) | |
tree | 2a5849808336f22b4c51cbe46850b15ab84963c5 | |
parent | a50c6e8b47c6d6e1e7f82dfced1b3cd8f9fc87cd (diff) |
half_close for sync crypto sockets
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); }; |