CppServer 1.0.6.0
C++ Server Library
Loading...
Searching...
No Matches
ws_session.cpp
Go to the documentation of this file.
1
8
10#include "server/ws/ws_server.h"
11
12namespace CppServer {
13namespace WS {
14
15WSSession::WSSession(const std::shared_ptr<WSServer>& server)
17{
18}
19
21{
22 // Disconnecting WebSocket
24 {
26 }
27}
28
30{
31 // Disconnect WebSocket
33 {
34 _ws_handshaked = false;
36 }
37
38 // Reset WebSocket upgrade HTTP request and response
39 _request.Clear();
40 _response.Clear();
41
42 // Clear WebSocket send/receive buffers
44
45 // Initialize new WebSocket random nonce
47}
48
49void WSSession::onReceived(const void* buffer, size_t size)
50{
51 // Check for WebSocket handshaked status
53 {
54 // Prepare receive frame
55 PrepareReceiveFrame(buffer, size);
56 return;
57 }
58
59 HTTPSession::onReceived(buffer, size);
60}
61
63{
64 // Check for WebSocket handshaked status
66 return;
67
68 // Try to perform WebSocket upgrade
69 if (!PerformServerUpgrade(request, response()))
70 {
71 HTTPSession::onReceivedRequestHeader(request);
72 return;
73 }
74}
75
77{
78 // Check for WebSocket handshaked status
80 {
81 // Prepare receive frame from the remaining request body
82 auto body = _request.body();
83 PrepareReceiveFrame(body.data(), body.size());
84 return;
85 }
86
87 HTTPSession::onReceivedRequest(request);
88}
89
90void WSSession::onReceivedRequestError(const HTTP::HTTPRequest& request, const std::string& error)
91{
92 // Check for WebSocket handshaked status
94 {
95 onError(asio::error::fault, "WebSocket error", error);
96 return;
97 }
98
99 HTTPSession::onReceivedRequestError(request, error);
100}
101
103{
104 std::string result;
105
106 if (!_ws_handshaked)
107 return result;
108
109 std::vector<uint8_t> cache;
110
111 // Receive WebSocket frame data
112 while (!_ws_final_received)
113 {
114 while (!_ws_frame_received)
115 {
116 size_t required = RequiredReceiveFrameSize();
117 cache.resize(required);
118 size_t received = HTTPSession::Receive(cache.data(), required);
119 if (received != required)
120 return result;
121 PrepareReceiveFrame(cache.data(), received);
122 }
124 PrepareReceiveFrame(nullptr, 0);
125 }
126
127 // Copy WebSocket frame data
129 PrepareReceiveFrame(nullptr, 0);
130 return result;
131}
132
133std::string WSSession::ReceiveText(const CppCommon::Timespan& timeout)
134{
135 std::string result;
136
137 if (!_ws_handshaked)
138 return result;
139
140 std::vector<uint8_t> cache;
141
142 // Receive WebSocket frame data
143 while (!_ws_final_received)
144 {
145 while (!_ws_frame_received)
146 {
147 size_t required = RequiredReceiveFrameSize();
148 cache.resize(required);
149 size_t received = HTTPSession::Receive(cache.data(), required, timeout);
150 if (received != required)
151 return result;
152 PrepareReceiveFrame(cache.data(), received);
153 }
155 PrepareReceiveFrame(nullptr, 0);
156 }
157
158 // Copy WebSocket frame data
160 PrepareReceiveFrame(nullptr, 0);
161 return result;
162}
163
164std::vector<uint8_t> WSSession::ReceiveBinary()
165{
166 std::vector<uint8_t> result;
167
168 if (!_ws_handshaked)
169 return result;
170
171 std::vector<uint8_t> cache;
172
173 // Receive WebSocket frame data
174 while (!_ws_final_received)
175 {
176 while (!_ws_frame_received)
177 {
178 size_t required = RequiredReceiveFrameSize();
179 cache.resize(required);
180 size_t received = HTTPSession::Receive(cache.data(), required);
181 if (received != required)
182 return result;
183 PrepareReceiveFrame(cache.data(), received);
184 }
186 PrepareReceiveFrame(nullptr, 0);
187 }
188
189 // Copy WebSocket frame data
191 PrepareReceiveFrame(nullptr, 0);
192 return result;
193}
194
195std::vector<uint8_t> WSSession::ReceiveBinary(const CppCommon::Timespan& timeout)
196{
197 std::vector<uint8_t> result;
198
199 if (!_ws_handshaked)
200 return result;
201
202 std::vector<uint8_t> cache;
203
204 // Receive WebSocket frame data
205 while (!_ws_final_received)
206 {
207 while (!_ws_frame_received)
208 {
209 size_t required = RequiredReceiveFrameSize();
210 cache.resize(required);
211 size_t received = HTTPSession::Receive(cache.data(), required, timeout);
212 if (received != required)
213 return result;
214 PrepareReceiveFrame(cache.data(), received);
215 }
217 PrepareReceiveFrame(nullptr, 0);
218 }
219
220 // Copy WebSocket frame data
222 PrepareReceiveFrame(nullptr, 0);
223 return result;
224}
225
226} // namespace WS
227} // namespace CppServer
std::shared_ptr< TCPServer > & server() noexcept
Get the server.
Definition tcp_session.h:48
virtual void onError(int error, const std::string &category, const std::string &message)
Handle error notification.
HTTPRequest _request
HTTP request.
HTTPSession(const std::shared_ptr< HTTPServer > &server)
HTTPResponse _response
HTTP response.
CppCommon::FileCache & cache() noexcept
Get the static content cache.
HTTPResponse & response() noexcept
Get the HTTP response.
void onReceived(const void *buffer, size_t size) override
Handle buffer received notification.
std::vector< uint8_t > ReceiveBinary()
void onReceivedRequest(const HTTP::HTTPRequest &request) override
Handle HTTP request received notification.
void onReceivedRequestHeader(const HTTP::HTTPRequest &request) override
Handle HTTP request header received notification.
void onDisconnecting() override
Handle session disconnecting notification.
void onReceivedRequestError(const HTTP::HTTPRequest &request, const std::string &error) override
Handle HTTP request error notification.
void onDisconnected() override
Handle session disconnected notification.
WSSession(const std::shared_ptr< WSServer > &server)
size_t _ws_payload_size
Received frame payload size.
Definition ws.h:182
bool _ws_frame_received
Received frame flag.
Definition ws.h:176
void InitWSNonce()
Initialize WebSocket random nonce.
Definition ws.cpp:21
void PrepareReceiveFrame(const void *buffer, size_t size)
Prepare WebSocket receive frame.
Definition ws.cpp:275
std::vector< uint8_t > _ws_receive_final_buffer
Receive final buffer.
Definition ws.h:186
void ClearWSBuffers()
Clear WebSocket send/receive buffers.
Definition ws.cpp:486
size_t RequiredReceiveFrameSize()
Required WebSocket receive frame size.
Definition ws.cpp:460
bool _ws_final_received
Received final flag.
Definition ws.h:178
virtual void onWSDisconnecting()
Handle WebSocket disconnecting notification.
Definition ws.h:132
size_t _ws_header_size
Received frame header size.
Definition ws.h:180
virtual void onWSDisconnected()
Handle WebSocket disconnected notification.
Definition ws.h:134
bool PerformServerUpgrade(const HTTP::HTTPRequest &request, HTTP::HTTPResponse &response)
Perform WebSocket server upgrade.
Definition ws.cpp:103
bool _ws_handshaked
Handshaked flag.
Definition ws.h:171
HTTP definitions.
WebSocket definitions.
C++ Server project definitions.
Definition asio.h:56
WebSocket server definition.
WebSocket session definition.