summaryrefslogtreecommitdiff
path: root/src/websockets
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-08-07 03:00:18 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-08-07 03:00:18 +0200
commitedf368405a26cb4c68913abb77a2a3614e79b4f8 (patch)
treeb793317458bc0c307fdeb892380937e41139c042 /src/websockets
parentb8c8bb67342b83091a4066ba6f45e150330cb0ac (diff)
parentcf41cd16a1f156d68f9cb4a84dd77230f29d739f (diff)
downloadqtwebsockets-edf368405a26cb4c68913abb77a2a3614e79b4f8.tar.gz
Merge remote-tracking branch 'origin/5.11' into dev
Change-Id: Iffe66da51d3b7b38d04ca3c185b3b003b157f886
Diffstat (limited to 'src/websockets')
-rw-r--r--src/websockets/qwebsocket.cpp5
-rw-r--r--src/websockets/qwebsocket_p.cpp10
2 files changed, 11 insertions, 4 deletions
diff --git a/src/websockets/qwebsocket.cpp b/src/websockets/qwebsocket.cpp
index 64d5e4c..b9c6cc0 100644
--- a/src/websockets/qwebsocket.cpp
+++ b/src/websockets/qwebsocket.cpp
@@ -402,7 +402,10 @@ qint64 QWebSocket::sendBinaryMessage(const QByteArray &data)
Any data in the write buffer is flushed before the socket is closed.
The \a closeCode is a QWebSocketProtocol::CloseCode indicating the reason to close, and
- \a reason describes the reason of the closure more in detail
+ \a reason describes the reason of the closure more in detail. All control
+ frames, including the Close frame, are limited to 125 bytes. Since two of
+ these are used for \a closeCode the maximum length of \a reason is 123! If
+ \a reason exceeds this limit it will be truncated.
*/
void QWebSocket::close(QWebSocketProtocol::CloseCode closeCode, const QString &reason)
{
diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp
index 45d6a6f..9b27ad2 100644
--- a/src/websockets/qwebsocket_p.cpp
+++ b/src/websockets/qwebsocket_p.cpp
@@ -334,12 +334,14 @@ void QWebSocketPrivate::close(QWebSocketProtocol::CloseCode closeCode, QString r
if (!m_isClosingHandshakeSent) {
Q_Q(QWebSocket);
m_closeCode = closeCode;
- m_closeReason = reason;
+ // 125 is the maximum length of a control frame, and 2 bytes are used for the close code:
+ const QByteArray reasonUtf8 = reason.toUtf8().left(123);
+ m_closeReason = QString::fromUtf8(reasonUtf8);
const quint16 code = qToBigEndian<quint16>(closeCode);
QByteArray payload;
payload.append(static_cast<const char *>(static_cast<const void *>(&code)), 2);
- if (!reason.isEmpty())
- payload.append(reason.toUtf8());
+ if (!reasonUtf8.isEmpty())
+ payload.append(reasonUtf8);
quint32 maskingKey = 0;
if (m_mustMask) {
maskingKey = generateMaskingKey();
@@ -347,6 +349,8 @@ void QWebSocketPrivate::close(QWebSocketProtocol::CloseCode closeCode, QString r
}
QByteArray frame = getFrameHeader(QWebSocketProtocol::OpCodeClose,
payload.size(), maskingKey, true);
+
+ Q_ASSERT(payload.length() <= 125);
frame.append(payload);
m_pSocket->write(frame);
m_pSocket->flush();