Loop on recv and send operations for non-blocking sockets with OpenSSL.
This commit is contained in:
parent
73eded2f97
commit
2b62c675fa
@ -319,6 +319,8 @@ void TLSSocket_OpenSSL::handleError(int rc)
|
|||||||
{
|
{
|
||||||
if (rc > 0) return;
|
if (rc > 0) return;
|
||||||
|
|
||||||
|
internalThrow();
|
||||||
|
|
||||||
int sslError = SSL_get_error(m_ssl, rc);
|
int sslError = SSL_get_error(m_ssl, rc);
|
||||||
long lastError = ERR_get_error();
|
long lastError = ERR_get_error();
|
||||||
|
|
||||||
@ -401,20 +403,16 @@ int TLSSocket_OpenSSL::bio_write(BIO* bio, const char* buf, int len)
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
BIO_clear_retry_flags(bio);
|
while (true)
|
||||||
|
|
||||||
const size_t n = sok->m_wrapped->sendRawNonBlocking
|
|
||||||
(reinterpret_cast <const byte_t*>(buf), len);
|
|
||||||
|
|
||||||
BIO_clear_retry_flags(bio);
|
|
||||||
|
|
||||||
if (n == 0 && sok->m_wrapped->getStatus() & socket::STATUS_WOULDBLOCK)
|
|
||||||
{
|
{
|
||||||
BIO_set_retry_write(bio);
|
const size_t n = sok->m_wrapped->sendRawNonBlocking
|
||||||
return -1;
|
(reinterpret_cast <const byte_t*>(buf), len);
|
||||||
}
|
|
||||||
|
|
||||||
return static_cast <int>(len);
|
if (n == 0 && sok->m_wrapped->getStatus() & socket::STATUS_WOULDBLOCK)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return static_cast <int>(len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (exception& e)
|
catch (exception& e)
|
||||||
{
|
{
|
||||||
@ -435,18 +433,16 @@ int TLSSocket_OpenSSL::bio_read(BIO* bio, char* buf, int len)
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
const size_t n = sok->m_wrapped->receiveRaw
|
while (true)
|
||||||
(reinterpret_cast <byte_t*>(buf), len);
|
|
||||||
|
|
||||||
BIO_clear_retry_flags(bio);
|
|
||||||
|
|
||||||
if (sok->m_wrapped->getStatus() & socket::STATUS_WOULDBLOCK)
|
|
||||||
{
|
{
|
||||||
BIO_set_retry_read(bio);
|
const size_t n = sok->m_wrapped->receiveRaw
|
||||||
return -1;
|
(reinterpret_cast <byte_t*>(buf), len);
|
||||||
}
|
|
||||||
|
|
||||||
return static_cast <int>(n);
|
if (n == 0 && sok->m_wrapped->getStatus() & socket::STATUS_WOULDBLOCK)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return static_cast <int>(n);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (exception& e)
|
catch (exception& e)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user