in nlsCppSdk/transport/SSLconnect.cpp [186:273]
int SSLconnect::sslWrite(const uint8_t *buffer, size_t len) {
MUTEX_LOCK(_mtxSSL);
if (_ssl == NULL) {
LOG_ERROR("SSL(%p) ssl has been closed.", this);
MUTEX_UNLOCK(_mtxSSL);
return -(SslWriteFailed);
}
int wLen = SSL_write(_ssl, (void *)buffer, (int)len);
if (wLen < 0) {
int sslError = SSL_get_error(_ssl, wLen);
int errno_code = utility::getLastErrorCode();
char sslErrMsg[MaxSslErrorLength] = {0};
const char *SSL_write_ret = "return of SSL_write: ";
const int SSL_write_str_size = strnlen(SSL_write_ret, 64);
if (sslError == SSL_ERROR_WANT_READ || sslError == SSL_ERROR_WANT_WRITE) {
LOG_DEBUG("SSL(%p) Write could not complete. Will be invoked later.",
this);
MUTEX_UNLOCK(_mtxSSL);
return 0;
} else if (sslError == SSL_ERROR_SYSCALL) {
LOG_INFO("SSL(%p) SSL_write error_syscall failed, errno:%d.", this,
errno_code);
if (NLS_ERR_CONNECT_RETRIABLE(errno_code) ||
NLS_ERR_RW_RETRIABLE(errno_code)) {
MUTEX_UNLOCK(_mtxSSL);
return 0;
} else if (errno_code == 0) {
LOG_DEBUG("SSL(%p) SSL_write syscall success.", this);
MUTEX_UNLOCK(_mtxSSL);
return 0;
#ifdef _MSC_VER
} else if (errno_code == WSAECONNRESET) {
#else
} else if (errno_code == ECONNRESET) {
#endif
memset(_errorMsg, 0x0, MaxSslErrorLength);
memcpy(sslErrMsg, SSL_write_ret, SSL_write_str_size);
ERR_error_string_n(ERR_get_error(), sslErrMsg + SSL_write_str_size,
MaxSslErrorLength - SSL_write_str_size - 1);
snprintf(_errorMsg, MaxSslErrorLength,
"%s. It's mean the remote end was "
"closed because of bad network. errno_code:%d, ssl_eCode:%d.",
sslErrMsg, errno_code, sslError);
LOG_ERROR("SSL(%p) SSL_ERROR_SYSCALL Write failed, %s.", this,
_errorMsg);
MUTEX_UNLOCK(_mtxSSL);
return -(SslWriteFailed);
} else {
memset(_errorMsg, 0x0, MaxSslErrorLength);
memcpy(sslErrMsg, SSL_write_ret, SSL_write_str_size);
ERR_error_string_n(ERR_get_error(), sslErrMsg + SSL_write_str_size,
MaxSslErrorLength - SSL_write_str_size - 1);
snprintf(_errorMsg, MaxSslErrorLength,
"%s. errno_code:%d ssl_eCode:%d.", sslErrMsg, errno_code,
sslError);
LOG_ERROR("SSL(%p) SSL_ERROR_SYSCALL Write failed: %s.", this,
_errorMsg);
MUTEX_UNLOCK(_mtxSSL);
return -(SslWriteFailed);
}
} else {
memset(_errorMsg, 0x0, MaxSslErrorLength);
memcpy(sslErrMsg, SSL_write_ret, SSL_write_str_size);
ERR_error_string_n(ERR_get_error(), sslErrMsg + SSL_write_str_size,
MaxSslErrorLength - SSL_write_str_size - 1);
if (sslError == SSL_ERROR_ZERO_RETURN && errno_code == 0) {
snprintf(
_errorMsg, MaxSslErrorLength,
"%s. errno_code:%d ssl_eCode:%d. It's mean this connection was "
"closed or shutdown because of bad network.",
sslErrMsg, errno_code, sslError);
} else {
snprintf(_errorMsg, MaxSslErrorLength,
"%s. errno_code:%d ssl_eCode:%d.", sslErrMsg, errno_code,
sslError);
}
LOG_ERROR("SSL(%p) SSL_write failed: %s.", this, _errorMsg);
MUTEX_UNLOCK(_mtxSSL);
return -(SslWriteFailed);
}
}
MUTEX_UNLOCK(_mtxSSL);
return wLen;
}