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>
114 <<
"' sending close to peer";
124 template <
typename SubProtocol,
typename Request,
typename Response>
126 Super::sendToPeer(message, messageLength);
129 template <
typename SubProtocol,
typename Request,
typename Response>
131 return Super::readFromPeer(chunk, chunkLen);
134 template <
typename SubProtocol,
typename Request,
typename Response>
139 template <
typename SubProtocol,
typename Request,
typename Response>
156 template <
typename SubProtocol,
typename Request,
typename Response>
164 pongCloseData += std::string(chunk,
static_cast<std::size_t>(chunkLen));
167 std::size_t chunkOffset = 0;
169 std::size_t sendChunkLen =
170 (chunkLen - chunkOffset <= SIZE_MAX) ?
static_cast<std::size_t>(chunkLen - chunkOffset) : SIZE_MAX;
171 subProtocol->onMessageData(chunk + chunkOffset, sendChunkLen);
172 chunkOffset += sendChunkLen;
173 }
while (chunkLen - chunkOffset > 0);
178 template <
typename SubProtocol,
typename Request,
typename Response>
185 <<
"' close confirmed from peer";
188 <<
"' close request received - replying with close";
209 template <
typename SubProtocol,
typename Request,
typename Response>
215 template <
typename SubProtocol,
typename Request,
typename Response>
221 template <
typename SubProtocol,
typename Request,
typename Response>
228 template <
typename SubProtocol,
typename Request,
typename Response>
233 template <
typename SubProtocol,
typename Request,
typename Response>
238 template <
typename SubProtocol,
typename Request,
typename Response>
243 template <
typename SubProtocol,
typename Request,
typename Response>
248 template <
typename SubProtocol,
typename Request,
typename Response>
250 return Super::getOnlineSince();
253 template <
typename SubProtocol,
typename Request,
typename Response>
255 return Super::getOnlineDuration();
std::size_t getPayloadTotalRead() const
void sendFrameChunk(const char *chunk, std::size_t chunkLen) const final
void sendClose(uint16_t statusCode=1000, const char *reason=nullptr, std::size_t reasonLength=0) override
std::size_t getPayloadTotalRead() const 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
std::size_t readFrameChunk(char *chunk, std::size_t chunkLen) const final
std::string getOnlineSince() const override
SubProtocol * subProtocol
void onMessageEnd() override
void sendClose(const char *message, std::size_t messageLength) override
core::socket::stream::SocketConnection * getSocketConnection() const 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)
std::string getOnlineDuration() const override
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
std::size_t getPayloadTotalSent() const override
void onMessageStart(int opCode) override
void onConnected() 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)
std::size_t getPayloadTotalSent() const
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