SNode.C
Loading...
Searching...
No Matches
core::socket::stream::SocketContext Class Referenceabstract

#include <SocketContext.h>

Inheritance diagram for core::socket::stream::SocketContext:
Collaboration diagram for core::socket::stream::SocketContext:

Public Member Functions

 SocketContext (core::socket::stream::SocketConnection *socketConnection)
 
 ~SocketContext () override
 
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
 
std::size_t getTotalSent () const override
 
std::size_t getTotalQueued () const override
 
std::size_t getTotalRead () const override
 
std::size_t getTotalProcessed () const override
 
std::string getOnlineSince () const override
 
std::string getOnlineDuration () const override
 
SocketConnectiongetSocketConnection () const
 
virtual void switchSocketContext (SocketContext *newSocketContext)
 
virtual std::size_t readFromPeer (char *chunk, std::size_t chunklen) const=0
 
void sendToPeer (const std::string &data) const
 
virtual void sendToPeer (const char *chunk, std::size_t chunkLen) const=0
 
- 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
 

Protected Member Functions

void onWriteError (int errnum) override
 
void onReadError (int errnum) override
 
void readFromPeer (std::size_t available)
 
- Protected Member Functions inherited from core::socket::SocketContext
 SocketContext ()=default
 
virtual std::size_t onReceivedFromPeer ()=0
 
virtual bool onSignal (int sig)=0
 

Private Types

using Super = core::socket::SocketContext
 

Private Member Functions

virtual void onConnected ()=0
 
virtual void onDisconnected ()=0
 
virtual void attach ()
 
virtual void detach ()
 

Static Private Member Functions

static std::string timePointToString (const std::chrono::time_point< std::chrono::system_clock > &timePoint)
 
static std::string durationToString (const std::chrono::time_point< std::chrono::system_clock > &bevore, const std::chrono::time_point< std::chrono::system_clock > &later=std::chrono::system_clock::now())
 

Private Attributes

core::socket::stream::SocketConnectionsocketConnection
 
core::socket::stream::SocketContextnewSocketContext = nullptr
 
std::string onlineSince
 
std::size_t alreadyTotalQueued = 0
 
std::size_t alreadyTotalProcessed = 0
 
std::chrono::time_point< std::chrono::system_clock > onlineSinceTimePoint
 

Friends

template<typename PhysicalSocketT , class SocketReaderT , class SocketWriterT , typename ConfigT >
class SocketConnectionT
 
class SocketConnection
 

Detailed Description

Definition at line 66 of file SocketContext.h.

Member Typedef Documentation

◆ Super

Constructor & Destructor Documentation

◆ SocketContext()

core::socket::stream::SocketContext::SocketContext ( core::socket::stream::SocketConnection socketConnection)
explicit

Definition at line 60 of file SocketContext.cpp.

62 , onlineSinceTimePoint(std::chrono::system_clock::now()) {
63 }
core::socket::stream::SocketConnection * socketConnection
std::chrono::time_point< std::chrono::system_clock > onlineSinceTimePoint

References onlineSinceTimePoint, and socketConnection.

Referenced by apps::echo::model::EchoSocketContext::EchoSocketContext(), apps::http::SimpleSocketProtocol::SimpleSocketProtocol(), iot::mqtt_fast::SocketContext::SocketContext(), web::http::client::SocketContext::SocketContext(), web::http::server::SocketContext::SocketContext(), and iot::mqtt::SocketContext::SocketContext().

Here is the caller graph for this function:

◆ ~SocketContext()

core::socket::stream::SocketContext::~SocketContext ( )
overridevirtual

Reimplemented from core::socket::SocketContext.

Reimplemented in web::http::client::SocketContext.

Definition at line 65 of file SocketContext.cpp.

65 {
66 // delete newSocketContext;
67 }

Member Function Documentation

◆ attach()

void core::socket::stream::SocketContext::attach ( )
privatevirtual

Definition at line 179 of file SocketContext.cpp.

References alreadyTotalProcessed, alreadyTotalQueued, core::socket::stream::SocketConnection::getTotalProcessed(), core::socket::stream::SocketConnection::getTotalQueued(), onConnected(), and socketConnection.

Referenced by core::socket::stream::SocketConnection::setSocketContext().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ close()

void core::socket::stream::SocketContext::close ( )
overridevirtual

Implements core::socket::SocketContext.

Reimplemented in iot::mqtt::SocketContext.

Definition at line 126 of file SocketContext.cpp.

126 {
128 }

References core::socket::stream::SocketConnection::close(), and socketConnection.

