From 470a1cb4e43d410cb0d05286b286f491c85ffd29 Mon Sep 17 00:00:00 2001 From: Ryan Chu Date: Tue, 27 Aug 2019 13:29:31 +0200 Subject: QWebsocket doesn't receive message with size larger than 1M MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the processing of QWebSocketFrame is not done and waiting for more data, QWebSocketPrivate::processData should return the control and wait for next readyRead signal. Continue the change of b2fc794ffaf48c9d9c401b54cf39ea0220617a27 Change-Id: Idf5af0710267e59e63b8e234d6dab5843d821696 Reviewed-by: Jesus Fernandez Reviewed-by: MÃ¥rten Nordheim --- src/websockets/qwebsocket_p.cpp | 4 ++-- src/websockets/qwebsocketdataprocessor.cpp | 16 ++++++++++------ src/websockets/qwebsocketdataprocessor_p.h | 2 +- tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp | 4 ++-- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index 0334b8a..9dd83dd 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -1180,8 +1180,8 @@ void QWebSocketPrivate::processData() if (!m_pSocket->canReadLine()) return; processHandshake(m_pSocket); - } else { - m_dataProcessor.process(m_pSocket); + } else if (!m_dataProcessor.process(m_pSocket)) { + return; } } } diff --git a/src/websockets/qwebsocketdataprocessor.cpp b/src/websockets/qwebsocketdataprocessor.cpp index 39287d4..191b992 100644 --- a/src/websockets/qwebsocketdataprocessor.cpp +++ b/src/websockets/qwebsocketdataprocessor.cpp @@ -123,8 +123,11 @@ quint64 QWebSocketDataProcessor::maxFrameSize() /*! \internal + + Returns \c true if a complete websocket frame has been processed; + otherwise returns \c false. */ -void QWebSocketDataProcessor::process(QIODevice *pIoDevice) +bool QWebSocketDataProcessor::process(QIODevice *pIoDevice) { bool isDone = false; @@ -135,7 +138,7 @@ void QWebSocketDataProcessor::process(QIODevice *pIoDevice) QObject::connect(pIoDevice, &QIODevice::readyRead, &waitTimer, &QTimer::stop, Qt::UniqueConnection); waitTimer.start(); - return; + return false; } else if (Q_LIKELY(frame.isValid())) { if (frame.isControlFrame()) { isDone = processControlFrame(frame); @@ -146,7 +149,7 @@ void QWebSocketDataProcessor::process(QIODevice *pIoDevice) Q_EMIT errorEncountered(QWebSocketProtocol::CloseCodeProtocolError, tr("Received Continuation frame, while there is " \ "nothing to continue.")); - return; + return true; } if (Q_UNLIKELY(m_isFragmented && frame.isDataFrame() && !frame.isContinuationFrame())) { @@ -154,7 +157,7 @@ void QWebSocketDataProcessor::process(QIODevice *pIoDevice) Q_EMIT errorEncountered(QWebSocketProtocol::CloseCodeProtocolError, tr("All data frames after the initial data frame " \ "must have opcode 0 (continuation).")); - return; + return true; } if (!frame.isContinuationFrame()) { m_opCode = frame.opCode(); @@ -168,7 +171,7 @@ void QWebSocketDataProcessor::process(QIODevice *pIoDevice) clear(); Q_EMIT errorEncountered(QWebSocketProtocol::CloseCodeTooMuchData, tr("Received message is too big.")); - return; + return true; } if (m_opCode == QWebSocketProtocol::OpCodeText) { @@ -181,7 +184,7 @@ void QWebSocketDataProcessor::process(QIODevice *pIoDevice) clear(); Q_EMIT errorEncountered(QWebSocketProtocol::CloseCodeWrongDatatype, tr("Invalid UTF-8 code encountered.")); - return; + return true; } else { m_textMessage.append(frameTxt); Q_EMIT textFrameReceived(frameTxt, frame.isFinalFrame()); @@ -211,6 +214,7 @@ void QWebSocketDataProcessor::process(QIODevice *pIoDevice) } frame.clear(); } + return true; } /*! diff --git a/src/websockets/qwebsocketdataprocessor_p.h b/src/websockets/qwebsocketdataprocessor_p.h index 41226d6..03635b1 100644 --- a/src/websockets/qwebsocketdataprocessor_p.h +++ b/src/websockets/qwebsocketdataprocessor_p.h @@ -88,7 +88,7 @@ Q_SIGNALS: void errorEncountered(QWebSocketProtocol::CloseCode code, const QString &description); public Q_SLOTS: - void process(QIODevice *pIoDevice); + bool process(QIODevice *pIoDevice); void clear(); private: diff --git a/tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp b/tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp index 19af815..71e1262 100644 --- a/tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp +++ b/tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp @@ -472,8 +472,8 @@ void tst_QWebSocket::tst_sendTextMessage() QCOMPARE(urlConnected, url); QCOMPARE(socket.bytesToWrite(), 0); - // transmit a long text message with 64 kb - QString longString(65536, 'a'); + // transmit a long text message with 1 MB + QString longString(0x100000, 'a'); socket.sendTextMessage(longString); QVERIFY(socket.bytesToWrite() > longString.length()); QVERIFY(textMessageReceived.wait()); -- cgit v1.2.1