SNode.C
Loading...
Searching...
No Matches
web::http::server::SocketContext Class Reference

#include <SocketContext.h>

Inheritance diagram for web::http::server::SocketContext:
Collaboration diagram for web::http::server::SocketContext:

Public Member Functions

 SocketContext (core::socket::stream::SocketConnection *socketConnection, const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> &onRequestReady)
SocketContextonConnected (std::function< void()> onConnectEventReceiver)
SocketContextonDisconnected (std::function< void()> onDisconnectEventReceiver)
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
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
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

Private Types

using Super = core::socket::stream::SocketContext
using Request = web::http::server::Request
using Response = web::http::server::Response

Private Member Functions

void deliverRequest ()
void responseStarted (const Response &response)
void responseCompleted (const Response &response, bool success)
void requestCompleted (const Response &response)
void onConnected () override
std::size_t onReceivedFromPeer () override
void onDisconnected () override
bool onSignal (int signum) override
void onWriteError (int errnum) override

Private Attributes

std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> onRequestReady
std::list< std::shared_ptr< Request > > pendingRequests
std::shared_ptr< ResponsemasterResponse
std::list< std::function< void()> > onConnectEventReceiverList
std::list< std::function< void()> > onDisconnectEventReceiverList
RequestParser parser
bool httpClose = false
bool serverSentEvent = false
friend Response

Additional Inherited Members

Protected Member Functions inherited from core::socket::stream::SocketContext
void onReadError (int errnum) override
std::size_t readFromPeer ()
Protected Member Functions inherited from core::socket::SocketContext
 SocketContext ()=default
virtual ~SocketContext ()

Detailed Description

Definition at line 68 of file SocketContext.h.

Member Typedef Documentation

◆ Request

◆ Response

◆ Super

Constructor & Destructor Documentation

◆ SocketContext()

web::http::server::SocketContext::SocketContext ( core::socket::stream::SocketConnection * socketConnection,
const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> & onRequestReady )

Definition at line 61 of file SocketContext.cpp.

66 , masterResponse(std::make_shared<Response>(this))
67 , parser(
68 this,
69 [this]() {
70 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Request start";
71 },
72 [this](web::http::server::Request&& request) {
73 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Request parse success: " << request.method << " "
74 << request.url << " HTTP/" << request.httpMajor << "." << request.httpMinor;
75
76 pendingRequests.emplace_back(std::make_shared<Request>(std::move(request)));
77
78 if (pendingRequests.size() == 1) {
80 }
81 },
82 [this](int status, const std::string& reason) {
83 LOG(ERROR) << getSocketConnection()->getConnectionName() << " HTTP: Request parse error: " << reason << " (" << status
84 << ") ";
86
87 pendingRequests.emplace_back(std::make_shared<Request>(Request(status, reason)));
88
89 if (pendingRequests.size() == 1) {
91 }
92 }) {
93 }
const std::string & getConnectionName() const
SocketConnection * getSocketConnection() const
core::socket::stream::SocketConnection * socketConnection
std::shared_ptr< Response > masterResponse
core::socket::stream::SocketContext Super
std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> onRequestReady
web::http::server::Request Request
std::list< std::shared_ptr< Request > > pendingRequests

References core::socket::stream::SocketConnection::getConnectionName(), core::socket::stream::SocketContext::getSocketConnection(), masterResponse, onRequestReady, parser, web::http::server::RequestParser::RequestParser(), and core::socket::stream::SocketContext::SocketContext().

Referenced by web::http::server::SocketContextFactory::create().

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

Member Function Documentation

◆ deliverRequest()

void web::http::server::SocketContext::deliverRequest ( )
private

Definition at line 107 of file SocketContext.cpp.