Referenced by iot::mqtt::SocketContext::close(), web::http::client::Request::executeUpgrade(), iot::mqtt_fast::SocketContext::onReceivedFromPeer(), web::http::client::Request::onSourceError(), web::http::server::Response::onSourceError(), readFromPeer(), and web::http::client::Request::upgrade().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ detach()

void core::socket::stream::SocketContext::detach ( )
privatevirtual

Definition at line 186 of file SocketContext.cpp.

186 {
188
189 LOG(DEBUG) << socketConnection->getConnectionName() << " SocketContext: detach";
190 LOG(DEBUG) << " Online Since: " << getOnlineSince();
191 LOG(DEBUG) << " Online Duration: " << getOnlineDuration();
192 LOG(DEBUG) << " Total Sent: " << getTotalQueued();
193 LOG(DEBUG) << " Total Processed: " << getTotalProcessed();
194
195 delete this;
196 }
const std::string & getConnectionName() const
std::string getOnlineSince() const override
std::size_t getTotalProcessed() const override
std::size_t getTotalQueued() const override
std::string getOnlineDuration() const override

References core::socket::stream::SocketConnection::getConnectionName(), getOnlineDuration(), getOnlineSince(), getTotalProcessed(), getTotalQueued(), onDisconnected(), and socketConnection.

Referenced by readFromPeer(), and core::socket::stream::SocketConnectionT< PhysicalSocketT, SocketReaderT, SocketWriterT, ConfigT >::unobservedEvent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ durationToString()

std::string core::socket::stream::SocketContext::durationToString ( const std::chrono::time_point< std::chrono::system_clock > &  bevore,
const std::chrono::time_point< std::chrono::system_clock > &  later = std::chrono::system_clock::now() 
)
staticprivate

Definition at line 213 of file SocketContext.cpp.

214 {
215 using seconds_duration_type = std::chrono::duration<std::chrono::seconds::rep>::rep;
216
217 const seconds_duration_type totalSeconds = std::chrono::duration_cast<std::chrono::seconds>(later - bevore).count();
218
219 // Compute days, hours, minutes, and seconds
220 const seconds_duration_type days = totalSeconds / 86400; // 86400 seconds in a day
221 seconds_duration_type remainder = totalSeconds % 86400;
222 const seconds_duration_type hours = remainder / 3600;
223 remainder = remainder % 3600;
224 const seconds_duration_type minutes = remainder / 60;
225 const seconds_duration_type seconds = remainder % 60;
226
227 // Format the components into a string using stringstream
228 std::ostringstream oss;
229 if (days > 0) {
230 oss << days << " day" << (days == 1 ? "" : "s") << ", ";
231 }
232 oss << std::setw(2) << std::setfill('0') << hours << ":" << std::setw(2) << std::setfill('0') << minutes << ":" << std::setw(2)
233 << std::setfill('0') << seconds;
234
235 return oss.str();
236 }

Referenced by getOnlineDuration().

Here is the caller graph for this function:

◆ getOnlineDuration()

std::string core::socket::stream::SocketContext::getOnlineDuration ( ) const
overridevirtual

Implements core::socket::SocketContext.

Reimplemented in web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >, web::websocket::SocketContextUpgrade< SubProtocol, web::http::client::Request, web::http::client::Response >, and web::websocket::SocketContextUpgrade< SubProtocol, web::http::server::Request, web::http::server::Response >.

Definition at line 149 of file SocketContext.cpp.

149 {
151 }
static std::string durationToString(const std::chrono::time_point< std::chrono::system_clock > &bevore, const std::chrono::time_point< std::chrono::system_clock > &later=std::chrono::system_clock::now())

References durationToString(), and onlineSinceTimePoint.

Referenced by detach().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getOnlineSince()

std::string core::socket::stream::SocketContext::getOnlineSince ( ) const
overridevirtual

Implements core::socket::SocketContext.

Reimplemented in web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >, web::websocket::SocketContextUpgrade< SubProtocol, web::http::client::Request, web::http::client::Response >, and web::websocket::SocketContextUpgrade< SubProtocol, web::http::server::Request, web::http::server::Response >.

Definition at line 146 of file SocketContext.cpp.

146 {
148 }
static std::string timePointToString(const std::chrono::time_point< std::chrono::system_clock > &timePoint)

References onlineSinceTimePoint, and timePointToString().

Referenced by detach().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getSocketConnection()

SocketConnection * core::socket::stream::SocketContext::getSocketConnection ( ) const

Definition at line 74 of file SocketContext.cpp.

74 {
75 return socketConnection;
76 }

References socketConnection.

Referenced by web::http::server::SocketContext::deliverRequest(), web::http::client::SocketContext::deliverResponse(), web::http::client::SocketContext::deliverResponseParseError(), express::dispatcher::ApplicationDispatcher::dispatch(), express::dispatcher::MiddlewareDispatcher::dispatch(), express::dispatcher::RouterDispatcher::dispatch(), web::http::client::Request::executeUpgrade(), iot::mqtt::SocketContext::getSocketConnection(), web::http::client::SocketContext::initiateRequest(), main(), web::http::client::SocketContext::onConnected(), web::http::server::SocketContext::onConnected(), web::http::client::SocketContext::onDisconnected(), web::http::server::SocketContext::onDisconnected(), web::http::client::SocketContext::onSignal(), web::http::server::SocketContext::onSignal(), web::http::server::SocketContext::requestCompleted(), web::http::client::SocketContext::requestDelivered(), web::http::client::SocketContext::requestPrepared(), web::http::server::SocketContext::responseCompleted(), web::http::client::SocketContext::responseDelivered(), web::http::client::Request::responseParseError(), web::http::client::SocketContext::responseStarted(), web::http::server::SocketContext::responseStarted(), web::http::client::SocketContext::SocketContext(), web::http::server::SocketContext::SocketContext(), express::middleware::StaticMiddleware::StaticMiddleware(), web::http::server::Response::upgrade(), web::http::client::Request::upgrade(), web::http::client::Request::upgrade(), express::middleware::VerboseRequest::VerboseRequest(), and web::http::client::SocketContext::~SocketContext().

Here is the caller graph for this function:

◆ getTotalProcessed()

std::size_t core::socket::stream::SocketContext::getTotalProcessed ( ) const
overridevirtual

Implements core::socket::SocketContext.

Definition at line 142 of file SocketContext.cpp.

References alreadyTotalProcessed, core::socket::stream::SocketConnection::getTotalProcessed(), and socketConnection.

Referenced by detach().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getTotalQueued()

std::size_t core::socket::stream::SocketContext::getTotalQueued ( ) const
overridevirtual

Implements core::socket::SocketContext.

Definition at line 134 of file SocketContext.cpp.

134 {
136 }

References alreadyTotalQueued, core::socket::stream::SocketConnection::getTotalQueued(), and socketConnection.

Referenced by detach().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getTotalRead()

std::size_t core::socket::stream::SocketContext::getTotalRead ( ) const
overridevirtual

Implements core::socket::SocketContext.

Definition at line 138 of file SocketContext.cpp.

138 {
140 }
virtual std::size_t getTotalRead() const =0

References core::socket::stream::SocketConnection::getTotalRead(), and socketConnection.

Here is the call graph for this function:

◆ getTotalSent()

std::size_t core::socket::stream::SocketContext::getTotalSent ( ) const
overridevirtual

Implements core::socket::SocketContext.

Definition at line 130 of file SocketContext.cpp.

130 {
132 }
virtual std::size_t getTotalSent() const =0

References core::socket::stream::SocketConnection::getTotalSent(), and socketConnection.

Here is the call graph for this function:

◆ onConnected()

◆ onDisconnected()

◆ onReadError()

void core::socket::stream::SocketContext::onReadError ( int  errnum)
overrideprotectedvirtual

Implements core::socket::SocketContext.

Definition at line 168 of file SocketContext.cpp.

168 {
169 errno = errnum;
170
171 if (errno == 0) {
172 LOG(DEBUG) << socketConnection->getConnectionName() << " SocketContext: EOF received";
173 } else {
174 PLOG(DEBUG) << socketConnection->getConnectionName() << " SocketContext: onReadError";
175 }
177 }
void shutdownWrite(bool forceClose=false)

References core::socket::stream::SocketConnection::getConnectionName(), shutdownWrite(), and socketConnection.

Referenced by core::socket::stream::SocketConnectionT< PhysicalSocketT, SocketReaderT, SocketWriterT, ConfigT >::onReadError(), and apps::http::SimpleSocketProtocol::onReadError().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ onWriteError()

void core::socket::stream::SocketContext::onWriteError ( int  errnum)
overrideprotectedvirtual

Implements core::socket::SocketContext.

Reimplemented in web::http::client::SocketContext, and web::http::server::SocketContext.

Definition at line 161 of file SocketContext.cpp.

161 {
162 errno = errnum;
163
164 PLOG(DEBUG) << socketConnection->getConnectionName() << " SocketContext: onWriteError";
165 shutdownRead();
166 }

References core::socket::stream::SocketConnection::getConnectionName(), shutdownRead(), and socketConnection.

