3 #include <QNetworkProxy>
4 #include "qwebsocketserver.h"
5 #include "qwebsocketserver_p.h"
6 #include "qwebsocketprotocol.h"
7 #include "handshakerequest_p.h"
8 #include "handshakeresponse_p.h"
9 #include "qwebsocket.h"
10 #include "qwebsocket_p.h"
17 QWebSocketServerPrivate::QWebSocketServerPrivate(const QString &serverName, QWebSocketServer * const pWebSocketServer, QObject *parent) :
19 q_ptr(pWebSocketServer),
21 m_serverName(serverName),
22 m_pendingConnections()
24 Q_ASSERT(pWebSocketServer != 0);
25 m_pTcpServer = new QTcpServer(this);
26 connect(m_pTcpServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
32 QWebSocketServerPrivate::~QWebSocketServerPrivate()
34 while (!m_pendingConnections.isEmpty())
36 QWebSocket *pWebSocket = m_pendingConnections.dequeue();
37 pWebSocket->close(QWebSocketProtocol::CC_GOING_AWAY, "Server closed.");
38 pWebSocket->deleteLater();
40 m_pTcpServer->deleteLater();
46 void QWebSocketServerPrivate::close()
48 m_pTcpServer->close();
54 QString QWebSocketServerPrivate::errorString() const
56 return m_pTcpServer->errorString();
62 bool QWebSocketServerPrivate::hasPendingConnections() const
64 return !m_pendingConnections.isEmpty();
70 bool QWebSocketServerPrivate::isListening() const
72 return m_pTcpServer->isListening();
78 bool QWebSocketServerPrivate::listen(const QHostAddress &address, quint16 port)
80 return m_pTcpServer->listen(address, port);
86 int QWebSocketServerPrivate::maxPendingConnections() const
88 return m_pTcpServer->maxPendingConnections();
94 void QWebSocketServerPrivate::addPendingConnection(QWebSocket *pWebSocket)
96 if (m_pendingConnections.size() < maxPendingConnections())
98 m_pendingConnections.enqueue(pWebSocket);
105 QWebSocket *QWebSocketServerPrivate::nextPendingConnection()
107 QWebSocket *pWebSocket = 0;
108 if (!m_pendingConnections.isEmpty())
110 pWebSocket = m_pendingConnections.dequeue();
115 #ifndef QT_NO_NETWORKPROXY
119 QNetworkProxy QWebSocketServerPrivate::proxy() const
121 return m_pTcpServer->proxy();
127 void QWebSocketServerPrivate::setProxy(const QNetworkProxy &networkProxy)
129 m_pTcpServer->setProxy(networkProxy);
135 QHostAddress QWebSocketServerPrivate::serverAddress() const
137 return m_pTcpServer->serverAddress();
143 QAbstractSocket::SocketError QWebSocketServerPrivate::serverError() const
145 return m_pTcpServer->serverError();
151 quint16 QWebSocketServerPrivate::serverPort() const
153 return m_pTcpServer->serverPort();
159 void QWebSocketServerPrivate::setMaxPendingConnections(int numConnections)
161 m_pTcpServer->setMaxPendingConnections(numConnections);
167 bool QWebSocketServerPrivate::setSocketDescriptor(int socketDescriptor)
169 return m_pTcpServer->setSocketDescriptor(socketDescriptor);
175 int QWebSocketServerPrivate::socketDescriptor() const
177 return m_pTcpServer->socketDescriptor();
183 bool QWebSocketServerPrivate::waitForNewConnection(int msec, bool *timedOut)
185 return m_pTcpServer->waitForNewConnection(msec, timedOut);
191 QList<QWebSocketProtocol::Version> QWebSocketServerPrivate::supportedVersions() const
193 QList<QWebSocketProtocol::Version> supportedVersions;
194 supportedVersions << QWebSocketProtocol::currentVersion(); //we only support V13
195 return supportedVersions;
201 QList<QString> QWebSocketServerPrivate::supportedProtocols() const
203 QList<QString> supportedProtocols;
204 return supportedProtocols; //no protocols are currently supported
210 QList<QString> QWebSocketServerPrivate::supportedExtensions() const
212 QList<QString> supportedExtensions;
213 return supportedExtensions; //no extensions are currently supported
219 void QWebSocketServerPrivate::onNewConnection()
221 QTcpSocket *pTcpSocket = m_pTcpServer->nextPendingConnection();
222 connect(pTcpSocket, SIGNAL(readyRead()), this, SLOT(handshakeReceived()));
228 void QWebSocketServerPrivate::onCloseConnection()
230 QTcpSocket *pTcpSocket = qobject_cast<QTcpSocket*>(sender());
240 void QWebSocketServerPrivate::handshakeReceived()
242 QTcpSocket *pTcpSocket = qobject_cast<QTcpSocket*>(sender());
245 bool success = false;
246 bool isSecure = false;
247 HandshakeRequest request(pTcpSocket->peerPort(), isSecure);
248 QTextStream textStream(pTcpSocket);
249 textStream >> request;
251 HandshakeResponse response(request,
253 q_ptr->isOriginAllowed(request.getOrigin()),
255 supportedProtocols(),
256 supportedExtensions());
257 disconnect(pTcpSocket, SIGNAL(readyRead()), this, SLOT(handshakeReceived()));
259 if (response.isValid())
261 QTextStream httpStream(pTcpSocket);
262 httpStream << response;
265 if (response.canUpgrade())
267 QWebSocket *pWebSocket = QWebSocketPrivate::upgradeFrom(pTcpSocket, request, response);
270 pWebSocket->setParent(this);
271 addPendingConnection(pWebSocket);
272 Q_EMIT q_ptr->newConnection();
277 qDebug() << "QWebSocketServerPrivate::handshakeReceived: Upgrading to WebSocket failed.";
282 qDebug() << "QWebSocketServerPrivate::handshakeReceived: Cannot upgrade to websocket.";
287 qDebug() << "QWebSocketServerPrivate::handshakeReceived: Invalid response. This should not happen!!!";
291 qDebug() << "QWebSocketServerPrivate::handshakeReceived: Closing socket because of invalid or unsupported request";
297 qDebug() << "WebSocketServerPrivate::handshakeReceived: Sender socket is NULL. This should not happen!!!";