diff --git a/Libraries/LibTLS/TLSv12.cpp b/Libraries/LibTLS/TLSv12.cpp index bbd0e9a17e9..1f1cad15361 100644 --- a/Libraries/LibTLS/TLSv12.cpp +++ b/Libraries/LibTLS/TLSv12.cpp @@ -5,6 +5,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include @@ -137,7 +138,22 @@ ErrorOr TLSv12::can_read_without_blocking(int timeout) const if (!m_ssl) return Error::from_string_literal("SSL connection is closed"); - return m_socket->can_read_without_blocking(timeout); + if (SSL_has_pending(m_ssl)) + return true; + + auto timer = Core::ElapsedTimer(); + while (timeout > 0) { + auto elapsed = timer.elapsed_milliseconds(); + if (elapsed >= timeout) + break; + + if (!TRY(m_socket->can_read_without_blocking(timeout - elapsed))) + return SSL_has_pending(m_ssl); + if (SSL_has_pending(m_ssl)) + return true; + } + + return false; } ErrorOr TLSv12::set_blocking(bool) diff --git a/Libraries/LibTLS/TLSv12.h b/Libraries/LibTLS/TLSv12.h index ade3e3df472..c49903f9968 100644 --- a/Libraries/LibTLS/TLSv12.h +++ b/Libraries/LibTLS/TLSv12.h @@ -55,7 +55,7 @@ public: virtual void close() override; virtual ErrorOr pending_bytes() const override; - virtual ErrorOr can_read_without_blocking(int = 0) const override; + virtual ErrorOr can_read_without_blocking(int timeout = 0) const override; virtual ErrorOr set_blocking(bool block) override; virtual ErrorOr set_close_on_exec(bool enabled) override;