From f6207784ab41e120f7b705984ecd70c656fbf752 Mon Sep 17 00:00:00 2001 From: neru Date: Wed, 13 May 2026 12:05:22 -0300 Subject: [PATCH] fix: handle plain HTTP on sslWriteAll --- src/proxy/tinymitm/proxy.cpp | 49 +++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/src/proxy/tinymitm/proxy.cpp b/src/proxy/tinymitm/proxy.cpp index 5156b16..4fa6fff 100644 --- a/src/proxy/tinymitm/proxy.cpp +++ b/src/proxy/tinymitm/proxy.cpp @@ -108,25 +108,44 @@ bool sslWriteAll(WOLFSSL* ssl, const void* data, int len, SOCKET s) int sent = 0; while (sent < len) { - int ret = wolfSSL_write(ssl, (const char*)data + sent, len - sent); - if (ret > 0) + int ret; + if (ssl) { - sent += ret; - continue; + ret = wolfSSL_write(ssl, (const char*)data + sent, len - sent); + if (ret <= 0) + { + int err = wolfSSL_get_error(ssl, ret); + if (err == WOLFSSL_ERROR_WANT_READ || err == WOLFSSL_ERROR_WANT_WRITE) + { + fd_set fds; + FD_ZERO(&fds); + FD_SET(s, &fds); + struct timeval tv{0, 10000}; + select(0, (err == WOLFSSL_ERROR_WANT_READ) ? &fds : nullptr, + (err == WOLFSSL_ERROR_WANT_WRITE) ? &fds : nullptr, nullptr, &tv); + continue; + } + return false; + } } - - int err = wolfSSL_get_error(ssl, ret); - if (err == WOLFSSL_ERROR_WANT_READ || err == WOLFSSL_ERROR_WANT_WRITE) + else { - fd_set fds; - FD_ZERO(&fds); - FD_SET(s, &fds); - struct timeval tv{0, 10000}; // 10ms wait - select(0, (err == WOLFSSL_ERROR_WANT_READ) ? &fds : nullptr, - (err == WOLFSSL_ERROR_WANT_WRITE) ? &fds : nullptr, nullptr, &tv); - continue; + ret = ::send(s, (const char*)data + sent, len - sent, 0); + if (ret <= 0) + { +#ifdef _WIN32 + if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK) +#else + if (ret < 0 && (errno == EWOULDBLOCK || errno == EAGAIN)) +#endif + { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + continue; + } + return false; + } } - return false; + sent += ret; } return true; }