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 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
 

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
 
void readFromPeer (std::size_t available)
 
- 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 208 of file SocketContext.cpp.

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

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

216 {
217 std::size_t consumed = 0;
218
219 if (!serverSentEvent && !httpClose) {
220 consumed = parser.parse();
221 }
222
223 return consumed;
224 }
std::size_t parse()
Definition Parser.cpp:92

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

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

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

242 {
243 // Do nothing in case of an write error
244 }

◆ 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
194 shutdownWrite(true);
195 } else {
196 LOG(DEBUG) << getSocketConnection()->getConnectionName() << " HTTP: Connection = Keep-Alive";
197
198 if (!pendingRequests.empty()) {
199 core::EventReceiver::atNextTick([this, response = std::weak_ptr<Response>(masterResponse)]() {
200 if (!response.expired()) {
201 deliverRequest();
202 }
203 });
204 }
205 }
206 }
static void atNextTick(const std::function< void(void)> &callBack)
void shutdownWrite(bool forceClose=false)
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 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 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: