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 53 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 91 of file SocketContextUpgrade.h.

◆ Response

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

Definition at line 92 of file SocketContextUpgrade.h.

◆ SubProtocol

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

Definition at line 90 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 87 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 54 of file SocketContextUpgrade.hpp.

60 }
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 202 of file SocketContextUpgrade.hpp.

202 {
203 LOG(INFO) << getSocketConnection()->getConnectionName() << " WebSocket: connected";
204 subProtocol->onConnected();
205 }
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 208 of file SocketContextUpgrade.hpp.

208 {
209 subProtocol->onDisconnected();
210 LOG(INFO) << getSocketConnection()->getConnectionName() << " WebSocket: disconnected";
211 }

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 146 of file SocketContextUpgrade.hpp.

146 {
147 switch (receivedOpCode) {
149 [[fallthrough]];
151 [[fallthrough]];
153 pongCloseData += std::string(chunk, static_cast<std::size_t>(chunkLen));
154 break;
155 default:
156 std::size_t chunkOffset = 0;
157
158 do {
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);
164 break;
165 }
166 }

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 169 of file SocketContextUpgrade.hpp.

169 {
170 switch (receivedOpCode) {
172 if (closeSent) { // active close
173 closeSent = false;
174 LOG(DEBUG) << getSocketConnection()->getConnectionName() << " WebSocket: Close confirmed from peer";
175 } else { // passive close
176 LOG(DEBUG) << getSocketConnection()->getConnectionName() << " WebSocket: Close request received - replying with close";
177 sendClose(pongCloseData.data(), pongCloseData.length());
178 pongCloseData.clear();
180 }
181 break;
183 sendPong(pongCloseData.data(), pongCloseData.length());
184 pongCloseData.clear();
185 break;
187 subProtocol->onPongReceived();
188 break;
189 default:
190 subProtocol->onMessageEnd();
191 break;
192 }
193 }
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 196 of file SocketContextUpgrade.hpp.

196 {
197 subProtocol->onMessageError(errnum);
198 sendClose(errnum);
199 }

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 129 of file SocketContextUpgrade.hpp.

129 {
131
132 switch (opCode) {
134 [[fallthrough]];
136 [[fallthrough]];
138 break;
139 default:
140 subProtocol->onMessageStart(opCode);
141 break;
142 }
143 }

◆ 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 219 of file SocketContextUpgrade.hpp.

219 {
220 return Receiver::receive();
221 }
std::size_t receive()
Definition Receiver.cpp:65

◆ 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 111 of file SocketContextUpgrade.hpp.

111 {
112 if (!closeSent) {
113 LOG(DEBUG) << this->getSocketConnection()->getConnectionName() << " WebSocket: Sending close to peer";
114
115 sendMessage(8, message, messageLength);
116
118
119 closeSent = true;
120 }
121 }
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 95 of file SocketContextUpgrade.hpp.

95 {
96 std::size_t closePayloadLength = reasonLength + 2;
97 char* closePayload = new char[closePayloadLength];
98
99 *reinterpret_cast<uint16_t*>(closePayload) = htobe16(statusCode); // cppcheck-suppress uninitdata
100
101 if (reasonLength > 0) {
102 memcpy(closePayload + 2, reason, reasonLength);
103 }
104
105 sendClose(closePayload, closePayloadLength);
106
107 delete[] closePayload;
108 }

◆ 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 63 of file SocketContextUpgrade.hpp.

63 {
64 Transmitter::sendMessage(opCode, message, messageLength);
65 }
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 79 of file SocketContextUpgrade.hpp.

79 {
80 Transmitter::sendMessageEnd(message, messageLength);
81 }
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 74 of file SocketContextUpgrade.hpp.

74 {
75 Transmitter::sendMessageFrame(message, messageLength);
76 }
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 69 of file SocketContextUpgrade.hpp.

69 {
70 Transmitter::sendMessageStart(opCode, message, messageLength);
71 }
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 84 of file SocketContextUpgrade.hpp.

84 {
85 sendMessage(9, reason, reasonLength);
86 }

◆ 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 89 of file SocketContextUpgrade.hpp.

89 {
90 sendMessage(10, reason, reasonLength);
91 }

Member Data Documentation

◆ pongCloseData

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

Definition at line 143 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: