int SSLconnect::sslWrite()

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;
}