diff options
Diffstat (limited to 'src/websockets/qwebsocket_p.cpp')
-rw-r--r-- | src/websockets/qwebsocket_p.cpp | 53 |
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")); |