diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-02-19 14:03:45 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2015-02-20 08:09:53 +0000 |
commit | 85a8ea105646c7d871f982b890ef5f6faa91824d (patch) | |
tree | 876e6bc7e22fcf0984ee806c68a423eeaebde58f | |
parent | 0a42c6aff61142f97b6288b4504357a26ef43855 (diff) | |
download | qtwebsockets-85a8ea105646c7d871f982b890ef5f6faa91824d.tar.gz |
fix the port in Host field in handshake request
Task-number: QTBUG-39355
Change-Id: I06993193fe9618ace93552aed573a3eee5de18fa
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Kurt Pattyn <pattyn.kurt@gmail.com>
-rw-r--r-- | src/websockets/qwebsockethandshakerequest.cpp | 16 | ||||
-rw-r--r-- | tests/auto/handshakerequest/tst_handshakerequest.cpp | 22 |
2 files changed, 36 insertions, 2 deletions
diff --git a/src/websockets/qwebsockethandshakerequest.cpp b/src/websockets/qwebsockethandshakerequest.cpp index 94d99cd..6c8c9cf 100644 --- a/src/websockets/qwebsockethandshakerequest.cpp +++ b/src/websockets/qwebsockethandshakerequest.cpp @@ -222,10 +222,22 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream) headerLine = textStream.readLine(); } - const QString host = m_headers.value(QStringLiteral("host"), QString()); m_requestUrl = QUrl::fromEncoded(resourceName.toLatin1()); - if (m_requestUrl.isRelative()) + QString host = m_headers.value(QStringLiteral("host"), QString()); + if (m_requestUrl.isRelative()) { + // see http://tools.ietf.org/html/rfc6455#page-17 + // No. 4 item in "The requirements for this handshake" + int idx = host.indexOf(":"); + bool ok = false; + int port; + if (idx != -1) { + port = host.rightRef(host.length() - idx - 1).toInt(&ok); + host.truncate(idx); + } m_requestUrl.setHost(host); + if (ok) + m_requestUrl.setPort(port); + } if (m_requestUrl.scheme().isEmpty()) { const QString scheme = isSecure() ? QStringLiteral("wss") : QStringLiteral("ws"); m_requestUrl.setScheme(scheme); diff --git a/tests/auto/handshakerequest/tst_handshakerequest.cpp b/tests/auto/handshakerequest/tst_handshakerequest.cpp index 3e6ec40..619a477 100644 --- a/tests/auto/handshakerequest/tst_handshakerequest.cpp +++ b/tests/auto/handshakerequest/tst_handshakerequest.cpp @@ -65,6 +65,8 @@ private Q_SLOTS: void tst_multipleValuesInConnectionHeader(); void tst_multipleVersions(); + + void tst_qtbug_39355(); }; tst_HandshakeRequest::tst_HandshakeRequest() @@ -290,6 +292,26 @@ void tst_HandshakeRequest::tst_multipleVersions() QCOMPARE(request.versions().at(0), QWebSocketProtocol::Version13); } +void tst_HandshakeRequest::tst_qtbug_39355() +{ + QString header = QStringLiteral("GET /ABC/DEF/ HTTP/1.1\r\nHost: localhost:1234\r\n") + + QStringLiteral("Sec-WebSocket-Version: 13\r\n") + + QStringLiteral("Sec-WebSocket-Key: 2Wg20829/4ziWlmsUAD8Dg==\r\n") + + QStringLiteral("Upgrade: websocket\r\n") + + QStringLiteral("Connection: Upgrade\r\n\r\n"); + QByteArray data; + QTextStream textStream(&data); + QWebSocketHandshakeRequest request(8080, false); + + textStream << header; + textStream.seek(0); + request.readHandshake(textStream); + + QVERIFY(request.isValid()); + QCOMPARE(request.port(), 1234); + QCOMPARE(request.host(), QStringLiteral("localhost")); +} + QTEST_MAIN(tst_HandshakeRequest) #include "tst_handshakerequest.moc" |