From 1d3f53ba60ac6274305c75718ed5b753a43178d0 Mon Sep 17 00:00:00 2001 From: Matt Broadstone Date: Mon, 9 Jun 2014 16:01:23 -0400 Subject: [PATCH] clear buffer on forced disconnect, fatal disconnect on bad frame end, store tuning parameters --- src/amqp_client.cpp | 35 +++++++++++++++++++---------------- src/amqp_client_p.h | 3 +++ src/amqp_exchange.cpp | 1 - 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/amqp_client.cpp b/src/amqp_client.cpp index f07ef7e..49efbb8 100644 --- a/src/amqp_client.cpp +++ b/src/amqp_client.cpp @@ -22,6 +22,9 @@ ClientPrivate::ClientPrivate(Client *q) socket(0), closed(false), connected(false), + channelMax(0), + heartbeatDelay(0), + frameMax(0), error(Client::NoError), q_ptr(q) { @@ -90,6 +93,7 @@ void ClientPrivate::_q_disconnect() return; } + buffer.clear(); close(200, "client disconnect"); } @@ -150,8 +154,11 @@ void ClientPrivate::_q_readyRead() const char *bufferData = buffer.constData(); const quint8 type = *(quint8*)&bufferData[0]; const quint8 magic = *(quint8*)&bufferData[Frame::HEADER_SIZE + payloadSize]; - if (magic != Frame::FRAME_END) - qWarning() << "Wrong end frame"; + if (magic != Frame::FRAME_END) { + qAmqpDebug() << Q_FUNC_INFO << "FATAL: wrong end of frame"; + _q_disconnect(); + return; + } QDataStream streamB(&buffer, QIODevice::ReadOnly); switch(Frame::Type(type)) { @@ -288,20 +295,16 @@ void ClientPrivate::tune(const Frame::Method &frame) QByteArray data = frame.arguments(); QDataStream stream(&data, QIODevice::ReadOnly); - qint16 channel_max = 0, - heartbeat = 0; - qint32 frame_max = 0; + stream >> channelMax; + stream >> frameMax; + stream >> heartbeatDelay; - stream >> channel_max; - stream >> frame_max; - stream >> heartbeat; - - qAmqpDebug(">> channel_max: %d", channel_max); - qAmqpDebug(">> frame_max: %d", frame_max); - qAmqpDebug(">> heartbeat: %d", heartbeat); + qAmqpDebug(">> channel_max: %d", channelMax); + qAmqpDebug(">> frame_max: %d", frameMax); + qAmqpDebug(">> heartbeat: %d", heartbeatDelay); if (heartbeatTimer) { - heartbeatTimer->setInterval(heartbeat * 1000); + heartbeatTimer->setInterval(heartbeatDelay * 1000); if (heartbeatTimer->interval()) heartbeatTimer->start(); else @@ -390,9 +393,9 @@ void ClientPrivate::tuneOk() QByteArray arguments; QDataStream stream(&arguments, QIODevice::WriteOnly); - stream << qint16(0); //channel_max - stream << qint32(FRAME_MAX); //frame_max - stream << qint16(heartbeatTimer->interval() / 1000); //heartbeat + stream << qint16(channelMax); + stream << qint32(frameMax); + stream << qint16(heartbeatTimer->interval() / 1000); frame.setArguments(arguments); sendFrame(frame); diff --git a/src/amqp_client_p.h b/src/amqp_client_p.h index a38279d..b62f68d 100644 --- a/src/amqp_client_p.h +++ b/src/amqp_client_p.h @@ -90,6 +90,9 @@ public: bool connected; QPointer heartbeatTimer; Frame::TableField customProperties; + qint16 channelMax; + qint16 heartbeatDelay; + qint32 frameMax; Client::ConnectionError error; QString errorString; diff --git a/src/amqp_exchange.cpp b/src/amqp_exchange.cpp index 3620708..d73bc64 100644 --- a/src/amqp_exchange.cpp +++ b/src/amqp_exchange.cpp @@ -235,4 +235,3 @@ void Exchange::publish(const QString &key, const QByteArray &message, d->sendFrame(body); } } -