@@ -45,6 +45,7 @@ class SSLContext
45
45
SSLContext ()
46
46
{
47
47
_ctxPtr = SSL_CTX_new (SSLv23_method ());
48
+ // SSL_CTX_set_mode(_ctxPtr, SSL_MODE_ENABLE_PARTIAL_WRITE);
48
49
}
49
50
~SSLContext ()
50
51
{
@@ -260,20 +261,30 @@ ssize_t SSLConnection::writeInLoop(const char *buffer, size_t length)
260
261
LOG_WARN << " SSL is not connected,give up sending" ;
261
262
return -1 ;
262
263
}
263
-
264
264
// 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)
268
267
{
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 )
271
277
{
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;
275
286
}
276
- return 0 ;
287
+ sendTotalLen += sendLen ;
277
288
}
278
- return sendLen ;
289
+ return sendTotalLen ;
279
290
}
0 commit comments