summaryrefslogtreecommitdiff
path: root/src/websockets/qwebsockethandshakerequest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/websockets/qwebsockethandshakerequest.cpp')
-rw-r--r--src/websockets/qwebsockethandshakerequest.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/websockets/qwebsockethandshakerequest.cpp b/src/websockets/qwebsockethandshakerequest.cpp
index e6a626c..bfc8a3d 100644
--- a/src/websockets/qwebsockethandshakerequest.cpp
+++ b/src/websockets/qwebsockethandshakerequest.cpp
@@ -251,14 +251,26 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream, int maxH
return;
}
m_headers.clear();
+ // TODO: this should really use the existing code from QHttpNetworkReplyPrivate::parseHeader
+ auto lastHeader = m_headers.end();
while (!headerLine.isEmpty()) {
- const QStringList headerField = headerLine.split(QStringLiteral(": "),
- QString::SkipEmptyParts);
- if (Q_UNLIKELY(headerField.length() < 2)) {
- clear();
- return;
+ if (headerLine.startsWith(QLatin1Char(' ')) || headerLine.startsWith(QLatin1Char('\t'))) {
+ // continuation line -- add this to the last header field
+ if (Q_UNLIKELY(lastHeader == m_headers.end())) {
+ clear();
+ return;
+ }
+ lastHeader.value().append(QLatin1Char(' '));
+ lastHeader.value().append(headerLine.trimmed());
+ } else {
+ int colonPos = headerLine.indexOf(QLatin1Char(':'));
+ if (Q_UNLIKELY(colonPos <= 0)) {
+ clear();
+ return;
+ }
+ lastHeader = m_headers.insertMulti(headerLine.left(colonPos).trimmed().toLower(),
+ headerLine.mid(colonPos + 1).trimmed());
}
- m_headers.insertMulti(headerField.at(0).toLower(), headerField.at(1));
if (m_headers.size() > maxHeaders) {
clear();
return;