3 * @brief Defines the WebSocket class.
5 * \note Currently, only V13 (RFC6455) is supported.
6 * \note Both text and binary websockets are supported.
7 * \note The secure version (wss) is currently not implemented.
8 * @author Kurt Pattyn (pattyn.kurt@gmail.com)
11 #ifndef QWEBSOCKET_P_H
12 #define QWEBSOCKET_P_H
17 // This file is not part of the Qt API. It exists purely as an
18 // implementation detail. This header file may change from version to
19 // version without notice, or even be removed.
25 #include <QAbstractSocket>
26 #include <QHostAddress>
27 #ifndef QT_NO_NETWORKPROXY
28 #include <QNetworkProxy>
31 #include "qwebsocketsglobal.h"
32 #include "qwebsocketprotocol.h"
33 #include "dataprocessor_p.h"
37 class HandshakeRequest;
38 class HandshakeResponse;
42 class QWebSocketPrivate:public QObject
47 explicit QWebSocketPrivate(QString origin,
48 QWebSocketProtocol::Version version,
49 QWebSocket * const pWebSocket,
51 virtual ~QWebSocketPrivate();
54 QAbstractSocket::SocketError error() const;
55 QString errorString() const;
58 QHostAddress localAddress() const;
59 quint16 localPort() const;
60 QHostAddress peerAddress() const;
61 QString peerName() const;
62 quint16 peerPort() const;
63 #ifndef QT_NO_NETWORKPROXY
64 QNetworkProxy proxy() const;
65 void setProxy(const QNetworkProxy &networkProxy);
67 qint64 readBufferSize() const;
68 void setReadBufferSize(qint64 size);
69 void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value);
70 QVariant socketOption(QAbstractSocket::SocketOption option);
71 QAbstractSocket::SocketState state() const;
73 bool waitForConnected(int msecs = 30000);
74 bool waitForDisconnected(int msecs = 30000);
76 QWebSocketProtocol::Version version();
77 QString resourceName();
83 qint64 write(const char *message); //send data as text
84 qint64 write(const char *message, qint64 maxSize); //send data as text
85 qint64 write(const QString &message); //send data as text
86 qint64 write(const QByteArray &data); //send data as binary
89 virtual void close(QWebSocketProtocol::CloseCode closeCode = QWebSocketProtocol::CC_NORMAL, QString reason = QString());
90 virtual void open(const QUrl &url, bool mask = true);
97 void stateChanged(QAbstractSocket::SocketState state);
98 void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *pAuthenticator);
99 void readChannelFinished();
100 void textFrameReceived(QString frame, bool isLastFrame);
101 void binaryFrameReceived(QByteArray frame, bool isLastFrame);
102 void textMessageReceived(QString message);
103 void binaryMessageReceived(QByteArray message);
104 void error(QAbstractSocket::SocketError error);
105 void pong(quint64 elapsedTime);
109 void processControlFrame(QWebSocketProtocol::OpCode opCode, QByteArray frame);
110 void processHandshake(QTcpSocket *pSocket);
111 void processStateChanged(QAbstractSocket::SocketState socketState);
114 Q_DISABLE_COPY(QWebSocketPrivate)
116 QWebSocket * const q_ptr;
118 QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol::Version version, QWebSocket *pWebSocket, QObject *parent = 0);
119 void setVersion(QWebSocketProtocol::Version version);
120 void setResourceName(QString resourceName);
121 void setRequestUrl(QUrl requestUrl);
122 void setOrigin(QString origin);
123 void setProtocol(QString protocol);
124 void setExtension(QString extension);
125 void enableMasking(bool enable);
126 void setSocketState(QAbstractSocket::SocketState state);
127 void setErrorString(QString errorString);
129 qint64 doWriteData(const QByteArray &data, bool isBinary);
130 qint64 doWriteFrames(const QByteArray &data, bool isBinary);
132 void makeConnections(const QTcpSocket *pTcpSocket);
133 void releaseConnections(const QTcpSocket *pTcpSocket);
135 QByteArray getFrameHeader(QWebSocketProtocol::OpCode opCode, quint64 payloadLength, quint32 maskingKey, bool lastFrame) const;
136 QString calculateAcceptKey(const QString &key) const;
137 QString createHandShakeRequest(QString resourceName,
144 static QWebSocket *upgradeFrom(QTcpSocket *tcpSocket,
145 const HandshakeRequest &request,
146 const HandshakeResponse &response,
147 QObject *parent = 0);
149 quint32 generateMaskingKey() const;
150 QByteArray generateKey() const;
151 quint32 generateRandomNumber() const;
152 qint64 writeFrames(const QList<QByteArray> &frames);
153 qint64 writeFrame(const QByteArray &frame);
155 QTcpSocket *m_pSocket;
156 QString m_errorString;
157 QWebSocketProtocol::Version m_version;
159 QString m_resourceName;
164 QAbstractSocket::SocketState m_socketState;
166 QByteArray m_key; //identification key used in handshake requests
168 bool m_mustMask; //a server must not mask the frames it sends
170 bool m_isClosingHandshakeSent;
171 bool m_isClosingHandshakeReceived;
175 DataProcessor m_dataProcessor;
178 friend class QWebSocketServerPrivate;
179 friend class QWebSocket;
184 #endif // QWEBSOCKET_H