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"
48#ifndef DOXYGEN_SHOULD_SKIP_THIS
50#include "log/Logger.h"
51#include "utils/Timeval.h"
52#include "web/http/http_utils.h"
61namespace web::http::client {
64 const std::function<
void(
const std::shared_ptr<
MasterRequest>&)>& onHttpConnected,
65 const std::function<
void(
const std::shared_ptr<
MasterRequest>&)>& onHttpDisconnected,
66 const std::string& hostHeader,
67 bool pipelinedRequests)
68 : Super
(socketConnection
)
78 [
this](web::http::client::
Response& response) {
81 [
this](
int status,
const std::string& reason) {
104 const std::string requestLine = std::string(request->
method)
106 .append(request->
url)
108 .append(std::to_string(request->
httpMajor))
110 .append(std::to_string(request->
httpMinor));
115 <<
") accepted: " << requestLine;
133 <<
") rejected: " << requestLine;
150 const std::string requestLine = std::string(request->
method)
152 .append(request->
url)
154 .append(std::to_string(request->
httpMajor))
156 .append(std::to_string(request->
httpMinor));
162 <<
") delivering failed: " << requestLine;
170 <<
") dequeued: " << request->
method <<
" " << request->
url <<
" HTTP/" << request->
httpMajor <<
"."
184 const std::string requestLine = std::string(currentRequest->
method)
186 .append(currentRequest->
url)
188 .append(std::to_string(currentRequest->
httpMajor))
190 .append(std::to_string(currentRequest->
httpMinor));
200 if (!masterRequest.expired()) {
204 <<
") dequeued: " << request->
method <<
" " << request->
url <<
" HTTP/" << request->
httpMajor <<
"."
213 <<
") deliver failed: " << requestLine;
231 const std::string requestLine = std::string(request->
method)
233 .append(request->
url)
235 .append(std::to_string(request->
httpMajor))
237 .append(std::to_string(request->
httpMinor));
240 <<
"): " << requestLine;
256 const std::string requestLine = std::string(request->
method)
258 .append(request->
url)
260 .append(std::to_string(request->
httpMajor))
262 .append(std::to_string(request->
httpMinor));
265 <<
") for request (" << request->
count <<
"): " << requestLine
266 << std::string(request->
method)
268 .append(request->
url)
270 .append(std::to_string(request->
httpMajor))
272 .append(std::to_string(request->
httpMinor));
291 if (!masterRequest.expired()) {
295 <<
"): " << request->
method <<
" " << request->
url <<
" HTTP/" << request->
httpMajor <<
"."
318 std::size_t consumed = 0;
333 const std::shared_ptr<Response> response(
new Response
());
338 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)
void shutdownWrite(bool forceClose=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 CiStringMap< 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
void setSseEventReceiver(const std::function< std::size_t()> &onServerSentEvent)
void deliverResponseParseError(int status, const std::string &reason)
void onDisconnected() override
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 web::http::CiStringMap< 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)