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/client/SocketContext.h"
44#include "core/EventReceiver.h"
45#include "core/socket/stream/SocketConnection.h"
46#include "web/http/CookieOptions.h"
47#include "web/http/client/Request.h"
49#ifndef DOXYGEN_SHOULD_SKIP_THIS
51#include "log/Logger.h"
52#include "utils/Timeval.h"
53#include "web/http/http_utils.h"
62namespace web::http::
client {
65 const std::function<
void(
const std::shared_ptr<
MasterRequest>&)>& onHttpConnected,
66 const std::function<
void(
const std::shared_ptr<
MasterRequest>&)>& onHttpDisconnected,
67 const std::string& hostHeader,
68 bool pipelinedRequests)
82 [
this](
int status,
const std::string& reason) {
105 const std::string requestLine = std::string(request->
method)
107 .append(request->
url)
109 .append(std::to_string(request->
httpMajor))
111 .append(std::to_string(request->
httpMinor));
116 <<
") accepted: " << requestLine;
134 <<
") rejected: " << requestLine;
151 const std::string requestLine = std::string(request->
method)
153 .append(request->
url)
155 .append(std::to_string(request->
httpMajor))
157 .append(std::to_string(request->
httpMinor));
163 <<
") delivering failed: " << requestLine;
171 <<
") dequeued: " << request->
method <<
" " << request->
url <<
" HTTP/" << request->
httpMajor <<
"."
185 const std::string requestLine = std::string(currentRequest->
method)
187 .append(currentRequest->
url)
189 .append(std::to_string(currentRequest->
httpMajor))
191 .append(std::to_string(currentRequest->
httpMinor));
201 if (!masterRequest.expired()) {
205 <<
") dequeued: " << request->
method <<
" " << request->
url <<
" HTTP/" << request->
httpMajor <<
"."
214 <<
") deliver failed: " << requestLine;
232 const std::string requestLine = std::string(request->
method)
234 .append(request->
url)
236 .append(std::to_string(request->
httpMajor))
238 .append(std::to_string(request->
httpMinor));
241 <<
"): " << requestLine;
257 const std::string requestLine = std::string(request->
method)
259 .append(request->
url)
261 .append(std::to_string(request->
httpMajor))
263 .append(std::to_string(request->
httpMinor));
266 <<
") for request (" << request->
count <<
"): " << requestLine
267 << std::string(request->
method)
269 .append(request->
url)
271 .append(std::to_string(request->
httpMajor))
273 .append(std::to_string(request->
httpMinor));
294 if (!masterRequest.expired()) {
298 <<
"): " << request->
method <<
" " << request->
url <<
" HTTP/" << request->
httpMajor <<
"."
321 std::size_t consumed = 0;
341 response->
reason =
"Connection loss";
static void atNextTick(const std::function< void(void)> &callBack)
virtual void setWriteTimeout(const utils::Timeval &timeout)=0
const std::string & getConnectionName() const
SocketConnection * getSocketConnection() const
SocketContext(core::socket::stream::SocketConnection *socketConnection)
LogMessage(Level level, int verboseLevel=-1, bool withErrno=false)
void deliverResponseParseError(const std::shared_ptr< MasterRequest > &request, const std::string &message)
void deliverResponse(const std::shared_ptr< MasterRequest > &request, const std::shared_ptr< Response > &response)
bool initiate(const std::shared_ptr< MasterRequest > &request)
void setMasterRequest(const std::shared_ptr< MasterRequest > &masterRequest)
const CiStringMap< std::string > & getCookies() const
const std::map< std::string, std::string > & getQueries() const
std::string header(const std::string &field) const
const CiStringMap< std::string > & getTrailer() const
const CiStringMap< std::string > & getHeaders() const
ResponseParser(core::socket::stream::SocketContext *socketContext, const std::function< void()> &onResponseStart, const std::function< void(Response &)> &onResponseParsed, const std::function< void(int, const std::string &)> &onResponseParseError)
ConnectionState connectionState
core::socket::stream::SocketContext Super
void setSseEventReceiver(const std::function< std::size_t()> &onServerSentEvent)
void deliverResponseParseError(int status, const std::string &reason)
void onDisconnected() override
web::http::client::Response Response
SocketContext(core::socket::stream::SocketConnection *socketConnection, const std::function< void(const std::shared_ptr< MasterRequest > &)> &onHttpConnected, const std::function< void(const std::shared_ptr< MasterRequest > &)> &onHttpDisconnected, const std::string &hostHeader, bool pipelinedRequests)
std::function< void(const std::shared_ptr< MasterRequest > &)> onHttpConnected
std::size_t onReceivedFromPeer() override
std::function< std::size_t()> onServerSentEvent
std::list< std::shared_ptr< MasterRequest > > deliveredRequests
void onWriteError(int errnum) override
std::function< void(const std::shared_ptr< MasterRequest > &)> onHttpDisconnected
bool onSignal(int signum) override
void requestPrepared(const std::shared_ptr< MasterRequest > &request)
std::shared_ptr< MasterRequest > masterRequest
void requestDelivered(bool success)
~SocketContext() override
void deliverResponse(const std::shared_ptr< Response > &response)
void onConnected() override
std::list< std::shared_ptr< MasterRequest > > pendingRequests
void requestCompleted(const std::shared_ptr< Response > &response)
std::string toString(const std::string &method, const std::string &url, const std::string &version, const std::map< std::string, std::string > &queries, const web::http::CiStringMap< std::string > &header, const web::http::CiStringMap< std::string > &trailer, const web::http::CiStringMap< std::string > &cookies, const std::vector< char > &body)
bool ciContains(const std::string &str1, const std::string &str2)