There was no '?' between path and query. Bug detected by someone on the internet.
[contrib/qtwebsockets.git] / src / qwebsocket_p.h
1 /*
2 QWebSockets implements the WebSocket protocol as defined in RFC 6455.
3 Copyright (C) 2013 Kurt Pattyn (pattyn.kurt@gmail.com)
4
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.
9
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.
14
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
18 */
19
20 #ifndef QWEBSOCKET_P_H
21 #define QWEBSOCKET_P_H
22 //
23 //  W A R N I N G
24 //  -------------
25 //
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.
29 //
30 // We mean it.
31 //
32
33 #include <QUrl>
34 #include <QAbstractSocket>
35 #include <QHostAddress>
36 #ifndef QT_NO_NETWORKPROXY
37 #include <QNetworkProxy>
38 #endif
39 #include <QTime>
40 #include "qwebsocketsglobal.h"
41 #include "qwebsocketprotocol.h"
42 #include "dataprocessor_p.h"
43
44 QT_BEGIN_NAMESPACE
45
46 class HandshakeRequest;
47 class HandshakeResponse;
48 class QTcpSocket;
49 class QWebSocket;
50
51 class QWebSocketPrivate:public QObject
52 {
53     Q_OBJECT
54
55 public:
56     explicit QWebSocketPrivate(const QString &origin,
57                                QWebSocketProtocol::Version version,
58                                QWebSocket * const pWebSocket,
59                                QObject *parent = 0);
60     virtual ~QWebSocketPrivate();
61
62     void abort();
63     QAbstractSocket::SocketError error() const;
64     QString errorString() const;
65     bool flush();
66     bool isValid() const;
67     QHostAddress localAddress() const;
68     quint16 localPort() const;
69     QAbstractSocket::PauseModes pauseMode() const;
70     QHostAddress peerAddress() const;
71     QString peerName() const;
72     quint16 peerPort() const;
73 #ifndef QT_NO_NETWORKPROXY
74     QNetworkProxy proxy() const;
75     void setProxy(const QNetworkProxy &networkProxy);
76 #endif
77     qint64 readBufferSize() const;
78     void resume();
79     void setPauseMode(QAbstractSocket::PauseModes pauseMode);
80     void setReadBufferSize(qint64 size);
81     void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value);
82     QVariant socketOption(QAbstractSocket::SocketOption option);
83     QAbstractSocket::SocketState state() const;
84
85     bool waitForConnected(int msecs);
86     bool waitForDisconnected(int msecs);
87
88     QWebSocketProtocol::Version version() const;
89     QString resourceName() const;
90     QUrl requestUrl() const;
91     QString origin() const;
92     QString protocol() const;
93     QString extension() const;
94
95     qint64 write(const char *message);          //send data as text
96     qint64 write(const char *message, qint64 maxSize);          //send data as text
97     qint64 write(const QString &message);       //send data as text
98     qint64 write(const QByteArray &data);       //send data as binary
99
100 public Q_SLOTS:
101     void close(QWebSocketProtocol::CloseCode closeCode, QString reason);
102     void open(const QUrl &url, bool mask);
103     void ping(const QByteArray &payload);
104
105 private Q_SLOTS:
106     void processData();
107     void processPing(QByteArray data);
108     void processPong(QByteArray data);
109     void processClose(QWebSocketProtocol::CloseCode closeCode, QString closeReason);
110     void processHandshake(QTcpSocket *pSocket);
111     void processStateChanged(QAbstractSocket::SocketState socketState);
112
113 private:
114     Q_DISABLE_COPY(QWebSocketPrivate)
115     Q_DECLARE_PUBLIC(QWebSocket)
116
117     QWebSocket * const q_ptr;
118
119     QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol::Version version, QWebSocket *pWebSocket, QObject *parent = 0);
120     void setVersion(QWebSocketProtocol::Version version);
121     void setResourceName(const QString &resourceName);
122     void setRequestUrl(const QUrl &requestUrl);
123     void setOrigin(const QString &origin);
124     void setProtocol(const QString &protocol);
125     void setExtension(const QString &extension);
126     void enableMasking(bool enable);
127     void setSocketState(QAbstractSocket::SocketState state);
128     void setErrorString(const QString &errorString);
129
130     qint64 doWriteData(const QByteArray &data, bool isBinary);
131     qint64 doWriteFrames(const QByteArray &data, bool isBinary);
132
133     void makeConnections(const QTcpSocket *pTcpSocket);
134     void releaseConnections(const QTcpSocket *pTcpSocket);
135
136     QByteArray getFrameHeader(QWebSocketProtocol::OpCode opCode, quint64 payloadLength, quint32 maskingKey, bool lastFrame) const;
137     QString calculateAcceptKey(const QString &key) const;
138     QString createHandShakeRequest(QString resourceName,
139                                    QString host,
140                                    QString origin,
141                                    QString extensions,
142                                    QString protocols,
143                                    QByteArray key);
144
145     static QWebSocket *upgradeFrom(QTcpSocket *tcpSocket,
146                                    const HandshakeRequest &request,
147                                    const HandshakeResponse &response,
148                                    QObject *parent = 0);
149
150     quint32 generateMaskingKey() const;
151     QByteArray generateKey() const;
152     quint32 generateRandomNumber() const;
153     qint64 writeFrames(const QList<QByteArray> &frames);
154     qint64 writeFrame(const QByteArray &frame);
155
156     QTcpSocket *m_pSocket;
157     QString m_errorString;
158     QWebSocketProtocol::Version m_version;
159     QUrl m_resource;
160     QString m_resourceName;
161     QUrl m_requestUrl;
162     QString m_origin;
163     QString m_protocol;
164     QString m_extension;
165     QAbstractSocket::SocketState m_socketState;
166
167     QByteArray m_key;   //identification key used in handshake requests
168
169     bool m_mustMask;    //a server must not mask the frames it sends
170
171     bool m_isClosingHandshakeSent;
172     bool m_isClosingHandshakeReceived;
173
174     QTime m_pingTimer;
175
176     DataProcessor m_dataProcessor;
177
178     friend class QWebSocketServerPrivate;
179 };
180
181 QT_END_NAMESPACE
182
183 #endif // QWEBSOCKET_H