diff options
author | Kurt Pattyn <pattyn.kurt@gmail.com> | 2013-10-10 21:10:28 +0200 |
---|---|---|
committer | Kurt Pattyn <pattyn.kurt@gmail.com> | 2013-10-11 10:36:13 +0200 |
commit | 2c3ef85966e2771ffce15cc8b62ec8be856da986 (patch) | |
tree | 58cd533df90879917c2b8da1393fb962b471b838 /src/websockets/qwebsocketdataprocessor_p.cpp | |
parent | df7d55861412c9ea322d96022e6e4c5716ad9c5d (diff) | |
download | qtwebsockets-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.cpp | 119 |
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; } |