clear buffer on forced disconnect, fatal disconnect on bad frame end, store tuning parameters

This commit is contained in:
Matt Broadstone 2014-06-09 16:01:23 -04:00
parent 182b493119
commit 1d3f53ba60
3 changed files with 22 additions and 17 deletions

View File

@ -22,6 +22,9 @@ ClientPrivate::ClientPrivate(Client *q)
socket(0), socket(0),
closed(false), closed(false),
connected(false), connected(false),
channelMax(0),
heartbeatDelay(0),
frameMax(0),
error(Client::NoError), error(Client::NoError),
q_ptr(q) q_ptr(q)
{ {
@ -90,6 +93,7 @@ void ClientPrivate::_q_disconnect()
return; return;
} }
buffer.clear();
close(200, "client disconnect"); close(200, "client disconnect");
} }
@ -150,8 +154,11 @@ void ClientPrivate::_q_readyRead()
const char *bufferData = buffer.constData(); const char *bufferData = buffer.constData();
const quint8 type = *(quint8*)&bufferData[0]; const quint8 type = *(quint8*)&bufferData[0];
const quint8 magic = *(quint8*)&bufferData[Frame::HEADER_SIZE + payloadSize]; const quint8 magic = *(quint8*)&bufferData[Frame::HEADER_SIZE + payloadSize];
if (magic != Frame::FRAME_END) if (magic != Frame::FRAME_END) {
qWarning() << "Wrong end frame"; qAmqpDebug() << Q_FUNC_INFO << "FATAL: wrong end of frame";
_q_disconnect();
return;
}
QDataStream streamB(&buffer, QIODevice::ReadOnly); QDataStream streamB(&buffer, QIODevice::ReadOnly);
switch(Frame::Type(type)) { switch(Frame::Type(type)) {
@ -288,20 +295,16 @@ void ClientPrivate::tune(const Frame::Method &frame)
QByteArray data = frame.arguments(); QByteArray data = frame.arguments();
QDataStream stream(&data, QIODevice::ReadOnly); QDataStream stream(&data, QIODevice::ReadOnly);
qint16 channel_max = 0, stream >> channelMax;
heartbeat = 0; stream >> frameMax;
qint32 frame_max = 0; stream >> heartbeatDelay;
stream >> channel_max; qAmqpDebug(">> channel_max: %d", channelMax);
stream >> frame_max; qAmqpDebug(">> frame_max: %d", frameMax);
stream >> heartbeat; qAmqpDebug(">> heartbeat: %d", heartbeatDelay);
qAmqpDebug(">> channel_max: %d", channel_max);
qAmqpDebug(">> frame_max: %d", frame_max);
qAmqpDebug(">> heartbeat: %d", heartbeat);
if (heartbeatTimer) { if (heartbeatTimer) {
heartbeatTimer->setInterval(heartbeat * 1000); heartbeatTimer->setInterval(heartbeatDelay * 1000);
if (heartbeatTimer->interval()) if (heartbeatTimer->interval())
heartbeatTimer->start(); heartbeatTimer->start();
else else
@ -390,9 +393,9 @@ void ClientPrivate::tuneOk()
QByteArray arguments; QByteArray arguments;
QDataStream stream(&arguments, QIODevice::WriteOnly); QDataStream stream(&arguments, QIODevice::WriteOnly);
stream << qint16(0); //channel_max stream << qint16(channelMax);
stream << qint32(FRAME_MAX); //frame_max stream << qint32(frameMax);
stream << qint16(heartbeatTimer->interval() / 1000); //heartbeat stream << qint16(heartbeatTimer->interval() / 1000);
frame.setArguments(arguments); frame.setArguments(arguments);
sendFrame(frame); sendFrame(frame);

View File

@ -90,6 +90,9 @@ public:
bool connected; bool connected;
QPointer<QTimer> heartbeatTimer; QPointer<QTimer> heartbeatTimer;
Frame::TableField customProperties; Frame::TableField customProperties;
qint16 channelMax;
qint16 heartbeatDelay;
qint32 frameMax;
Client::ConnectionError error; Client::ConnectionError error;
QString errorString; QString errorString;

View File

@ -235,4 +235,3 @@ void Exchange::publish(const QString &key, const QByteArray &message,
d->sendFrame(body); d->sendFrame(body);
} }
} }