107 {
108 if (!pendingRequests.empty()) {
109 const std::shared_ptr<Request>& pendingRequest = pendingRequests.front();
110
111 if (pendingRequest->status == 0) {
112 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Request deliver: " << pendingRequest->method << " "
113 << pendingRequest->url << " HTTP/" << pendingRequest->httpMajor << "." << pendingRequest->httpMinor;
114
115 masterResponse->init();
116 masterResponse->requestMethod = pendingRequest->method;
117 masterResponse->httpMajor = pendingRequest->httpMajor;
118 masterResponse->httpMinor = pendingRequest->httpMinor;
119
120 const std::string connection = pendingRequest->get("Connection");
121 if (!connection.empty()) {
122 masterResponse->set("Connection", connection);
123 }
124
125 onRequestReady(pendingRequest, masterResponse);
126 } else {
127 masterResponse->init();
128 masterResponse->httpMajor = 1;
129 masterResponse->httpMinor = 1;
130
131 masterResponse->status(pendingRequest->status).send(pendingRequest->reason);
132 }
133 } else {
134 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: No more pending request";
135 }
136 }

References web::http::server::Request::get(), core::socket::stream::SocketConnection::getConnectionName(), core::socket::stream::SocketContext::getSocketConnection(), web::http::server::Request::httpMajor, web::http::server::Response::httpMajor, web::http::server::Request::httpMinor, web::http::server::Response::httpMinor, web::http::server::Response::init(), masterResponse, web::http::server::Request::method, onRequestReady, pendingRequests, web::http::server::Request::reason, web::http::server::Response::requestMethod, web::http::server::Response::send(), web::http::server::Response::set(), web::http::server::Request::status, web::http::server::Response::status(), and web::http::server::Request::url.

Referenced by requestCompleted().

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

◆ onConnected() [1/2]

void web::http::server::SocketContext::onConnected ( )
overrideprivatevirtual

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

Definition at line 206 of file SocketContext.cpp.

206 {
207 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Connected";
208
209 for (auto& onConnectEventReceiver : onConnectEventReceiverList) {
210 onConnectEventReceiver();
211 }
212 }
std::list< std::function< void()> > onConnectEventReceiverList

References core::socket::stream::SocketConnection::getConnectionName(), core::socket::stream::SocketContext::getSocketConnection(), and onConnectEventReceiverList.

Here is the call graph for this function:

◆ onConnected() [2/2]

SocketContext * web::http::server::SocketContext::onConnected ( std::function< void()> onConnectEventReceiver)

Definition at line 95 of file SocketContext.cpp.

95 {
96 onConnectEventReceiverList.push_back(std::move(onConnectEventReceiver));
97
98 return this;
99 }

References onConnectEventReceiverList.

◆ onDisconnected() [1/2]

void web::http::server::SocketContext::onDisconnected ( )
overrideprivatevirtual

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

Definition at line 224 of file SocketContext.cpp.

224 {
225 masterResponse->disconnect();
226
227 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Received disconnect";
228
229 for (auto& onDisconnectEventReceiver : onDisconnectEventReceiverList) {
230 onDisconnectEventReceiver();
231 }
232 }
std::list< std::function< void()> > onDisconnectEventReceiverList

References web::http::server::Response::disconnect(), core::socket::stream::SocketConnection::getConnectionName(), core::socket::stream::SocketContext::getSocketConnection(), masterResponse, and onDisconnectEventReceiverList.

Here is the call graph for this function:

◆ onDisconnected() [2/2]

SocketContext * web::http::server::SocketContext::onDisconnected ( std::function< void()> onDisconnectEventReceiver)

Definition at line 101 of file SocketContext.cpp.

101 {
102 onDisconnectEventReceiverList.push_back(std::move(onDisconnectEventReceiver));
103
104 return this;
105 }

References onDisconnectEventReceiverList.

◆ onReceivedFromPeer()

std::size_t web::http::server::SocketContext::onReceivedFromPeer ( )
overrideprivatevirtual

Implements core::socket::SocketContext.

Definition at line 214 of file SocketContext.cpp.

