refactor: make SecureSocket write-retry state per connection
doWrite()'s retry/buffer state was held in function-local static variables, shared across every SecureSocket instance in the process rather than per connection. Move it to instance members, and simplify secureRead()/secureWrite()'s retry counters (also static, but not load-bearing across calls) to plain locals.
This commit is contained in:
parent
59d41b906e
commit
35d877e128
2 changed files with 18 additions and 16 deletions
|
|
@ -66,6 +66,7 @@ SecureSocket::SecureSocket(
|
|||
SecureSocket::~SecureSocket()
|
||||
{
|
||||
freeSSL();
|
||||
free(m_writeStaticBuffer);
|
||||
}
|
||||
|
||||
void SecureSocket::close()
|
||||
|
|
@ -174,26 +175,22 @@ TCPSocket::JobResult SecureSocket::doRead()
|
|||
TCPSocket::JobResult SecureSocket::doWrite()
|
||||
{
|
||||
using enum JobResult;
|
||||
static bool s_retry = false;
|
||||
static int s_retrySize = 0;
|
||||
static int s_staticBufferSize = 0;
|
||||
static void *s_staticBuffer = nullptr;
|
||||
|
||||
// write data
|
||||
int bufferSize = 0;
|
||||
int bytesWrote = 0;
|
||||
int status = 0;
|
||||
|
||||
if (s_retry) {
|
||||
bufferSize = s_retrySize;
|
||||
if (m_writeRetry) {
|
||||
bufferSize = m_writeRetrySize;
|
||||
} else {
|
||||
bufferSize = m_outputBuffer.getSize();
|
||||
if (bufferSize != 0) {
|
||||
if (bufferSize > s_staticBufferSize) {
|
||||
s_staticBuffer = realloc(s_staticBuffer, bufferSize);
|
||||
s_staticBufferSize = bufferSize;
|
||||
if (bufferSize > m_writeStaticBufferSize) {
|
||||
m_writeStaticBuffer = realloc(m_writeStaticBuffer, bufferSize);
|
||||
m_writeStaticBufferSize = bufferSize;
|
||||
}
|
||||
memcpy(s_staticBuffer, m_outputBuffer.peek(bufferSize), bufferSize);
|
||||
memcpy(m_writeStaticBuffer, m_outputBuffer.peek(bufferSize), bufferSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -202,14 +199,14 @@ TCPSocket::JobResult SecureSocket::doWrite()
|
|||
}
|
||||
|
||||
if (isSecureReady()) {
|
||||
status = secureWrite(s_staticBuffer, bufferSize, bytesWrote);
|
||||
status = secureWrite(m_writeStaticBuffer, bufferSize, bytesWrote);
|
||||
if (status > 0) {
|
||||
s_retry = false;
|
||||
m_writeRetry = false;
|
||||
} else if (status < 0) {
|
||||
return Break;
|
||||
} else if (status == 0) {
|
||||
s_retry = true;
|
||||
s_retrySize = bufferSize;
|
||||
m_writeRetry = true;
|
||||
m_writeRetrySize = bufferSize;
|
||||
return New;
|
||||
}
|
||||
} else {
|
||||
|
|
@ -232,7 +229,7 @@ int SecureSocket::secureRead(void *buffer, int size, int &read)
|
|||
LOG_VERBOSE("reading secure socket");
|
||||
read = SSL_read(m_ssl->m_ssl, buffer, size);
|
||||
|
||||
static int retry;
|
||||
int retry = 0;
|
||||
|
||||
// Check result will cleanup the connection in the case of a fatal
|
||||
checkResult(read, retry);
|
||||
|
|
@ -260,7 +257,7 @@ int SecureSocket::secureWrite(const void *buffer, int size, int &wrote)
|
|||
|
||||
wrote = SSL_write(m_ssl->m_ssl, buffer, size);
|
||||
|
||||
static int retry;
|
||||
int retry = 0;
|
||||
|
||||
// Check result will cleanup the connection in the case of a fatal
|
||||
checkResult(wrote, retry);
|
||||
|
|
|
|||
|
|
@ -96,4 +96,9 @@ private:
|
|||
bool m_secureReady = false;
|
||||
bool m_fatal = false;
|
||||
SecurityLevel m_securityLevel = SecurityLevel::Encrypted;
|
||||
|
||||
bool m_writeRetry = false;
|
||||
int m_writeRetrySize = 0;
|
||||
int m_writeStaticBufferSize = 0;
|
||||
void *m_writeStaticBuffer = nullptr;
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue