SNode.C
Loading...
Searching...
No Matches
web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT > Class Template Reference

#include <SocketContextUpgrade.h>

Inheritance diagram for web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >:
Collaboration diagram for web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >:

Public Types

using SubProtocol = SubProtocolT
 
using Request = RequestT
 
using Response = ResponseT
 
- Public Types inherited from web::websocket::SubProtocolContext
enum  OpCode {
  CONTINUATION = 0x00 , TEXT = 0x01 , BINARY = 0x02 , CLOSE = 0x08 ,
  PING = 0x09 , PONG = 0x0A
}
 

Public Member Functions

 SocketContextUpgrade ()=delete
 
 SocketContextUpgrade (const SocketContextUpgrade &)=delete
 
SocketContextUpgradeoperator= (const SocketContextUpgrade &)=delete
 
 ~SocketContextUpgrade () override=default
 
- Public Member Functions inherited from core::socket::stream::SocketContext
 SocketContext (core::socket::stream::SocketConnection *socketConnection)
 
void sendToPeer (const char *chunk, std::size_t chunkLen) const final
 
bool streamToPeer (core::pipe::Source *source) const
 
void streamEof ()
 
std::size_t readFromPeer (char *chunk, std::size_t chunklen) const final
 
void setTimeout (const utils::Timeval &timeout) final
 
void shutdownRead ()
 
void shutdownWrite (bool forceClose=false)
 
void close () override
 
SocketConnectiongetSocketConnection () const
 
virtual void switchSocketContext (SocketContext *newSocketContext)
 
void sendToPeer (const std::string &data) const
 
- Public Member Functions inherited from core::socket::SocketContext
 SocketContext (const SocketContext &)=delete
 
 SocketContext (SocketContext &&)=delete
 
SocketContextoperator= (const SocketContext &)=delete
 
SocketContextoperator= (SocketContext &&)=delete
 
void sendToPeer (const std::string &data) const
 
- Public Member Functions inherited from web::websocket::SubProtocolContext
 SubProtocolContext (core::socket::stream::SocketConnection *socketConnection, bool role)
 
 SubProtocolContext (const SubProtocolContext &)=delete
 
 ~SubProtocolContext () override
 
SubProtocolContextoperator= (const SubProtocolContext &)=delete
 

Protected Types

enum class  Role { SERVER , CLIENT }
 
- Protected Types inherited from web::http::SocketContextUpgrade< RequestT, ResponseT >
using Request = RequestT
 
using Response = ResponseT
 
using SocketContextUpgradeFactory = web::http::SocketContextUpgradeFactory<Request, Response>
 

Protected Member Functions

 SocketContextUpgrade (core::socket::stream::SocketConnection *socketConnection, web::http::SocketContextUpgradeFactory< Request, Response > *socketContextUpgradeFactory, Role role)
 
- Protected Member Functions inherited from web::http::SocketContextUpgrade< RequestT, ResponseT >
 SocketContextUpgrade (core::socket::stream::SocketConnection *socketConnection, SocketContextUpgradeFactory *socketContextUpgradeFactory)
 
 ~SocketContextUpgrade () override
 
- Protected Member Functions inherited from core::socket::stream::SocketContext
void onWriteError (int errnum) override
 
void onReadError (int errnum) override
 
- Protected Member Functions inherited from core::socket::SocketContext
 SocketContext ()=default
 
virtual ~SocketContext ()
 
- Protected Member Functions inherited from web::websocket::Receiver
 Receiver (core::socket::stream::SocketConnection *socketConnection)
 
 Receiver (const Receiver &)=delete
 
Receiveroperator= (const Receiver &)=delete
 
virtual ~Receiver ()
 
std::size_t receive ()
 
- Protected Member Functions inherited from web::websocket::Transmitter
 Transmitter (core::socket::stream::SocketConnection *socketConnection, bool masking)
 
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)
 
void sendMessageEnd (const char *message, std::size_t messageLength)
 
 Transmitter ()=delete
 
 Transmitter (const Transmitter &)=delete
 
Transmitteroperator= (const Transmitter &)=delete
 
virtual ~Transmitter ()
 

Protected Attributes

SubProtocolsubProtocol = nullptr
 
- Protected Attributes inherited from web::websocket::Transmitter
bool closeSent = false
 

