diff options
author | Øystein Heskestad <oystein.heskestad@qt.io> | 2021-11-11 11:26:32 +0100 |
---|---|---|
committer | Øystein Heskestad <oystein.heskestad@qt.io> | 2021-12-09 17:56:53 +0100 |
commit | 8341a3f435cdbcdda25d67f504ca630d285faa63 (patch) | |
tree | 0ef4ea7911b36a0ea5112231d0e9fdfab4bb1dbf /tests | |
parent | cb7abc7ac0f19e0076a3927b0dd880606c6f92f6 (diff) |
Reuse qtbase's HTTP header parser to avoid a reinvented wheel
Fixes: QTBUG-80700
Change-Id: I7b713fd869ac802d5eee8ebb8d90a2115365b509
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'tests')
4 files changed, 40 insertions, 50 deletions
diff --git a/tests/auto/websockets/handshakerequest/CMakeLists.txt b/tests/auto/websockets/handshakerequest/CMakeLists.txt index 984f454..3714ef9 100644 --- a/tests/auto/websockets/handshakerequest/CMakeLists.txt +++ b/tests/auto/websockets/handshakerequest/CMakeLists.txt @@ -11,6 +11,8 @@ endif() qt_internal_add_test(tst_handshakerequest SOURCES tst_handshakerequest.cpp + LIBRARIES + Qt::NetworkPrivate PUBLIC_LIBRARIES Qt::WebSocketsPrivate ) diff --git a/tests/auto/websockets/handshakerequest/tst_handshakerequest.cpp b/tests/auto/websockets/handshakerequest/tst_handshakerequest.cpp index 230b052..a91f9cb 100644 --- a/tests/auto/websockets/handshakerequest/tst_handshakerequest.cpp +++ b/tests/auto/websockets/handshakerequest/tst_handshakerequest.cpp @@ -213,12 +213,9 @@ void tst_HandshakeRequest::tst_invalidStream() QFETCH(QString, dataStream); QByteArray data; - QTextStream textStream(&data); + QTextStream(&data) << dataStream; QWebSocketHandshakeRequest request(80, true); - - textStream << dataStream; - textStream.seek(0); - request.readHandshake(textStream, MAX_HEADERLINE_LENGTH, MAX_HEADERS); + request.readHandshake(data, MAX_HEADERLINE_LENGTH); QVERIFY(!request.isValid()); QCOMPARE(request.port(), 80); @@ -249,12 +246,9 @@ void tst_HandshakeRequest::tst_multipleValuesInConnectionHeader() QStringLiteral("Upgrade: websocket\r\n") + QStringLiteral("Connection: Upgrade,keepalive\r\n\r\n"); QByteArray data; - QTextStream textStream(&data); + QTextStream(&data) << header; QWebSocketHandshakeRequest request(80, false); - - textStream << header; - textStream.seek(0); - request.readHandshake(textStream, MAX_HEADERLINE_LENGTH, MAX_HEADERS); + request.readHandshake(data, MAX_HEADERLINE_LENGTH); QVERIFY(request.isValid()); QCOMPARE(request.port(), 80); @@ -286,12 +280,9 @@ void tst_HandshakeRequest::tst_parsingWhitespaceInHeaders() QStringLiteral("Upgrade:websocket \r\n") + QStringLiteral("Connection: Upgrade,keepalive\r\n\r\n"); QByteArray data; - QTextStream textStream(&data); + QTextStream(&data) << header; QWebSocketHandshakeRequest request(80, false); - - textStream << header; - textStream.seek(0); - request.readHandshake(textStream, MAX_HEADERLINE_LENGTH, MAX_HEADERS); + request.readHandshake(data, MAX_HEADERLINE_LENGTH); QVERIFY(request.isValid()); QCOMPARE(request.key(), QStringLiteral("AVD FBDDFF")); @@ -307,12 +298,9 @@ void tst_HandshakeRequest::tst_multipleVersions() QStringLiteral("Upgrade: websocket\r\n") + QStringLiteral("Connection: Upgrade,keepalive\r\n\r\n"); QByteArray data; - QTextStream textStream(&data); + QTextStream(&data) << header; QWebSocketHandshakeRequest request(80, false); - - textStream << header; - textStream.seek(0); - request.readHandshake(textStream, MAX_HEADERLINE_LENGTH, MAX_HEADERS); + request.readHandshake(data, MAX_HEADERLINE_LENGTH); QVERIFY(request.isValid()); QCOMPARE(request.port(), 80); @@ -320,11 +308,11 @@ void tst_HandshakeRequest::tst_multipleVersions() QCOMPARE(request.extensions().length(), 0); QCOMPARE(request.protocols().length(), 0); QCOMPARE(request.headers().size(), 5); - QVERIFY(request.headers().contains(QStringLiteral("host"))); - QVERIFY(request.headers().contains(QStringLiteral("sec-websocket-version"))); - QVERIFY(request.headers().contains(QStringLiteral("sec-websocket-key"))); - QVERIFY(request.headers().contains(QStringLiteral("upgrade"))); - QVERIFY(request.headers().contains(QStringLiteral("connection"))); + QVERIFY(request.hasHeader("host")); + QVERIFY(request.hasHeader("sec-websocket-version")); + QVERIFY(request.hasHeader("sec-websocket-key")); + QVERIFY(request.hasHeader("upgrade")); + QVERIFY(request.hasHeader("connection")); QCOMPARE(request.key(), QStringLiteral("AVDFBDDFF")); QCOMPARE(request.origin().length(), 0); QCOMPARE(request.requestUrl(), QUrl("ws://foo.com/test")); @@ -343,12 +331,9 @@ void tst_HandshakeRequest::tst_qtbug_39355() QStringLiteral("Upgrade: websocket\r\n") + QStringLiteral("Connection: Upgrade\r\n\r\n"); QByteArray data; - QTextStream textStream(&data); + QTextStream(&data) << header; QWebSocketHandshakeRequest request(8080, false); - - textStream << header; - textStream.seek(0); - request.readHandshake(textStream, MAX_HEADERLINE_LENGTH, MAX_HEADERS); + request.readHandshake(data, MAX_HEADERLINE_LENGTH); QVERIFY(request.isValid()); QCOMPARE(request.port(), 1234); @@ -366,12 +351,21 @@ void tst_HandshakeRequest::tst_qtbug_48123_data() QStringLiteral("Connection: Upgrade\r\n"); const int numHeaderLines = header.count(QStringLiteral("\r\n")) - 1; //-1: exclude requestline - //a headerline should not be larger than MAX_HEADERLINE_LENGTH characters (excluding CRLF) + // a headerline must contain colon QString illegalHeader = header; - illegalHeader.append(QString(MAX_HEADERLINE_LENGTH + 1, QLatin1Char('c'))); + illegalHeader.append(QString(MAX_HEADERLINE_LENGTH, QLatin1Char('c'))); illegalHeader.append(QStringLiteral("\r\n\r\n")); - QTest::newRow("headerline too long") << illegalHeader << false; + QTest::newRow("headerline missing colon") << illegalHeader << false; + + // a headerline should not be larger than MAX_HEADERLINE_LENGTH characters (excluding CRLF) + QString tooLongHeader = header; + QString fieldName = "Too-long: "; + tooLongHeader.append(fieldName); + tooLongHeader.append(QString(MAX_HEADERLINE_LENGTH + 1 - fieldName.size(), QLatin1Char('c'))); + tooLongHeader.append(QStringLiteral("\r\n\r\n")); + + QTest::newRow("headerline too long") << tooLongHeader << false; QString legalHeader = header; const QString headerKey = QStringLiteral("X-CUSTOM-KEY: "); @@ -408,12 +402,9 @@ void tst_HandshakeRequest::tst_qtbug_48123() QFETCH(bool, shouldBeValid); QByteArray data; - QTextStream textStream(&data); + QTextStream(&data) << header; QWebSocketHandshakeRequest request(8080, false); - - textStream << header; - textStream.seek(0); - request.readHandshake(textStream, MAX_HEADERLINE_LENGTH, MAX_HEADERS); + request.readHandshake(data, MAX_HEADERLINE_LENGTH); QCOMPARE(request.isValid(), shouldBeValid); } @@ -504,12 +495,9 @@ void tst_HandshakeRequest::tst_qtbug_57357() QFETCH(int, port); QByteArray data; - QTextStream textStream(&data); + QTextStream(&data) << header; QWebSocketHandshakeRequest request(8080, false); - - textStream << header; - textStream.seek(0); - request.readHandshake(textStream, MAX_HEADERLINE_LENGTH, MAX_HEADERS); + request.readHandshake(data, MAX_HEADERLINE_LENGTH); QCOMPARE(request.isValid(), valid); if (valid) { diff --git a/tests/auto/websockets/handshakeresponse/CMakeLists.txt b/tests/auto/websockets/handshakeresponse/CMakeLists.txt index 0eac850..1562519 100644 --- a/tests/auto/websockets/handshakeresponse/CMakeLists.txt +++ b/tests/auto/websockets/handshakeresponse/CMakeLists.txt @@ -11,6 +11,8 @@ endif() qt_internal_add_test(tst_handshakeresponse SOURCES tst_handshakeresponse.cpp + LIBRARIES + Qt::NetworkPrivate PUBLIC_LIBRARIES Qt::WebSocketsPrivate ) diff --git a/tests/auto/websockets/handshakeresponse/tst_handshakeresponse.cpp b/tests/auto/websockets/handshakeresponse/tst_handshakeresponse.cpp index 9a7c590..436681b 100644 --- a/tests/auto/websockets/handshakeresponse/tst_handshakeresponse.cpp +++ b/tests/auto/websockets/handshakeresponse/tst_handshakeresponse.cpp @@ -81,13 +81,11 @@ void tst_HandshakeResponse::cleanup() void tst_HandshakeResponse::tst_date_response() { QWebSocketHandshakeRequest request(80, false); - QString buffer; - QTextStream input(&buffer); - input << QStringLiteral("GET / HTTP/1.1\r\nHost: example.com\r\nSec-WebSocket-Version: 13\r\n") + - QStringLiteral("Sec-WebSocket-Key: AVDFBDDFF\r\n") + - QStringLiteral("Upgrade: websocket\r\n") + - QStringLiteral("Connection: Upgrade\r\n\r\n"); - request.readHandshake(input, 8 * 1024, 100); + QByteArray bytes = "GET / HTTP/1.1\r\nHost: example.com\r\nSec-WebSocket-Version: 13\r\n" + "Sec-WebSocket-Key: AVDFBDDFF\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n\r\n"; + request.readHandshake(bytes, 8 * 1024); QWebSocketHandshakeResponse response(request, "example.com", true, QList<QWebSocketProtocol::Version>() << QWebSocketProtocol::Version13, |