Referenced by core::socket::stream::SocketConnectionT< PhysicalSocketT, SocketReaderT, SocketWriterT, ConfigT >::onWriteError(), and apps::http::SimpleSocketProtocol::onWriteError().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readFromPeer() [1/3]

std::size_t core::socket::stream::SocketContext::readFromPeer ( char *  chunk,
std::size_t  chunklen 
) const
finalvirtual

Implements core::socket::SocketContext.

Definition at line 109 of file SocketContext.cpp.

109 {
110 std::size_t ret = 0;
111
112 if (newSocketContext == nullptr) {
113 ret = socketConnection->readFromPeer(chunk, chunklen);
114 } else {
116 << " ReadFromPeer: New SocketContext != nullptr: SocketContextSwitch still in progress";
117 }
118
119 return ret;
120 }
virtual std::size_t readFromPeer(char *chunk, std::size_t chunkLen)=0
core::socket::stream::SocketContext * newSocketContext

References core::socket::stream::SocketConnection::getConnectionName(), newSocketContext, core::socket::stream::SocketConnection::readFromPeer(), and socketConnection.

Referenced by apps::echo::model::EchoSocketContext::onReceivedFromPeer(), web::http::decoder::Fields::read(), web::http::decoder::HTTP10Response::read(), web::http::decoder::Identity::read(), web::http::decoder::Chunked::Chunk::read(), web::http::Parser::readStartLine(), and iot::mqtt::SocketContext::recv().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readFromPeer() [2/3]

virtual std::size_t core::socket::SocketContext::readFromPeer ( char *  chunk,
std::size_t  chunklen 
) const
virtual

◆ readFromPeer() [3/3]

void core::socket::stream::SocketContext::readFromPeer ( std::size_t  available)
protected

Definition at line 90 of file SocketContext.cpp.

90 {
91 const std::size_t consumed = onReceivedFromPeer();
92
93 if (available != 0 && consumed == 0) {
94 LOG(TRACE) << socketConnection->getConnectionName() << ": Data available: " << available << " but nothing read";
95
96 close();
97
98 delete newSocketContext; // delete of nullptr is valid since C++14!
99 newSocketContext = nullptr;
100 } else if (newSocketContext != nullptr) { // Perform a pending SocketContextSwitch
103 detach();
104
105 socketConnection->setSocketContext(newSocketContext);
106 }
107 }
virtual std::size_t onReceivedFromPeer()=0

References close(), detach(), core::socket::stream::SocketConnection::getConnectionName(), newSocketContext, core::socket::SocketContext::onReceivedFromPeer(), core::socket::stream::SocketConnection::setSocketContext(), and socketConnection.

Referenced by core::socket::stream::SocketConnectionT< PhysicalSocketT, SocketReaderT, SocketWriterT, ConfigT >::onReceivedFromPeer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sendToPeer() [1/3]

void core::socket::stream::SocketContext::sendToPeer ( const char *  chunk,
std::size_t  chunkLen 
) const
finalvirtual

Implements core::socket::SocketContext.

Definition at line 78 of file SocketContext.cpp.

78 {
79 socketConnection->sendToPeer(chunk, chunkLen);
80 }
virtual void sendToPeer(const char *chunk, std::size_t chunkLen)=0

References core::socket::stream::SocketConnection::sendToPeer(), and socketConnection.

Referenced by web::http::client::Request::executeSendFragment(), apps::echo::model::EchoSocketContext::onReceivedFromPeer(), iot::mqtt::SocketContext::send(), iot::mqtt_fast::SocketContext::send(), and web::http::server::Response::sendFragment().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sendToPeer() [2/3]

virtual void core::socket::SocketContext::sendToPeer ( const char *  chunk,
std::size_t  chunkLen 
) const
virtual

◆ sendToPeer() [3/3]

void core::socket::SocketContext::sendToPeer ( const std::string &  data) const

Definition at line 75 of file SocketContext.cpp.

53 {
54 sendToPeer(data.data(), data.length());
55 }
void sendToPeer(const char *chunk, std::size_t chunkLen) const final

◆ setTimeout()

void core::socket::stream::SocketContext::setTimeout ( const utils::Timeval timeout)
finalvirtual

Implements core::socket::SocketContext.

Definition at line 122 of file SocketContext.cpp.

122 {
124 }
virtual void setTimeout(const utils::Timeval &timeout)=0

References core::socket::stream::SocketConnection::setTimeout(), and socketConnection.

Here is the call graph for this function:

◆ shutdownRead()

void core::socket::stream::SocketContext::shutdownRead ( )

Definition at line 153 of file SocketContext.cpp.

References core::socket::stream::SocketConnection::shutdownRead(), and socketConnection.