214 {
215 std::size_t consumed = 0;
216
217 if (!serverSentEvent && !httpClose) {
218 consumed = parser.parse();
219 }
220
221 return consumed;
222 }

References httpClose, web::http::Parser::parse(), parser, and serverSentEvent.

Here is the call graph for this function:

◆ onSignal()

bool web::http::server::SocketContext::onSignal ( int signum)
overrideprivatevirtual

Implements core::socket::SocketContext.

Definition at line 234 of file SocketContext.cpp.

234 {
235 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Received signal " << signum;
236
237 return true;
238 }

References core::socket::stream::SocketConnection::getConnectionName(), and core::socket::stream::SocketContext::getSocketConnection().

Here is the call graph for this function:

◆ onWriteError()

void web::http::server::SocketContext::onWriteError ( int errnum)
overrideprivatevirtual

Reimplemented from core::socket::stream::SocketContext.

Definition at line 240 of file SocketContext.cpp.

240 {
241 // Do nothing in case of an write error
242 }

◆ requestCompleted()

void web::http::server::SocketContext::requestCompleted ( const Response & response)
private

Definition at line 172 of file SocketContext.cpp.

172 {
173 const std::shared_ptr<Request> request = std::move(pendingRequests.front());
174 pendingRequests.pop_front();
175
176 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Response completed for request: " << request->method << " "
177 << request->url << " HTTP/" << request->httpMajor << "." << request->httpMinor;
178 LOG(INFO) << getSocketConnection()->getConnectionName() << " "
179 << "HTTP/" + std::to_string(response.httpMajor)
180 .append(".")
181 .append(std::to_string(response.httpMinor))
182 .append(" ")
183 .append(std::to_string(response.statusCode))
184 .append(" ")
185 .append(StatusCode::reason(response.statusCode));
186
187 httpClose = response.connectionState == ConnectionState::Close ||
188 (response.connectionState == ConnectionState::Default &&
189 ((response.httpMajor == 0 && response.httpMinor == 9) || (response.httpMajor == 1 && response.httpMinor == 0)));
190
191 if (httpClose) {
192 LOG(DEBUG) << getSocketConnection()->getConnectionName() << " HTTP: Connection = Close";
193 } else {
194 LOG(DEBUG) << getSocketConnection()->getConnectionName() << " HTTP: Connection = Keep-Alive";
195
196 if (!pendingRequests.empty()) {
197 core::EventReceiver::atNextTick([this, response = std::weak_ptr<Response>(masterResponse)]() {
198 if (!response.expired()) {
200 }
201 });
202 }
203 }
204 }
static void atNextTick(const std::function< void(void)> &callBack)
static std::string reason(int status)

References core::EventReceiver::atNextTick(), web::http::Close, web::http::server::Response::connectionState, web::http::Default, deliverRequest(), core::socket::stream::SocketConnection::getConnectionName(), core::socket::stream::SocketContext::getSocketConnection(), httpClose, web::http::server::Request::httpMajor, web::http::server::Response::httpMajor, web::http::server::Request::httpMinor, web::http::server::Response::httpMinor, masterResponse, web::http::server::Request::method, pendingRequests, web::http::StatusCode::reason(), web::http::server::Response::statusCode, and web::http::server::Request::url.

Referenced by responseCompleted().

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

◆ responseCompleted()

void web::http::server::SocketContext::responseCompleted ( const Response & response,
bool success )
private

Definition at line 161 of file SocketContext.cpp.

161 {
162 if (success) {
163 requestCompleted(response);
164 } else {
165 LOG(WARNING) << getSocketConnection()->getConnectionName() << " HTTP: Response completed with error: " << response.statusCode
166 << " " << StatusCode::reason(response.statusCode);
167
168 shutdownWrite(true);
169 }
170 }
void shutdownWrite(bool forceClose=false)
void requestCompleted(const Response &response)

