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"
55 template <
typename SubProtocol,
typename Request,
typename Response>
60 :
Super(socketConnection, socketContextUpgradeFactory)
64 template <
typename SubProtocol,
typename Request,
typename Response>
69 template <
typename SubProtocol,
typename Request,
typename Response>
75 template <
typename SubProtocol,
typename Request,
typename Response>
80 template <
typename SubProtocol,
typename Request,
typename Response>
85 template <
typename SubProtocol,
typename Request,
typename Response>
90 template <
typename SubProtocol,
typename Request,
typename Response>
95 template <
typename SubProtocol,
typename Request,
typename Response>
98 const std::size_t closePayloadLength = reasonLength + 2;
99 std::vector<
char> closePayload(closePayloadLength);
102 const uint16_t beStatus = htobe16(statusCode);
103 std::memcpy(closePayload.data(), &beStatus,
sizeof(beStatus));
105 if (reasonLength > 0) {
106 std::memcpy(closePayload.data() + 2, reason, reasonLength);
109 sendClose(closePayload.data(), closePayloadLength);
112 template <
typename SubProtocol,
typename Request,
typename Response>
116 <<
"' sending close to peer";
126 template <
typename SubProtocol,
typename Request,
typename Response>
128 Super::sendToPeer(message, messageLength);
131 template <
typename SubProtocol,
typename Request,
typename Response>
133 return Super::readFromPeer(chunk, chunkLen);
136 template <
typename SubProtocol,
typename Request,
typename Response>
141 template <
typename SubProtocol,
typename Request,
typename Response>
158 template <
typename SubProtocol,
typename Request,
typename Response>
166 pongCloseData += std::string(chunk,
static_cast<std::size_t>(chunkLen));
169 std::size_t chunkOffset = 0;
171 std::size_t sendChunkLen =
172 (chunkLen - chunkOffset <= SIZE_MAX) ?
static_cast<std::size_t>(chunkLen - chunkOffset) : SIZE_MAX;
173 subProtocol->onMessageData(chunk + chunkOffset, sendChunkLen);
174 chunkOffset += sendChunkLen;
175 }
while (chunkLen - chunkOffset > 0);
180 template <
typename SubProtocol,
typename Request,
typename Response>
187 <<
"' close confirmed from peer";
192 <<
"' close request received - replying with close";
211 template <
typename SubProtocol,
typename Request,
typename Response>
217 template <
typename SubProtocol,
typename Request,
typename Response>
223 template <
typename SubProtocol,
typename Request,
typename Response>
230 template <
typename SubProtocol,
typename Request,
typename Response>
235 template <
typename SubProtocol,
typename Request,
typename Response>
240 template <
typename SubProtocol,
typename Request,
typename Response>
245 template <
typename SubProtocol,
typename Request,
typename Response>
250 template <
typename SubProtocol,
typename Request,
typename Response>
252 return Super::getOnlineSince();
255 template <
typename SubProtocol,
typename Request,
typename Response>
257 return Super::getOnlineDuration();
std::size_t getPayloadTotalRead() const
web::http::SocketContextUpgrade< RequestT, ResponseT > Super
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()
#define CLOSE_SOCKET_TIMEOUT