Private Types

using Super = web::http::SocketContextUpgrade<RequestT, ResponseT>
 

Private Member Functions

void sendMessage (uint8_t opCode, const char *message, std::size_t messageLength) override
 
void sendMessageStart (uint8_t opCode, 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
 
void sendPing (const char *reason=nullptr, std::size_t reasonLength=0) override
 
void sendPong (const char *reason=nullptr, std::size_t reasonLength=0) override
 
void sendClose (uint16_t statusCode=1000, const char *reason=nullptr, std::size_t reasonLength=0) override
 
void sendClose (const char *message, std::size_t messageLength) override
 
core::socket::stream::SocketConnectiongetSocketConnection () override
 
void onMessageStart (int opCode) override
 
void onMessageData (const char *chunk, uint64_t chunkLen) override
 
void onMessageEnd () override
 
void onMessageError (uint16_t errnum) override
 
void onConnected () override
 
void onDisconnected () override
 
bool onSignal (int sig) override
 
std::size_t onReceivedFromPeer () override
 

Private Attributes

int receivedOpCode = 0
 
std::string pongCloseData
 

Detailed Description

template<typename SubProtocolT, typename RequestT, typename ResponseT>
class web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >

Definition at line 31 of file SubProtocol.h.

Member Typedef Documentation

◆ Request

template<typename SubProtocolT , typename RequestT , typename ResponseT >
using web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::Request = RequestT

Definition at line 69 of file SocketContextUpgrade.h.

◆ Response

template<typename SubProtocolT , typename RequestT , typename ResponseT >
using web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::Response = ResponseT

Definition at line 70 of file SocketContextUpgrade.h.

◆ SubProtocol

template<typename SubProtocolT , typename RequestT , typename ResponseT >
using web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::SubProtocol = SubProtocolT

Definition at line 68 of file SocketContextUpgrade.h.

◆ Super

template<typename SubProtocolT , typename RequestT , typename ResponseT >
using web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::Super = web::http::SocketContextUpgrade<RequestT, ResponseT>
private

Definition at line 65 of file SocketContextUpgrade.h.

Member Enumeration Documentation

◆ Role

template<typename SubProtocolT , typename RequestT , typename ResponseT >
enum class web::websocket::SocketContextUpgrade::Role
strongprotected

Constructor & Destructor Documentation

◆ SocketContextUpgrade() [1/3]

template<typename SubProtocolT , typename RequestT , typename ResponseT >
web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::SocketContextUpgrade ( )
delete

◆ SocketContextUpgrade() [2/3]

template<typename SubProtocolT , typename RequestT , typename ResponseT >
web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::SocketContextUpgrade ( const SocketContextUpgrade< SubProtocolT, RequestT, ResponseT > & )
delete

◆ SocketContextUpgrade() [3/3]

template<typename SubProtocol , typename Request , typename Response >
web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::SocketContextUpgrade ( core::socket::stream::SocketConnection * socketConnection,
web::http::SocketContextUpgradeFactory< Request, Response > * socketContextUpgradeFactory,
Role role )
protected

Definition at line 32 of file SocketContextUpgrade.hpp.

38 }
core::socket::stream::SocketConnection * socketConnection
SocketContextUpgradeFactory * socketContextUpgradeFactory
web::http::SocketContextUpgrade< RequestT, ResponseT > Super
SubProtocolContext(core::socket::stream::SocketConnection *socketConnection, bool role)

◆ ~SocketContextUpgrade()

template<typename SubProtocolT , typename RequestT , typename ResponseT >
web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::~SocketContextUpgrade ( )
overridedefault

Member Function Documentation

◆ getSocketConnection()

template<typename SubProtocol , typename Request , typename Response >
core::socket::stream::SocketConnection * web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::getSocketConnection ( )
overrideprivatevirtual

◆ onConnected()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::onConnected ( )
overrideprivatevirtual

Implements core::socket::stream::SocketContext.

Definition at line 180 of file SocketContextUpgrade.hpp.

180 {
181 LOG(INFO) << getSocketConnection()->getConnectionName() << " WebSocket: connected";
182 subProtocol->onConnected();
183 }
const std::string & getConnectionName() const
core::socket::stream::SocketConnection * getSocketConnection() override

References web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::subProtocol.

◆ onDisconnected()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::onDisconnected ( )
overrideprivatevirtual

Implements core::socket::stream::SocketContext.

Definition at line 186 of file SocketContextUpgrade.hpp.

186 {
187 subProtocol->onDisconnected();
188 LOG(INFO) << getSocketConnection()->getConnectionName() << " WebSocket: disconnected";
189 }

References web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::subProtocol.

◆ onMessageData()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::onMessageData ( const char * chunk,
uint64_t chunkLen )
overrideprivatevirtual

Implements web::websocket::Receiver.

Definition at line 124 of file SocketContextUpgrade.hpp.

124 {
125 switch (receivedOpCode) {
127 [[fallthrough]];
129 [[fallthrough]];
131 pongCloseData += std::string(chunk, static_cast<std::size_t>(chunkLen));
132 break;
133 default:
134 std::size_t chunkOffset = 0;
135
136 do {
137 std::size_t sendChunkLen =
138 (chunkLen - chunkOffset <= SIZE_MAX) ? static_cast<std::size_t>(chunkLen - chunkOffset) : SIZE_MAX;
139 subProtocol->onMessageData(chunk + chunkOffset, sendChunkLen);
140 chunkOffset += sendChunkLen;
141 } while (chunkLen - chunkOffset > 0);
142 break;
143 }
144 }

References web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::receivedOpCode.

◆ onMessageEnd()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::onMessageEnd ( )
overrideprivatevirtual

Implements web::websocket::Receiver.

Definition at line 147 of file SocketContextUpgrade.hpp.

147 {
148 switch (receivedOpCode) {
150 if (closeSent) { // active close
151 closeSent = false;
152 LOG(DEBUG) << getSocketConnection()->getConnectionName() << " WebSocket: Close confirmed from peer";
153 } else { // passive close
154 LOG(DEBUG) << getSocketConnection()->getConnectionName() << " WebSocket: Close request received - replying with close";
155 sendClose(pongCloseData.data(), pongCloseData.length());
156 pongCloseData.clear();
158 }
159 break;
161 sendPong(pongCloseData.data(), pongCloseData.length());
162 pongCloseData.clear();
163 break;
165 subProtocol->onPongReceived();
166 break;
167 default:
168 subProtocol->onMessageEnd();
169 break;
170 }
171 }
void shutdownWrite(bool forceClose=false)
void sendClose(uint16_t statusCode=1000, const char *reason=nullptr, std::size_t reasonLength=0) override
void sendPong(const char *reason=nullptr, std::size_t reasonLength=0) override

References web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::receivedOpCode, and web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::subProtocol.

◆ onMessageError()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::onMessageError ( uint16_t errnum)
overrideprivatevirtual

Implements web::websocket::Receiver.

Definition at line 174 of file SocketContextUpgrade.hpp.

174 {
175 subProtocol->onMessageError(errnum);
176 sendClose(errnum);
177 }

References web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::subProtocol.

◆ onMessageStart()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::onMessageStart ( int opCode)
overrideprivatevirtual

Implements web::websocket::Receiver.

Definition at line 107 of file SocketContextUpgrade.hpp.

107 {
109
110 switch (opCode) {
112 [[fallthrough]];
114 [[fallthrough]];
116 break;
117 default:
118 subProtocol->onMessageStart(opCode);
119 break;
120 }
121 }

◆ onReceivedFromPeer()

template<typename SubProtocol , typename Request , typename Response >
std::size_t web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::onReceivedFromPeer ( )
overrideprivatevirtual

Implements core::socket::SocketContext.

Definition at line 197 of file SocketContextUpgrade.hpp.

197 {
198 return Receiver::receive();
199 }
std::size_t receive()
Definition Receiver.cpp:43

◆ onSignal()

template<typename SubProtocol , typename Request , typename Response >
bool web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::onSignal ( int sig)
overrideprivatevirtual

◆ operator=()

template<typename SubProtocolT , typename RequestT , typename ResponseT >
SocketContextUpgrade & web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::operator= ( const SocketContextUpgrade< SubProtocolT, RequestT, ResponseT > & )
delete

◆ sendClose() [1/2]

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::sendClose ( const char * message,
std::size_t messageLength )
overrideprivatevirtual

