Commit ea22c846 authored by Jorma Tähtinen's avatar Jorma Tähtinen Committed by Jędrzej Nowacki
Browse files

Fix QWebSocketServer for clients preferring lowercase http headers.


QWebSocketServer should not use case-sensitive compare to validate
http headers for incoming connections.

Change-Id: Ie7b8a9f6ca1a0b547eb7a924f6392395f812b0e3
Task-number: QTBUG-40615
Reviewed-by: default avatarJędrzej Nowacki <jedrzej.nowacki@digia.com>
Showing with 14 additions and 14 deletions
...@@ -218,11 +218,11 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream) ...@@ -218,11 +218,11 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream)
clear(); clear();
return; return;
} }
m_headers.insertMulti(headerField.at(0), headerField.at(1)); m_headers.insertMulti(headerField.at(0).toLower(), headerField.at(1));
headerLine = textStream.readLine(); headerLine = textStream.readLine();
} }
const QString host = m_headers.value(QStringLiteral("Host"), QString()); const QString host = m_headers.value(QStringLiteral("host"), QString());
m_requestUrl = QUrl::fromEncoded(resourceName.toLatin1()); m_requestUrl = QUrl::fromEncoded(resourceName.toLatin1());
if (m_requestUrl.isRelative()) if (m_requestUrl.isRelative())
m_requestUrl.setHost(host); m_requestUrl.setHost(host);
...@@ -231,7 +231,7 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream) ...@@ -231,7 +231,7 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream)
m_requestUrl.setScheme(scheme); m_requestUrl.setScheme(scheme);
} }
const QStringList versionLines = m_headers.values(QStringLiteral("Sec-WebSocket-Version")); const QStringList versionLines = m_headers.values(QStringLiteral("sec-websocket-version"));
for (QStringList::const_iterator v = versionLines.begin(); v != versionLines.end(); ++v) { for (QStringList::const_iterator v = versionLines.begin(); v != versionLines.end(); ++v) {
const QStringList versions = (*v).split(QStringLiteral(","), QString::SkipEmptyParts); const QStringList versions = (*v).split(QStringLiteral(","), QString::SkipEmptyParts);
for (QStringList::const_iterator i = versions.begin(); i != versions.end(); ++i) { for (QStringList::const_iterator i = versions.begin(); i != versions.end(); ++i) {
...@@ -248,11 +248,11 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream) ...@@ -248,11 +248,11 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream)
} }
//sort in descending order //sort in descending order
std::sort(m_versions.begin(), m_versions.end(), std::greater<QWebSocketProtocol::Version>()); std::sort(m_versions.begin(), m_versions.end(), std::greater<QWebSocketProtocol::Version>());
m_key = m_headers.value(QStringLiteral("Sec-WebSocket-Key"), QString()); m_key = m_headers.value(QStringLiteral("sec-websocket-key"), QString());
//must contain "Upgrade", case-insensitive //must contain "Upgrade", case-insensitive
const QString upgrade = m_headers.value(QStringLiteral("Upgrade"), QString()); const QString upgrade = m_headers.value(QStringLiteral("upgrade"), QString());
//must be equal to "websocket", case-insensitive //must be equal to "websocket", case-insensitive
const QString connection = m_headers.value(QStringLiteral("Connection"), QString()); const QString connection = m_headers.value(QStringLiteral("connection"), QString());
const QStringList connectionLine = connection.split(QStringLiteral(","), const QStringList connectionLine = connection.split(QStringLiteral(","),
QString::SkipEmptyParts); QString::SkipEmptyParts);
QStringList connectionValues; QStringList connectionValues;
...@@ -260,14 +260,14 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream) ...@@ -260,14 +260,14 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream)
connectionValues << (*c).trimmed(); connectionValues << (*c).trimmed();
//optional headers //optional headers
m_origin = m_headers.value(QStringLiteral("Sec-WebSocket-Origin"), QString()); m_origin = m_headers.value(QStringLiteral("sec-websocket-origin"), QString());
const QStringList protocolLines = m_headers.values(QStringLiteral("Sec-WebSocket-Protocol")); const QStringList protocolLines = m_headers.values(QStringLiteral("sec-websocket-protocol"));
for (QStringList::const_iterator pl = protocolLines.begin(); pl != protocolLines.end(); ++pl) { for (QStringList::const_iterator pl = protocolLines.begin(); pl != protocolLines.end(); ++pl) {
QStringList protocols = (*pl).split(QStringLiteral(","), QString::SkipEmptyParts); QStringList protocols = (*pl).split(QStringLiteral(","), QString::SkipEmptyParts);
for (QStringList::const_iterator p = protocols.begin(); p != protocols.end(); ++p) for (QStringList::const_iterator p = protocols.begin(); p != protocols.end(); ++p)
m_protocols << (*p).trimmed(); m_protocols << (*p).trimmed();
} }
const QStringList extensionLines = m_headers.values(QStringLiteral("Sec-WebSocket-Extensions")); const QStringList extensionLines = m_headers.values(QStringLiteral("sec-websocket-extensions"));
for (QStringList::const_iterator el = extensionLines.begin(); for (QStringList::const_iterator el = extensionLines.begin();
el != extensionLines.end(); ++el) { el != extensionLines.end(); ++el) {
QStringList extensions = (*el).split(QStringLiteral(","), QString::SkipEmptyParts); QStringList extensions = (*el).split(QStringLiteral(","), QString::SkipEmptyParts);
......
...@@ -275,11 +275,11 @@ void tst_HandshakeRequest::tst_multipleVersions() ...@@ -275,11 +275,11 @@ void tst_HandshakeRequest::tst_multipleVersions()
QCOMPARE(request.extensions().length(), 0); QCOMPARE(request.extensions().length(), 0);
QCOMPARE(request.protocols().length(), 0); QCOMPARE(request.protocols().length(), 0);
QCOMPARE(request.headers().size(), 5); QCOMPARE(request.headers().size(), 5);
QVERIFY(request.headers().contains(QStringLiteral("Host"))); QVERIFY(request.headers().contains(QStringLiteral("host")));
QVERIFY(request.headers().contains(QStringLiteral("Sec-WebSocket-Version"))); QVERIFY(request.headers().contains(QStringLiteral("sec-websocket-version")));
QVERIFY(request.headers().contains(QStringLiteral("Sec-WebSocket-Key"))); QVERIFY(request.headers().contains(QStringLiteral("sec-websocket-key")));
QVERIFY(request.headers().contains(QStringLiteral("Upgrade"))); QVERIFY(request.headers().contains(QStringLiteral("upgrade")));
QVERIFY(request.headers().contains(QStringLiteral("Connection"))); QVERIFY(request.headers().contains(QStringLiteral("connection")));
QCOMPARE(request.key(), QStringLiteral("AVDFBDDFF")); QCOMPARE(request.key(), QStringLiteral("AVDFBDDFF"));
QCOMPARE(request.origin().length(), 0); QCOMPARE(request.origin().length(), 0);
QCOMPARE(request.requestUrl(), QUrl("ws://foo.com/test")); QCOMPARE(request.requestUrl(), QUrl("ws://foo.com/test"));
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment