2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "web/http/server/SocketContext.h"
44#include "core/EventReceiver.h"
45#include "core/socket/stream/SocketConnection.h"
46#include "web/http/StatusCodes.h"
47#include "web/http/server/Response.h"
49#ifndef DOXYGEN_SHOULD_SKIP_THIS
51#include "log/Logger.h"
52#include "utils/Timeval.h"
59namespace web::http::
server {
63 const std::function<
void(
const std::shared_ptr<Request>&,
const std::shared_ptr<Response>&)>& onRequestReady)
64 : Super
(socketConnection
)
76 pendingRequests.emplace_back(std::make_shared<Request>(std::move(request)));
82 [
this](
int status,
const std::string& reason) {
109 const std::shared_ptr<Request>& pendingRequest =
pendingRequests.front();
111 if (pendingRequest->
status == 0) {
120 const std::string connection = pendingRequest->
get("Connection");
121 if (!connection.empty()) {
140 const std::shared_ptr<Request>& pendingRequest =
pendingRequests.front();
149 <<
" " << pendingRequest->
url <<
" HTTP/" << pendingRequest->
httpMajor <<
"." << pendingRequest->
httpMinor;
151 <<
"HTTP/" + std::to_string(response
.httpMajor)
173 const std::shared_ptr<Request> request = std::move(
pendingRequests.front());
179 <<
"HTTP/" + std::to_string(response
.httpMajor)
200 if (!response.expired()) {
212 onConnectEventReceiver();
217 std::size_t consumed = 0;
232 onDisconnectEventReceiver();
static void atNextTick(const std::function< void(void)> &callBack)
virtual void setReadTimeout(const utils::Timeval &timeout)=0
const std::string & getConnectionName() const
SocketConnection * getSocketConnection() const
SocketContext(core::socket::stream::SocketConnection *socketConnection)
void shutdownWrite(bool forceClose=false)
static std::string reason(int status)
RequestParser(core::socket::stream::SocketContext *socketContext, const std::function< void()> &onRequestStart, const std::function< void(Request &&)> &onRequestParsed, const std::function< void(int, const std::string &)> &onRequestParseError)
Request(int status, const std::string &reason="")
const std::string & get(const std::string &key, int i=0) const
Response & status(int statusCode)
void send(const std::string &chunk)
std::string requestMethod
Response & set(const std::string &field, const std::string &value, bool overwrite=true)
ConnectionState connectionState
bool onSignal(int signum) override
std::list< std::function< void()> > onDisconnectEventReceiverList
void onConnected() override
void onDisconnected() override
void responseCompleted(const Response &response, bool success)
std::shared_ptr< Response > masterResponse
std::size_t onReceivedFromPeer() override
void onWriteError(int errnum) override
std::list< std::function< void()> > onConnectEventReceiverList
void responseStarted(const Response &response)
void requestCompleted(const Response &response)
SocketContext(core::socket::stream::SocketConnection *socketConnection, const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> &onRequestReady)
std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> onRequestReady
SocketContext * onConnected(std::function< void()> onConnectEventReceiver)
SocketContext * onDisconnected(std::function< void()> onDisconnectEventReceiver)
std::list< std::shared_ptr< Request > > pendingRequests
bool ciContains(const std::string &str1, const std::string &str2)