2 QWebSockets implements the WebSocket protocol as defined in RFC 6455.
3 Copyright (C) 2013 Kurt Pattyn (pattyn.kurt@gmail.com)
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 #ifndef QWEBSOCKET_P_H
21 #define QWEBSOCKET_P_H
26 // This file is not part of the Qt API. It exists purely as an
27 // implementation detail. This header file may change from version to
28 // version without notice, or even be removed.
34 #include <QHostAddress>
35 #ifndef QT_NO_NETWORKPROXY
36 #include <QNetworkProxy>
39 #include <QSslConfiguration>
44 #include "qwebsocketprotocol.h"
45 #include "qwebsocketdataprocessor_p.h"
49 class QWebSocketHandshakeRequest;
50 class QWebSocketHandshakeResponse;
54 class QWebSocketPrivate : public QObject
57 Q_DISABLE_COPY(QWebSocketPrivate)
58 Q_DECLARE_PUBLIC(QWebSocket)
61 explicit QWebSocketPrivate(const QString &origin,
62 QWebSocketProtocol::Version version,
63 QWebSocket * const pWebSocket,
64 QObject *parent = Q_NULLPTR);
65 virtual ~QWebSocketPrivate();
68 QAbstractSocket::SocketError error() const;
69 QString errorString() const;
72 QHostAddress localAddress() const;
73 quint16 localPort() const;
74 QAbstractSocket::PauseModes pauseMode() const;
75 QHostAddress peerAddress() const;
76 QString peerName() const;
77 quint16 peerPort() const;
78 #ifndef QT_NO_NETWORKPROXY
79 QNetworkProxy proxy() const;
80 void setProxy(const QNetworkProxy &networkProxy);
82 qint64 readBufferSize() const;
84 void setPauseMode(QAbstractSocket::PauseModes pauseMode);
85 void setReadBufferSize(qint64 size);
86 void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value);
87 QVariant socketOption(QAbstractSocket::SocketOption option);
88 QAbstractSocket::SocketState state() const;
90 bool waitForConnected(int msecs);
91 bool waitForDisconnected(int msecs);
93 QWebSocketProtocol::Version version() const;
94 QString resourceName() const;
95 QUrl requestUrl() const;
96 QString origin() const;
97 QString protocol() const;
98 QString extension() const;
100 qint64 write(const char *message); //send data as text
101 qint64 write(const char *message, qint64 maxSize); //send data as text
102 qint64 write(const QString &message); //send data as text
103 qint64 write(const QByteArray &data); //send data as binary
106 void ignoreSslErrors(const QList<QSslError> &errors);
107 void setSslConfiguration(const QSslConfiguration &sslConfiguration);
108 QSslConfiguration sslConfiguration() const;
112 void close(QWebSocketProtocol::CloseCode closeCode, QString reason);
113 void open(const QUrl &url, bool mask);
114 void ping(const QByteArray &payload);
117 void ignoreSslErrors();
122 void processPing(QByteArray data);
123 void processPong(QByteArray data);
124 void processClose(QWebSocketProtocol::CloseCode closeCode, QString closeReason);
125 void processHandshake(QTcpSocket *pSocket);
126 void processStateChanged(QAbstractSocket::SocketState socketState);
129 QWebSocket * const q_ptr;
131 QSslConfiguration m_sslConfiguration;
132 QList<QSslError> m_ignoredSslErrors;
133 bool m_ignoreSslErrors;
136 QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol::Version version, QWebSocket *pWebSocket, QObject *parent = Q_NULLPTR);
137 void setVersion(QWebSocketProtocol::Version version);
138 void setResourceName(const QString &resourceName);
139 void setRequestUrl(const QUrl &requestUrl);
140 void setOrigin(const QString &origin);
141 void setProtocol(const QString &protocol);
142 void setExtension(const QString &extension);
143 void enableMasking(bool enable);
144 void setSocketState(QAbstractSocket::SocketState state);
145 void setErrorString(const QString &errorString);
147 qint64 doWriteData(const QByteArray &data, bool isBinary);
148 qint64 doWriteFrames(const QByteArray &data, bool isBinary);
150 void makeConnections(const QTcpSocket *pTcpSocket);
151 void releaseConnections(const QTcpSocket *pTcpSocket);
153 QByteArray getFrameHeader(QWebSocketProtocol::OpCode opCode, quint64 payloadLength, quint32 maskingKey, bool lastFrame) const;
154 QString calculateAcceptKey(const QString &key) const;
155 QString createHandShakeRequest(QString resourceName,
162 static QWebSocket *upgradeFrom(QTcpSocket *tcpSocket,
163 const QWebSocketHandshakeRequest &request,
164 const QWebSocketHandshakeResponse &response,
165 QObject *parent = Q_NULLPTR);
167 quint32 generateMaskingKey() const;
168 QByteArray generateKey() const;
169 quint32 generateRandomNumber() const;
170 qint64 writeFrames(const QList<QByteArray> &frames);
171 qint64 writeFrame(const QByteArray &frame);
173 QTcpSocket *m_pSocket;
174 QString m_errorString;
175 QWebSocketProtocol::Version m_version;
177 QString m_resourceName;
182 QAbstractSocket::SocketState m_socketState;
184 QByteArray m_key; //identification key used in handshake requests
186 bool m_mustMask; //a server must not mask the frames it sends
188 bool m_isClosingHandshakeSent;
189 bool m_isClosingHandshakeReceived;
193 QWebSocketDataProcessor m_dataProcessor;
195 friend class QWebSocketServerPrivate;
200 #endif // QWEBSOCKET_H