References core::socket::stream::SocketConnection::getConnectionName(), core::socket::stream::SocketContext::getSocketConnection(), web::http::StatusCode::reason(), requestCompleted(), core::socket::stream::SocketContext::shutdownWrite(), and web::http::server::Response::statusCode.

Referenced by web::http::server::Response::sendCompleted().

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

◆ responseStarted()

void web::http::server::SocketContext::responseStarted ( const Response & response)
private

Definition at line 138 of file SocketContext.cpp.

138 {
139 if (!pendingRequests.empty()) {
140 const std::shared_ptr<Request>& pendingRequest = pendingRequests.front();
141
142 serverSentEvent = web::http::ciContains(pendingRequest->get("Accept"), "text/event-stream");
143
144 if (serverSentEvent) {
146 }
147
148 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Response start for request: " << pendingRequest->method
149 << " " << pendingRequest->url << " HTTP/" << pendingRequest->httpMajor << "." << pendingRequest->httpMinor;
150 LOG(INFO) << getSocketConnection()->getConnectionName() << " "
151 << "HTTP/" + std::to_string(response.httpMajor)
152 .append(".")
153 .append(std::to_string(response.httpMinor))
154 .append(" ")
155 .append(std::to_string(response.statusCode))
156 .append(" ")
157 .append(StatusCode::reason(response.statusCode));
158 }
159 }
virtual void setReadTimeout(const utils::Timeval &timeout)=0
bool ciContains(const std::string &str1, const std::string &str2)

References web::http::ciContains(), web::http::server::Request::get(), core::socket::stream::SocketConnection::getConnectionName(), core::socket::stream::SocketContext::getSocketConnection(), web::http::server::Request::httpMajor, web::http::server::Response::httpMajor, web::http::server::Request::httpMinor, web::http::server::Response::httpMinor, web::http::server::Request::method, pendingRequests, web::http::StatusCode::reason(), serverSentEvent, core::socket::stream::SocketConnection::setReadTimeout(), web::http::server::Response::statusCode, and web::http::server::Request::url.

Referenced by web::http::server::Response::sendHeader().

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

Member Data Documentation

◆ httpClose

bool web::http::server::SocketContext::httpClose = false
private

Definition at line 105 of file SocketContext.h.

Referenced by onReceivedFromPeer(), and requestCompleted().

◆ masterResponse

std::shared_ptr<Response> web::http::server::SocketContext::masterResponse
private

Definition at line 98 of file SocketContext.h.

Referenced by deliverRequest(), onDisconnected(), requestCompleted(), and SocketContext().

◆ onConnectEventReceiverList

std::list<std::function<void()> > web::http::server::SocketContext::onConnectEventReceiverList
private

Definition at line 100 of file SocketContext.h.

Referenced by onConnected(), and onConnected().

◆ onDisconnectEventReceiverList

std::list<std::function<void()> > web::http::server::SocketContext::onDisconnectEventReceiverList
private

Definition at line 101 of file SocketContext.h.

Referenced by onDisconnected(), and onDisconnected().

◆ onRequestReady

std::function<void(const std::shared_ptr<Request>&, const std::shared_ptr<Response>&)> web::http::server::SocketContext::onRequestReady
private

Definition at line 89 of file SocketContext.h.

Referenced by deliverRequest(), and SocketContext().

◆ parser

RequestParser web::http::server::SocketContext::parser
private

Definition at line 103 of file SocketContext.h.

Referenced by onReceivedFromPeer(), and SocketContext().

◆ pendingRequests

std::list<std::shared_ptr<Request> > web::http::server::SocketContext::pendingRequests
private

Definition at line 97 of file SocketContext.h.

Referenced by deliverRequest(), requestCompleted(), and responseStarted().

◆ Response

Definition at line 108 of file SocketContext.h.

◆ serverSentEvent

bool web::http::server::SocketContext::serverSentEvent = false
private

Definition at line 106 of file SocketContext.h.

Referenced by onReceivedFromPeer(), and responseStarted().


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