2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "core/socket/stream/SocketConnection.h"
43#include "web/websocket/SocketContextUpgrade.h"
45#ifndef DOXYGEN_SHOULD_SKIP_THIS
47#include "utils/hexdump.h"
53 template <
typename SubProtocol,
typename Request,
typename Response>
58 : Super(socketConnection, socketContextUpgradeFactory)
62 template <
typename SubProtocol,
typename Request,
typename Response>
67 template <
typename SubProtocol,
typename Request,
typename Response>
73 template <
typename SubProtocol,
typename Request,
typename Response>
78 template <
typename SubProtocol,
typename Request,
typename Response>
83 template <
typename SubProtocol,
typename Request,
typename Response>
88 template <
typename SubProtocol,
typename Request,
typename Response>
93 template <
typename SubProtocol,
typename Request,
typename Response>
96 std::size_t closePayloadLength = reasonLength + 2;
97 char* closePayload =
new char[closePayloadLength];
99 *
reinterpret_cast<uint16_t*>(closePayload) = htobe16(statusCode);
101 if (reasonLength > 0) {
102 memcpy(closePayload + 2, reason, reasonLength);
105 sendClose(closePayload, closePayloadLength);
107 delete[] closePayload;
110 template <
typename SubProtocol,
typename Request,
typename Response>
123 template <
typename SubProtocol,
typename Request,
typename Response>
125 return web::http::SocketContextUpgrade<Request, Response>::getSocketConnection();
128 template <
typename SubProtocol,
typename Request,
typename Response>
145 template <
typename SubProtocol,
typename Request,
typename Response>
153 pongCloseData += std::string(chunk,
static_cast<std::size_t>(chunkLen));
156 std::size_t chunkOffset = 0;
159 std::size_t sendChunkLen =
160 (chunkLen - chunkOffset <= SIZE_MAX) ?
static_cast<std::size_t>(chunkLen - chunkOffset) : SIZE_MAX;
161 subProtocol->onMessageData(chunk + chunkOffset, sendChunkLen);
162 chunkOffset += sendChunkLen;
163 }
while (chunkLen - chunkOffset > 0);
168 template <
typename SubProtocol,
typename Request,
typename Response>
176 LOG(DEBUG) <<
getSocketConnection()->getConnectionName() <<
" WebSocket: Close request received - replying with close";
195 template <
typename SubProtocol,
typename Request,
typename Response>
201 template <
typename SubProtocol,
typename Request,
typename Response>
207 template <
typename SubProtocol,
typename Request,
typename Response>
213 template <
typename SubProtocol,
typename Request,
typename Response>
218 template <
typename SubProtocol,
typename Request,
typename Response>
void sendClose(uint16_t statusCode=1000, const char *reason=nullptr, std::size_t reasonLength=0) override
bool onSignal(int sig) override
void onDisconnected() override
void sendPing(const char *reason=nullptr, std::size_t reasonLength=0) override
~SocketContextUpgrade() override=default
void onMessageData(const char *chunk, uint64_t chunkLen) override
SocketContextUpgrade(const SocketContextUpgrade &)=delete
std::string pongCloseData
SocketContextUpgrade & operator=(const SocketContextUpgrade &)=delete
void sendMessage(uint8_t opCode, const char *message, std::size_t messageLength) override
SubProtocol * subProtocol
void onMessageEnd() override
void sendClose(const char *message, std::size_t messageLength) override
void sendMessageFrame(const char *message, std::size_t messageLength) override
void sendMessageEnd(const char *message, std::size_t messageLength) override
SocketContextUpgrade()=delete
std::size_t onReceivedFromPeer() override
SocketContextUpgrade(core::socket::stream::SocketConnection *socketConnection, web::http::SocketContextUpgradeFactory< Request, Response > *socketContextUpgradeFactory, Role role)
void sendPong(const char *reason=nullptr, std::size_t reasonLength=0) override
void sendMessageStart(uint8_t opCode, const char *message, std::size_t messageLength) override
void onMessageStart(int opCode) override
void onConnected() override
core::socket::stream::SocketConnection * getSocketConnection() override
void onMessageError(uint16_t errnum) override
SubProtocolFactory * select(const std::string &subProtocolName, Role role)
virtual std::size_t deleteSubProtocol(SubProtocol *subProtocol)
SubProtocol * createSubProtocol(SubProtocolContext *subProtocolContext)
void sendMessageEnd(const char *message, std::size_t messageLength)
void sendMessage(uint8_t opCode, const char *message, std::size_t messageLength)
void sendMessageStart(uint8_t opCode, const char *message, std::size_t messageLength)
void sendMessageFrame(const char *message, std::size_t messageLength)
~SocketContextUpgrade() override
web::websocket::SubProtocolFactory< SubProtocol > * subProtocolFactory
std::string loadSubProtocol(const std::string &subProtocolName)
SocketContextUpgrade(core::socket::stream::SocketConnection *socketConnection, web::http::SocketContextUpgradeFactory< web::http::client::Request, web::http::client::Response > *socketContextUpgradeFactory)
static SubProtocolFactorySelector * instance()
friend class web::websocket::SocketContextUpgrade
#define CLOSE_SOCKET_TIMEOUT