summaryrefslogtreecommitdiff
path: root/src/websockets/qwebsocketdataprocessor_p.cpp
diff options
context:
space:
mode:
authorKurt Pattyn <pattyn.kurt@gmail.com>2013-10-10 21:10:28 +0200
committerKurt Pattyn <pattyn.kurt@gmail.com>2013-10-11 10:36:13 +0200
commit2c3ef85966e2771ffce15cc8b62ec8be856da986 (patch)
tree58cd533df90879917c2b8da1393fb962b471b838 /src/websockets/qwebsocketdataprocessor_p.cpp
parentdf7d55861412c9ea322d96022e6e4c5716ad9c5d (diff)
downloadqtwebsockets-2c3ef85966e2771ffce15cc8b62ec8be856da986.tar.gz
Immediately stop processing after reception of a control frame
Change-Id: Ifdd9db4bb251d9a58a0739ce269591b2d9438bf4 Reviewed-by: Steven Ceuppens <steven.ceuppens@icloud.com>
Diffstat (limited to 'src/websockets/qwebsocketdataprocessor_p.cpp')
-rw-r--r--src/websockets/qwebsocketdataprocessor_p.cpp119
1 files changed, 59 insertions, 60 deletions
diff --git a/src/websockets/qwebsocketdataprocessor_p.cpp b/src/websockets/qwebsocketdataprocessor_p.cpp
index 746a5d5..f22a667 100644
--- a/src/websockets/qwebsocketdataprocessor_p.cpp
+++ b/src/websockets/qwebsocketdataprocessor_p.cpp
@@ -213,81 +213,80 @@ void QWebSocketDataProcessor::clear()
*/
bool QWebSocketDataProcessor::processControlFrame(const QWebSocketFrame &frame)
{
- bool mustStopProcessing = false;
+ bool mustStopProcessing = true; //control frames never expect additional frames to be processed
switch (frame.getOpCode())
{
- case QWebSocketProtocol::OC_PING:
- {
- Q_EMIT pingReceived(frame.getPayload());
- break;
- }
- case QWebSocketProtocol::OC_PONG:
- {
- Q_EMIT pongReceived(frame.getPayload());
- break;
- }
- case QWebSocketProtocol::OC_CLOSE:
- {
- quint16 closeCode = QWebSocketProtocol::CC_NORMAL;
- QString closeReason;
- QByteArray payload = frame.getPayload();
- if (payload.size() == 1) //size is either 0 (no close code and no reason) or >= 2 (at least a close code of 2 bytes)
+ case QWebSocketProtocol::OC_PING:
{
- closeCode = QWebSocketProtocol::CC_PROTOCOL_ERROR;
- closeReason = tr("Payload of close frame is too small.");
+ Q_EMIT pingReceived(frame.getPayload());
+ break;
}
- else if (payload.size() > 1) //close frame can have a close code and reason
+ case QWebSocketProtocol::OC_PONG:
{
- closeCode = qFromBigEndian<quint16>(reinterpret_cast<const uchar *>(payload.constData()));
- if (!QWebSocketProtocol::isCloseCodeValid(closeCode))
+ Q_EMIT pongReceived(frame.getPayload());
+ break;
+ }
+ case QWebSocketProtocol::OC_CLOSE:
+ {
+ quint16 closeCode = QWebSocketProtocol::CC_NORMAL;
+ QString closeReason;
+ QByteArray payload = frame.getPayload();
+ if (payload.size() == 1) //size is either 0 (no close code and no reason) or >= 2 (at least a close code of 2 bytes)
{
closeCode = QWebSocketProtocol::CC_PROTOCOL_ERROR;
- closeReason = tr("Invalid close code %1 detected.").arg(closeCode);
+ closeReason = tr("Payload of close frame is too small.");
}
- else
+ else if (payload.size() > 1) //close frame can have a close code and reason
{
- if (payload.size() > 2)
+ closeCode = qFromBigEndian<quint16>(reinterpret_cast<const uchar *>(payload.constData()));
+ if (!QWebSocketProtocol::isCloseCodeValid(closeCode))
{
- QTextCodec *tc = QTextCodec::codecForName("UTF-8");
- QTextCodec::ConverterState state(QTextCodec::ConvertInvalidToNull);
- closeReason = tc->toUnicode(payload.constData() + 2, payload.size() - 2, &state);
- bool failed = (state.invalidChars != 0) || (state.remainingChars != 0);
- if (failed)
+ closeCode = QWebSocketProtocol::CC_PROTOCOL_ERROR;
+ closeReason = tr("Invalid close code %1 detected.").arg(closeCode);
+ }
+ else
+ {
+ if (payload.size() > 2)
{
- closeCode = QWebSocketProtocol::CC_WRONG_DATATYPE;
- closeReason = tr("Invalid UTF-8 code encountered.");
+ QTextCodec *tc = QTextCodec::codecForName("UTF-8");
+ QTextCodec::ConverterState state(QTextCodec::ConvertInvalidToNull);
+ closeReason = tc->toUnicode(payload.constData() + 2, payload.size() - 2, &state);
+ bool failed = (state.invalidChars != 0) || (state.remainingChars != 0);
+ if (failed)
+ {
+ closeCode = QWebSocketProtocol::CC_WRONG_DATATYPE;
+ closeReason = tr("Invalid UTF-8 code encountered.");
+ }
}
}
}
+ Q_EMIT closeReceived(static_cast<QWebSocketProtocol::CloseCode>(closeCode), closeReason);
+ break;
+ }
+ case QWebSocketProtocol::OC_CONTINUE:
+ case QWebSocketProtocol::OC_BINARY:
+ case QWebSocketProtocol::OC_TEXT:
+ case QWebSocketProtocol::OC_RESERVED_3:
+ case QWebSocketProtocol::OC_RESERVED_4:
+ case QWebSocketProtocol::OC_RESERVED_5:
+ case QWebSocketProtocol::OC_RESERVED_6:
+ case QWebSocketProtocol::OC_RESERVED_7:
+ case QWebSocketProtocol::OC_RESERVED_C:
+ case QWebSocketProtocol::OC_RESERVED_B:
+ case QWebSocketProtocol::OC_RESERVED_D:
+ case QWebSocketProtocol::OC_RESERVED_E:
+ case QWebSocketProtocol::OC_RESERVED_F:
+ {
+ //do nothing
+ //case added to make C++ compiler happy
+ break;
+ }
+ default:
+ {
+ qDebug() << "DataProcessor::processControlFrame: Invalid opcode detected:" << static_cast<int>(frame.getOpCode());
+ //Do nothing
+ break;
}
- mustStopProcessing = true;
- Q_EMIT closeReceived(static_cast<QWebSocketProtocol::CloseCode>(closeCode), closeReason);
- break;
- }
- case QWebSocketProtocol::OC_CONTINUE:
- case QWebSocketProtocol::OC_BINARY:
- case QWebSocketProtocol::OC_TEXT:
- case QWebSocketProtocol::OC_RESERVED_3:
- case QWebSocketProtocol::OC_RESERVED_4:
- case QWebSocketProtocol::OC_RESERVED_5:
- case QWebSocketProtocol::OC_RESERVED_6:
- case QWebSocketProtocol::OC_RESERVED_7:
- case QWebSocketProtocol::OC_RESERVED_C:
- case QWebSocketProtocol::OC_RESERVED_B:
- case QWebSocketProtocol::OC_RESERVED_D:
- case QWebSocketProtocol::OC_RESERVED_E:
- case QWebSocketProtocol::OC_RESERVED_F:
- {
- //do nothing
- //case added to make C++ compiler happy
- break;
- }
- default:
- {
- qDebug() << "DataProcessor::processControlFrame: Invalid opcode detected:" << static_cast<int>(frame.getOpCode());
- //Do nothing
- break;
- }
}
return mustStopProcessing;
}