Referenced by apps::http::SimpleSocketProtocol::onWriteError(), and onWriteError().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ shutdownWrite()

void core::socket::stream::SocketContext::shutdownWrite ( bool  forceClose = false)

Definition at line 157 of file SocketContext.cpp.

157 {
158 socketConnection->shutdownWrite(forceClose);
159 }
virtual void shutdownWrite(bool forceClose)=0

References core::socket::stream::SocketConnection::shutdownWrite(), and socketConnection.

Referenced by web::http::client::SocketContext::deliverResponseParseError(), iot::mqtt::SocketContext::end(), apps::http::SimpleSocketProtocol::onReadError(), onReadError(), web::http::server::SocketContext::requestCompleted(), web::http::client::SocketContext::requestDelivered(), web::http::server::SocketContext::responseCompleted(), and web::http::client::SocketContext::responseStarted().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ streamEof()

void core::socket::stream::SocketContext::streamEof ( )

Definition at line 86 of file SocketContext.cpp.

References socketConnection, and core::socket::stream::SocketConnection::streamEof().

Referenced by web::http::client::Request::onSourceEof(), web::http::server::Response::onSourceEof(), web::http::client::Request::onSourceError(), web::http::server::Response::onSourceError(), web::http::client::Request::~Request(), and web::http::server::Response::~Response().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ streamToPeer()

bool core::socket::stream::SocketContext::streamToPeer ( core::pipe::Source source) const

Definition at line 82 of file SocketContext.cpp.

82 {
83 return socketConnection->streamToPeer(source);
84 }
virtual bool streamToPeer(core::pipe::Source *source)=0

References socketConnection, and core::socket::stream::SocketConnection::streamToPeer().

Referenced by web::http::client::Request::onSourceConnect(), and web::http::server::Response::onSourceConnect().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ switchSocketContext()

void core::socket::stream::SocketContext::switchSocketContext ( SocketContext newSocketContext)
virtual

Definition at line 69 of file SocketContext.cpp.

69 {
70 LOG(DEBUG) << socketConnection->getConnectionName() << " SocketContext: switch";
72 }

References core::socket::stream::SocketConnection::getConnectionName(), newSocketContext, and socketConnection.

Referenced by web::http::server::Response::upgrade(), and web::http::client::Request::upgrade().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ timePointToString()

std::string core::socket::stream::SocketContext::timePointToString ( const std::chrono::time_point< std::chrono::system_clock > &  timePoint)
staticprivate

Definition at line 198 of file SocketContext.cpp.

198 {
199 const std::time_t time = std::chrono::system_clock::to_time_t(timePoint);
200 std::tm* tm_ptr = std::gmtime(&time);
201
202 char buffer[100];
203 std::string onlineSince = "Formatting error";
204
205 // Format: "2025-02-02 14:30:00"
206 if (std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm_ptr) > 0) {
207 onlineSince = std::string(buffer) + " UTC";
208 }
209
210 return onlineSince;
211 }
time_t time(time_t *tloc)
Definition time.cpp:52

Referenced by getOnlineSince().

Here is the caller graph for this function:

Friends And Related Symbol Documentation

◆ SocketConnection

friend class SocketConnection
friend

Definition at line 132 of file SocketContext.h.

◆ SocketConnectionT

template<typename PhysicalSocketT , class SocketReaderT , class SocketWriterT , typename ConfigT >
friend class SocketConnectionT
friend

Definition at line 131 of file SocketContext.h.

Member Data Documentation

◆ alreadyTotalProcessed

std::size_t core::socket::stream::SocketContext::alreadyTotalProcessed = 0
private

Definition at line 126 of file SocketContext.h.

Referenced by attach(), and getTotalProcessed().

◆ alreadyTotalQueued

std::size_t core::socket::stream::SocketContext::alreadyTotalQueued = 0
private

Definition at line 125 of file SocketContext.h.

Referenced by attach(), and getTotalQueued().

◆ newSocketContext

core::socket::stream::SocketContext* core::socket::stream::SocketContext::newSocketContext = nullptr
private

Definition at line 122 of file SocketContext.h.

Referenced by readFromPeer(), readFromPeer(), and switchSocketContext().

◆ onlineSince

std::string core::socket::stream::SocketContext::onlineSince
private

Definition at line 124 of file SocketContext.h.

◆ onlineSinceTimePoint

std::chrono::time_point<std::chrono::system_clock> core::socket::stream::SocketContext::onlineSinceTimePoint
private

Definition at line 128 of file SocketContext.h.

Referenced by getOnlineDuration(), getOnlineSince(), and SocketContext().

◆ socketConnection


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