Implements web::websocket::SubProtocolContext.

Definition at line 89 of file SocketContextUpgrade.hpp.

89 {
90 if (!closeSent) {
91 LOG(DEBUG) << this->getSocketConnection()->getConnectionName() << " WebSocket: Sending close to peer";
92
93 sendMessage(8, message, messageLength);
94
96
97 closeSent = true;
98 }
99 }
void setTimeout(const utils::Timeval &timeout) final
void sendMessage(uint8_t opCode, const char *message, std::size_t messageLength) override
#define CLOSE_SOCKET_TIMEOUT

◆ sendClose() [2/2]

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::sendClose ( uint16_t statusCode = 1000,
const char * reason = nullptr,
std::size_t reasonLength = 0 )
overrideprivatevirtual

Implements web::websocket::SubProtocolContext.

Definition at line 73 of file SocketContextUpgrade.hpp.

73 {
74 std::size_t closePayloadLength = reasonLength + 2;
75 char* closePayload = new char[closePayloadLength];
76
77 *reinterpret_cast<uint16_t*>(closePayload) = htobe16(statusCode); // cppcheck-suppress uninitdata
78
79 if (reasonLength > 0) {
80 memcpy(closePayload + 2, reason, reasonLength);
81 }
82
83 sendClose(closePayload, closePayloadLength);
84
85 delete[] closePayload;
86 }

◆ sendMessage()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::sendMessage ( uint8_t opCode,
const char * message,
std::size_t messageLength )
overrideprivatevirtual

Implements web::websocket::SubProtocolContext.

Definition at line 41 of file SocketContextUpgrade.hpp.

41 {
42 Transmitter::sendMessage(opCode, message, messageLength);
43 }
void sendMessage(uint8_t opCode, const char *message, std::size_t messageLength)

◆ sendMessageEnd()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::sendMessageEnd ( const char * message,
std::size_t messageLength )
overrideprivatevirtual

Implements web::websocket::SubProtocolContext.

Definition at line 57 of file SocketContextUpgrade.hpp.

57 {
58 Transmitter::sendMessageEnd(message, messageLength);
59 }
void sendMessageEnd(const char *message, std::size_t messageLength)

◆ sendMessageFrame()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::sendMessageFrame ( const char * message,
std::size_t messageLength )
overrideprivatevirtual

Implements web::websocket::SubProtocolContext.

Definition at line 52 of file SocketContextUpgrade.hpp.

52 {
53 Transmitter::sendMessageFrame(message, messageLength);
54 }
void sendMessageFrame(const char *message, std::size_t messageLength)

◆ sendMessageStart()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::sendMessageStart ( uint8_t opCode,
const char * message,
std::size_t messageLength )
overrideprivatevirtual

Implements web::websocket::SubProtocolContext.

Definition at line 47 of file SocketContextUpgrade.hpp.

47 {
48 Transmitter::sendMessageStart(opCode, message, messageLength);
49 }
void sendMessageStart(uint8_t opCode, const char *message, std::size_t messageLength)

◆ sendPing()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::sendPing ( const char * reason = nullptr,
std::size_t reasonLength = 0 )
overrideprivatevirtual

Implements web::websocket::SubProtocolContext.

Definition at line 62 of file SocketContextUpgrade.hpp.

62 {
63 sendMessage(9, reason, reasonLength);
64 }

◆ sendPong()

template<typename SubProtocol , typename Request , typename Response >
void web::websocket::SocketContextUpgrade< SubProtocol, Request, Response >::sendPong ( const char * reason = nullptr,
std::size_t reasonLength = 0 )
overrideprivatevirtual

Implements web::websocket::SubProtocolContext.

Definition at line 67 of file SocketContextUpgrade.hpp.

67 {
68 sendMessage(10, reason, reasonLength);
69 }

Member Data Documentation

◆ pongCloseData

template<typename SubProtocolT , typename RequestT , typename ResponseT >
std::string web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::pongCloseData
private

Definition at line 121 of file SocketContextUpgrade.h.

◆ receivedOpCode

template<typename SubProtocolT , typename RequestT , typename ResponseT >
int web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::receivedOpCode = 0
private

◆ subProtocol


The documentation for this class was generated from the following files: