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 ()
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->set("Connection", "close");
132 masterResponse->connectionState = ConnectionState::Close;
133
134 masterResponse->status(pendingRequest->status).send(pendingRequest->reason);
135 }
136 } else {
137 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: No more pending request";
138 }
139 }

References web::http::Close, web::http::server::Response::connectionState, 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 211 of file SocketContext.cpp.

211 {
212 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Connected";
213
214 for (auto& onConnectEventReceiver : onConnectEventReceiverList) {
215 onConnectEventReceiver();
216 }
217 }
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 229 of file SocketContext.cpp.

229 {
230 masterResponse->disconnect();
231
232 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Received disconnect";
233
234 for (auto& onDisconnectEventReceiver : onDisconnectEventReceiverList) {
235 onDisconnectEventReceiver();
236 }
237 }
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 219 of file SocketContext.cpp.

219 {
220 std::size_t consumed = 0;
221
222 if (!serverSentEvent && !httpClose) {
223 consumed = parser.parse();
224 }
225
226 return consumed;
227 }

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 239 of file SocketContext.cpp.

239 {
240 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Received signal " << signum;
241
242 return true;
243 }

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 245 of file SocketContext.cpp.

245 {
246 // Do nothing in case of an write error
247 }

◆ requestCompleted()

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

Definition at line 175 of file SocketContext.cpp.

175 {
176 const std::shared_ptr<Request> request = std::move(pendingRequests.front());
177 pendingRequests.pop_front();
178
179 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Response completed for request: " << request->method << " "
180 << request->url << " HTTP/" << request->httpMajor << "." << request->httpMinor;
181 LOG(INFO) << getSocketConnection()->getConnectionName() << " "
182 << "HTTP/" + std::to_string(response.httpMajor)
183 .append(".")
184 .append(std::to_string(response.httpMinor))
185 .append(" ")
186 .append(std::to_string(response.statusCode))
187 .append(" ")
188 .append(StatusCode::reason(response.statusCode));
189
190 httpClose = response.connectionState == ConnectionState::Close ||
191 (response.connectionState == ConnectionState::Default &&
192 ((response.httpMajor == 0 && response.httpMinor == 9) || (response.httpMajor == 1 && response.httpMinor == 0)));
193
194 if (httpClose) {
195 LOG(DEBUG) << getSocketConnection()->getConnectionName() << " HTTP: Connection = Close";
196
198 } else {
199 LOG(DEBUG) << getSocketConnection()->getConnectionName() << " HTTP: Connection = Keep-Alive";
200
201 if (!pendingRequests.empty()) {
202 core::EventReceiver::atNextTick([this, response = std::weak_ptr<Response>(masterResponse)]() {
203 if (!response.expired()) {
205 }
206 });
207 }
208 }
209 }
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(), core::socket::stream::SocketContext::shutdownWrite(), 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 164 of file SocketContext.cpp.

164 {
165 if (success) {
166 requestCompleted(response);
167 } else {
168 LOG(WARNING) << getSocketConnection()->getConnectionName() << " HTTP: Response completed with error: " << response.statusCode
169 << " " << StatusCode::reason(response.statusCode);
170
171 close();
172 }
173 }
void requestCompleted(const Response &response)

References core::socket::stream::SocketContext::close(), core::socket::stream::SocketConnection::getConnectionName(), core::socket::stream::SocketContext::getSocketConnection(), web::http::StatusCode::reason(), requestCompleted(), 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 141 of file SocketContext.cpp.

141 {
142 if (!pendingRequests.empty()) {
143 const std::shared_ptr<Request>& pendingRequest = pendingRequests.front();
144
145 serverSentEvent = web::http::ciContains(pendingRequest->get("Accept"), "text/event-stream");
146
147 if (serverSentEvent) {
149 }
150
151 LOG(INFO) << getSocketConnection()->getConnectionName() << " HTTP: Response start for request: " << pendingRequest->method
152 << " " << pendingRequest->url << " HTTP/" << pendingRequest->httpMajor << "." << pendingRequest->httpMinor;
153 LOG(INFO) << getSocketConnection()->getConnectionName() << " "
154 << "HTTP/" + std::to_string(response.httpMajor)
155 .append(".")
156 .append(std::to_string(response.httpMinor))
157 .append(" ")
158 .append(std::to_string(response.statusCode))
159 .append(" ")
160 .append(StatusCode::reason(response.statusCode));
161 }
162 }
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: