Skip to content

Commit 17a128a

Browse files
authored
Fix a bug of SSL (#44)
1 parent 5758673 commit 17a128a

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

trantor/net/ssl/SSLConnection.cc

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class SSLContext
4545
SSLContext()
4646
{
4747
_ctxPtr = SSL_CTX_new(SSLv23_method());
48+
// SSL_CTX_set_mode(_ctxPtr, SSL_MODE_ENABLE_PARTIAL_WRITE);
4849
}
4950
~SSLContext()
5051
{
@@ -260,20 +261,30 @@ ssize_t SSLConnection::writeInLoop(const char *buffer, size_t length)
260261
LOG_WARN << "SSL is not connected,give up sending";
261262
return -1;
262263
}
263-
264264
// send directly
265-
ERR_clear_error();
266-
auto sendLen = SSL_write(_sslPtr->get(), buffer, length);
267-
if (sendLen <= 0)
265+
size_t sendTotalLen = 0;
266+
while (sendTotalLen < length)
268267
{
269-
int sslerr = SSL_get_error(_sslPtr->get(), sendLen);
270-
if (sslerr != SSL_ERROR_WANT_WRITE && sslerr != SSL_ERROR_WANT_READ)
268+
auto len = length - sendTotalLen;
269+
if (len > sizeof(_sendBuffer))
270+
{
271+
len = sizeof(_sendBuffer);
272+
}
273+
memcpy(_sendBuffer, buffer + sendTotalLen, len);
274+
ERR_clear_error();
275+
auto sendLen = SSL_write(_sslPtr->get(), _sendBuffer, len);
276+
if (sendLen <= 0)
271277
{
272-
LOG_ERROR << "ssl write error:" << sslerr;
273-
forceClose();
274-
return -1;
278+
int sslerr = SSL_get_error(_sslPtr->get(), sendLen);
279+
if (sslerr != SSL_ERROR_WANT_WRITE && sslerr != SSL_ERROR_WANT_READ)
280+
{
281+
LOG_ERROR << "ssl write error:" << sslerr;
282+
forceClose();
283+
return -1;
284+
}
285+
return sendTotalLen;
275286
}
276-
return 0;
287+
sendTotalLen += sendLen;
277288
}
278-
return sendLen;
289+
return sendTotalLen;
279290
}

trantor/net/ssl/SSLConnection.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class SSLConnection : public TcpConnectionImpl
6363
virtual void writeCallback() override;
6464
virtual void connectEstablished() override;
6565
virtual ssize_t writeInLoop(const char *buffer, size_t length) override;
66+
char _sendBuffer[8192];
6667
};
6768

6869
typedef std::shared_ptr<SSLConnection> SSLConnectionPtr;

0 commit comments

Comments
 (0)