bool SocketManager::processRecordData()
    {
        RecordHeader header(m_recordHeader);

        if(m_socket->bytesAvailable() < header.payloadLength())
        {
            return false;
        }

        int expected = header.payloadLength();
        QByteArray data;
        while( data.size() <  expected ) {
            data.append( m_socket->read( expected - data.length() ) );
            if (m_socket->bytesAvailable() == 0 )
                m_socket->waitForReadyRead(5000);
        }

        qint64 bytesRead = data.length();

        if(bytesRead != header.payloadLength())
        {
            qFatal("Couldn't read payload - tried to read %d bytes, got %lld", header.payloadLength(), bytesRead);
        }

        switch(header.type())
        {
            case RecordHeader::BeginRequestRecord:
                beginRequest(data);
                break;
            case RecordHeader::ParametersRecord:
                if(!loadParameters(data))
                {
                    respond();
                }
                break;
            case RecordHeader::StandardInputRecord:
                readStandardInput(data);
                break;
            default:
                qFatal("Don't know how to deal with payload for type %s", ENUM_DEBUG_STRING(RecordHeader,RecordType,header.type()));
        }
        m_recordHeader = RecordHeader();
        return true;
    }
Beispiel #2
0
void QueryThread::run() {
    emit message(tr("Query Thread Running..."));
    connect(&conn_, SIGNAL(message(const QString&)), this, SLOT(onConnectionMessage(const QString&)));
    connect(&conn_, SIGNAL(error(const DatabaseError&)), this, SIGNAL(error(const DatabaseError&)));
    connect(&conn_, SIGNAL(connected(const QString&)), this, SLOT(onConnected(const QString&)));
    connect(&conn_, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
    connect(&conn_, SIGNAL(queryCompleted(const DeclareSelectCursorQuery&)), this, SIGNAL(queryCompleted(const DeclareSelectCursorQuery&)));
    connect(&conn_, SIGNAL(queryCompleted(const FetchAllInCursorQuery&)), this, SIGNAL(queryCompleted(const FetchAllInCursorQuery&)));
    connect(&conn_, SIGNAL(queryCompleted(const CloseCursorQuery&)), this, SIGNAL(queryCompleted(const CloseCursorQuery&)));
    
    connect(this, SIGNAL(beginRequest()), &conn_, SLOT(onBeginRequest()));
    connect(this, SIGNAL(commitRequest()), &conn_, SLOT(onCommitRequest()));
    connect(this, SIGNAL(rollbackRequest()), &conn_, SLOT(onRollbackRequest()));
    connect(this, SIGNAL(savepointRequest(const QString&)), &conn_, SLOT(onSavepointRequest(const QString&)));
    connect(this, SIGNAL(rollbackToSavepointRequest(const QString&)), &conn_, SLOT(onRollbackToSavepointRequest(const QString&)));
    connect(this, SIGNAL(queryRequest(const DeclareSelectCursorQuery&)), &conn_, SLOT(onQueryRequest(const DeclareSelectCursorQuery&)));
    connect(this, SIGNAL(queryRequest(const FetchAllInCursorQuery&)), &conn_, SLOT(onQueryRequest(const FetchAllInCursorQuery&)));
    connect(this, SIGNAL(queryRequest(const CloseCursorQuery&)), &conn_, SLOT(onQueryRequest(const CloseCursorQuery&)));
    exec();
}
int WebSocketClient::begin(const char* aPath)
{
    // start the GET request
    beginRequest();
    connectionKeepAlive();
    int status = get(aPath);

    if (status == 0)
    {
        uint8_t randomKey[16];
        char base64RandomKey[25];

        // create a random key for the connection upgrade
        for (int i = 0; i < (int)sizeof(randomKey); i++)
        {
            randomKey[i] = random(0x01, 0xff);
        }
        memset(base64RandomKey, 0x00, sizeof(base64RandomKey));
        b64_encode(randomKey, sizeof(randomKey), (unsigned char*)base64RandomKey, sizeof(base64RandomKey));

        // start the connection upgrade sequence
        sendHeader("Upgrade", "websocket");
        sendHeader("Connection", "Upgrade");
        sendHeader("Sec-WebSocket-Key", base64RandomKey);
        sendHeader("Sec-WebSocket-Version", "13");
        endRequest();

        status = responseStatusCode();

        if (status > 0)
        {
            skipResponseHeaders();
        }
    }

    iRxSize = 0;

    // status code of 101 means success
    return (status == 101) ? 0 : status;
}
Beispiel #4
0
int FcgiRequest::begin()
{
    return beginRequest( FCGI_RESPONDER,
            FCGI_KEEP_CONN );
}
Beispiel #5
0
void QueryThread::onBeginRequest() {
    emit beginRequest();
}