summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2015-02-19 14:03:45 +0100
committerLiang Qi <liang.qi@theqtcompany.com>2015-02-20 08:09:53 +0000
commit85a8ea105646c7d871f982b890ef5f6faa91824d (patch)
tree876e6bc7e22fcf0984ee806c68a423eeaebde58f
parent0a42c6aff61142f97b6288b4504357a26ef43855 (diff)
downloadqtwebsockets-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.cpp16
-rw-r--r--tests/auto/handshakerequest/tst_handshakerequest.cpp22
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"