ResponseCode OpenSSLConnection::ReadInternal()

in network/OpenSSL/OpenSSLConnection.cpp [548:599]


        ResponseCode OpenSSLConnection::ReadInternal(util::Vector<unsigned char> &buf, size_t buf_read_offset,
                                                     size_t size_bytes_to_read, size_t &size_read_bytes_out) {
            int ssl_retcode;
            int select_retCode;
            size_t total_read_length = buf_read_offset;
            size_t remaining_bytes_to_read = size_bytes_to_read;
            int cur_read_len = 0;
            ResponseCode errorStatus = ResponseCode::SUCCESS;

            do {
                ERR_clear_error();
                if (nullptr == p_ssl_handle_) {
                    return ResponseCode::NETWORK_SSL_READ_ERROR;
                }
                cur_read_len = SSL_read(p_ssl_handle_, &buf[total_read_length], (int) remaining_bytes_to_read);
                if (0 < cur_read_len) {
                    total_read_length += (size_t) cur_read_len;
                    remaining_bytes_to_read -= cur_read_len;
                } else {
                    ssl_retcode = SSL_get_error(p_ssl_handle_, cur_read_len);
                    switch (ssl_retcode) {
                        case SSL_ERROR_WANT_READ:
                            select_retCode = WaitForSelect(SSL_ERROR_WANT_READ);
                            if (0 < select_retCode) {
                                continue;
                            } else if (0 == select_retCode) { //0 == SELECT_TIMEOUT
                                errorStatus = ResponseCode::NETWORK_SSL_NOTHING_TO_READ;
                            } else { // SELECT_ERROR
                                errorStatus = ResponseCode::NETWORK_SSL_READ_ERROR;
                            }
                            break;
                        case SSL_ERROR_ZERO_RETURN:
                            errorStatus = ResponseCode::NETWORK_SSL_CONNECTION_CLOSED_ERROR;
                            break;
                        default:
                            errorStatus = ResponseCode::NETWORK_SSL_READ_ERROR;
                            break;
                    }
                }
                if (ResponseCode::NETWORK_SSL_NOTHING_TO_READ == errorStatus ||
                    ResponseCode::NETWORK_SSL_READ_ERROR == errorStatus ||
                    ResponseCode::NETWORK_SSL_CONNECTION_CLOSED_ERROR == errorStatus) {
                    break;
                }
            } while (is_connected_ && total_read_length < size_bytes_to_read);

            if (ResponseCode::SUCCESS == errorStatus) {
                size_read_bytes_out = total_read_length;
            }

            return errorStatus;
        }