summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Chu <ryan.chu@qt.io>2019-08-27 13:29:31 +0200
committerRyan Chu <ryan.chu@qt.io>2019-08-28 13:03:39 +0200
commit470a1cb4e43d410cb0d05286b286f491c85ffd29 (patch)
treeea36024222f902fe96e1eb4162192f05a29cac3f
parentceeb9952b29345b662669a6a0a5c4dadf49db114 (diff)
downloadqtwebsockets-470a1cb4e43d410cb0d05286b286f491c85ffd29.tar.gz
QWebsocket doesn't receive message with size larger than 1M
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 <jsfdez@gmail.com> Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
-rw-r--r--src/websockets/qwebsocket_p.cpp4
-rw-r--r--src/websockets/qwebsocketdataprocessor.cpp16
-rw-r--r--src/websockets/qwebsocketdataprocessor_p.h2
-rw-r--r--tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp4
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());