diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/websockets/qwebsocket_p.cpp | 4 | ||||
-rw-r--r-- | src/websockets/qwebsocketframe.cpp | 4 | ||||
-rw-r--r-- | src/websockets/qwebsocketserver.cpp | 14 | ||||
-rw-r--r-- | src/websockets/qwebsocketserver.h | 3 | ||||
-rw-r--r-- | src/websockets/qwebsocketserver_p.cpp | 26 | ||||
-rw-r--r-- | src/websockets/qwebsocketserver_p.h | 3 |
6 files changed, 39 insertions, 15 deletions
diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index 8f55e24..1a47e76 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -1085,8 +1085,8 @@ void QWebSocketPrivate::processStateChanged(QAbstractSocket::SocketState socketS m_key = generateKey(); QList<QPair<QString, QString> > headers; - const auto keys = m_request.rawHeaderList(); - for (const QByteArray &key : keys) + const auto headerList = m_request.rawHeaderList(); + for (const QByteArray &key : headerList) headers << qMakePair(QString::fromLatin1(key), QString::fromLatin1(m_request.rawHeader(key))); diff --git a/src/websockets/qwebsocketframe.cpp b/src/websockets/qwebsocketframe.cpp index ebc3c33..d51ae7c 100644 --- a/src/websockets/qwebsocketframe.cpp +++ b/src/websockets/qwebsocketframe.cpp @@ -289,7 +289,7 @@ bool QWebSocketFrame::isValid() const // The arm compiler of Visual Studio 2013 Update 3 crashes when // trying to optimize QWebSocketFrame::readFrame. Hence turn // those off for this snippet -#if (defined(Q_OS_WINPHONE) || defined(Q_OS_WINRT)) && defined(__ARM__) +#if defined(Q_OS_WINRT) && defined(__ARM__) # pragma optimize("", off) #endif @@ -501,7 +501,7 @@ QWebSocketFrame QWebSocketFrame::readFrame(QIODevice *pIoDevice) return frame; } -#if (defined(Q_OS_WINPHONE) || defined(Q_OS_WINRT)) && defined(__ARM__) +#if defined(Q_OS_WINRT) && defined(__ARM__) # pragma optimize("", on) #endif diff --git a/src/websockets/qwebsocketserver.cpp b/src/websockets/qwebsocketserver.cpp index f8ecdf2..e4cfe12 100644 --- a/src/websockets/qwebsocketserver.cpp +++ b/src/websockets/qwebsocketserver.cpp @@ -612,4 +612,18 @@ QList<QWebSocketProtocol::Version> QWebSocketServer::supportedVersions() const return d->supportedVersions(); } +/*! + Upgrades a tcp \a socket to websocket. + + The QWebSocketServer object will take ownership of the socket + object and delete it when appropriate. + + \since 5.9 +*/ +void QWebSocketServer::handleConnection(QTcpSocket *socket) const +{ + Q_D(const QWebSocketServer); + d->handleConnection(socket); +} + QT_END_NAMESPACE diff --git a/src/websockets/qwebsocketserver.h b/src/websockets/qwebsocketserver.h index 511a55b..f846290 100644 --- a/src/websockets/qwebsocketserver.h +++ b/src/websockets/qwebsocketserver.h @@ -54,6 +54,7 @@ QT_BEGIN_NAMESPACE +class QTcpSocket; class QWebSocketServerPrivate; class QWebSocket; class QWebSocketCorsAuthenticator; @@ -118,6 +119,8 @@ public: QList<QWebSocketProtocol::Version> supportedVersions() const; + void handleConnection(QTcpSocket *socket) const; + Q_SIGNALS: void acceptError(QAbstractSocket::SocketError socketError); void serverError(QWebSocketProtocol::CloseCode closeCode); diff --git a/src/websockets/qwebsocketserver_p.cpp b/src/websockets/qwebsocketserver_p.cpp index d675056..b7972b0 100644 --- a/src/websockets/qwebsocketserver_p.cpp +++ b/src/websockets/qwebsocketserver_p.cpp @@ -384,17 +384,8 @@ void QWebSocketServerPrivate::setError(QWebSocketProtocol::CloseCode code, const */ void QWebSocketServerPrivate::onNewConnection() { - while (m_pTcpServer->hasPendingConnections()) { - QTcpSocket *pTcpSocket = m_pTcpServer->nextPendingConnection(); - //use a queued connection because a QSslSocket - //needs the event loop to process incoming data - //if not queued, data is incomplete when handshakeReceived is called - QObjectPrivate::connect(pTcpSocket, &QTcpSocket::readyRead, - this, &QWebSocketServerPrivate::handshakeReceived, - Qt::QueuedConnection); - QObjectPrivate::connect(pTcpSocket, &QTcpSocket::disconnected, - this, &QWebSocketServerPrivate::onSocketDisconnected); - } + while (m_pTcpServer->hasPendingConnections()) + handleConnection(m_pTcpServer->nextPendingConnection()); } /*! @@ -491,4 +482,17 @@ void QWebSocketServerPrivate::handshakeReceived() } } +void QWebSocketServerPrivate::handleConnection(QTcpSocket *pTcpSocket) const +{ + if (Q_LIKELY(pTcpSocket)) { + // Use a queued connection because a QSslSocket needs the event loop to process incoming + // data. If not queued, data is incomplete when handshakeReceived is called. + QObjectPrivate::connect(pTcpSocket, &QTcpSocket::readyRead, + this, &QWebSocketServerPrivate::handshakeReceived, + Qt::QueuedConnection); + QObjectPrivate::connect(pTcpSocket, &QTcpSocket::disconnected, + this, &QWebSocketServerPrivate::onSocketDisconnected); + } +} + QT_END_NAMESPACE diff --git a/src/websockets/qwebsocketserver_p.h b/src/websockets/qwebsocketserver_p.h index 6aabebd..0ca7495 100644 --- a/src/websockets/qwebsocketserver_p.h +++ b/src/websockets/qwebsocketserver_p.h @@ -65,6 +65,7 @@ QT_BEGIN_NAMESPACE class QTcpServer; +class QTcpSocket; class QWebSocketServer; class QWebSocketServerPrivate : public QObjectPrivate @@ -120,6 +121,8 @@ public: void setError(QWebSocketProtocol::CloseCode code, const QString &errorString); + void handleConnection(QTcpSocket *pTcpSocket) const; + QWebSocketServer * const q_ptr; private: |