From b8dec12f157c837b8446d8e13431965dc5f8da55 Mon Sep 17 00:00:00 2001 From: Baruch Nissenbaum Date: Mon, 14 Jun 2021 15:41:20 +0300 Subject: [PATCH] Limit SSL_ERROR_WANT_READ retries to 1 sec (#957) retry with 1ms delays to prevent CPU hoggin --- httplib.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/httplib.h b/httplib.h index 0d18967..a369c20 100644 --- a/httplib.h +++ b/httplib.h @@ -6687,15 +6687,17 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) { auto ret = SSL_read(ssl_, ptr, static_cast(size)); if (ret < 0) { auto err = SSL_get_error(ssl_, ret); + int n = 1000; #ifdef _WIN32 - while (err == SSL_ERROR_WANT_READ || - err == SSL_ERROR_SYSCALL && WSAGetLastError() == WSAETIMEDOUT) { + while (--n >= 0 && (err == SSL_ERROR_WANT_READ || + err == SSL_ERROR_SYSCALL && WSAGetLastError() == WSAETIMEDOUT)) { #else - while (err == SSL_ERROR_WANT_READ) { + while (--n >= 0 && err == SSL_ERROR_WANT_READ) { #endif if (SSL_pending(ssl_) > 0) { return SSL_read(ssl_, ptr, static_cast(size)); } else if (is_readable()) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); ret = SSL_read(ssl_, ptr, static_cast(size)); if (ret >= 0) { return ret; } err = SSL_get_error(ssl_, ret);