summaryrefslogtreecommitdiff
path: root/src/websockets/qwebsocket_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/websockets/qwebsocket_p.cpp')
-rw-r--r--src/websockets/qwebsocket_p.cpp53
1 files changed, 37 insertions, 16 deletions
diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp
index 2a27abb..1722c15 100644
--- a/src/websockets/qwebsocket_p.cpp
+++ b/src/websockets/qwebsocket_p.cpp
@@ -88,7 +88,7 @@ QWebSocketPrivate::QWebSocketPrivate(const QString &origin, QWebSocketProtocol::
m_errorString(),
m_version(version),
m_resourceName(),
- m_requestUrl(),
+ m_request(),
m_origin(origin),
m_protocol(),
m_extension(),
@@ -121,7 +121,7 @@ QWebSocketPrivate::QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol:
m_errorString(pTcpSocket->errorString()),
m_version(version),
m_resourceName(),
- m_requestUrl(),
+ m_request(),
m_origin(),
m_protocol(),
m_extension(),
@@ -288,9 +288,15 @@ QWebSocket *QWebSocketPrivate::upgradeFrom(QTcpSocket *pTcpSocket,
{
QWebSocket *pWebSocket = new QWebSocket(pTcpSocket, response.acceptedVersion(), parent);
if (Q_LIKELY(pWebSocket)) {
+ QNetworkRequest netRequest(request.requestUrl());
+ QMapIterator<QString, QString> headerIter(request.headers());
+ while (headerIter.hasNext()) {
+ headerIter.next();
+ netRequest.setRawHeader(headerIter.key().toLatin1(), headerIter.value().toLatin1());
+ }
pWebSocket->d_func()->setExtension(response.acceptedExtension());
pWebSocket->d_func()->setOrigin(request.origin());
- pWebSocket->d_func()->setRequestUrl(request.requestUrl());
+ pWebSocket->d_func()->setRequest(netRequest);
pWebSocket->d_func()->setProtocol(response.acceptedProtocol());
pWebSocket->d_func()->setResourceName(request.requestUrl().toString(QUrl::RemoveUserInfo));
//a server should not send masked frames
@@ -337,12 +343,13 @@ void QWebSocketPrivate::close(QWebSocketProtocol::CloseCode closeCode, QString r
/*!
\internal
*/
-void QWebSocketPrivate::open(const QUrl &url, bool mask)
+void QWebSocketPrivate::open(const QNetworkRequest &request, bool mask)
{
//just delete the old socket for the moment;
//later, we can add more 'intelligent' handling by looking at the URL
Q_Q(QWebSocket);
+ QUrl url = request.url();
if (!url.isValid() || url.toString().contains(QStringLiteral("\r\n"))) {
setErrorString(QWebSocket::tr("Invalid URL."));
Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError);
@@ -359,11 +366,11 @@ void QWebSocketPrivate::open(const QUrl &url, bool mask)
m_isClosingHandshakeReceived = false;
m_isClosingHandshakeSent = false;
- setRequestUrl(url);
+ setRequest(request);
QString resourceName = url.path(QUrl::FullyEncoded);
// Check for encoded \r\n
if (resourceName.contains(QStringLiteral("%0D%0A"))) {
- setRequestUrl(QUrl()); //clear requestUrl
+ setRequest(QNetworkRequest()); //clear request
setErrorString(QWebSocket::tr("Invalid resource name."));
Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError);
return;
@@ -486,10 +493,10 @@ void QWebSocketPrivate::setResourceName(const QString &resourceName)
/*!
\internal
*/
-void QWebSocketPrivate::setRequestUrl(const QUrl &requestUrl)
+void QWebSocketPrivate::setRequest(const QNetworkRequest &request)
{
- if (m_requestUrl != requestUrl)
- m_requestUrl = requestUrl;
+ if (m_request != request)
+ m_request = request;
}
/*!
@@ -627,9 +634,9 @@ QString QWebSocketPrivate::resourceName() const
/*!
\internal
*/
-QUrl QWebSocketPrivate::requestUrl() const
+QNetworkRequest QWebSocketPrivate::request() const
{
- return m_requestUrl;
+ return m_request;
}
/*!
@@ -1046,22 +1053,29 @@ void QWebSocketPrivate::processStateChanged(QAbstractSocket::SocketState socketS
Q_Q(QWebSocket);
QAbstractSocket::SocketState webSocketState = this->state();
int port = 80;
- if (m_requestUrl.scheme() == QStringLiteral("wss"))
+ if (m_request.url().scheme() == QStringLiteral("wss"))
port = 443;
switch (socketState) {
case QAbstractSocket::ConnectedState:
if (webSocketState == QAbstractSocket::ConnectingState) {
m_key = generateKey();
+
+ QList<QPair<QString, QString> > headers;
+ foreach (const QByteArray &key, m_request.rawHeaderList())
+ headers << qMakePair(QString::fromLatin1(key),
+ QString::fromLatin1(m_request.rawHeader(key)));
+
const QString handshake =
createHandShakeRequest(m_resourceName,
- m_requestUrl.host()
+ m_request.url().host()
% QStringLiteral(":")
- % QString::number(m_requestUrl.port(port)),
+ % QString::number(m_request.url().port(port)),
origin(),
QString(),
QString(),
- m_key);
+ m_key,
+ headers);
if (handshake.isEmpty()) {
m_pSocket->abort();
Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError);
@@ -1160,7 +1174,8 @@ QString QWebSocketPrivate::createHandShakeRequest(QString resourceName,
QString origin,
QString extensions,
QString protocols,
- QByteArray key)
+ QByteArray key,
+ QList<QPair<QString, QString> > headers)
{
QStringList handshakeRequest;
if (resourceName.contains(QStringLiteral("\r\n"))) {
@@ -1202,6 +1217,12 @@ QString QWebSocketPrivate::createHandShakeRequest(QString resourceName,
handshakeRequest << QStringLiteral("Sec-WebSocket-Extensions: ") % extensions;
if (protocols.length() > 0)
handshakeRequest << QStringLiteral("Sec-WebSocket-Protocol: ") % protocols;
+
+ QListIterator<QPair<QString, QString> > headerIter(headers);
+ while (headerIter.hasNext()) {
+ const QPair<QString,QString> &header = headerIter.next();
+ handshakeRequest << header.first % QStringLiteral(": ") % header.second;
+ }
handshakeRequest << QStringLiteral("\r\n");
return handshakeRequest.join(QStringLiteral("\r\n"));