SNode.C
Loading...
Searching...
No Matches
web::http::client::MasterRequest Class Reference

#include <Request.h>

Inheritance diagram for web::http::client::MasterRequest:
Collaboration diagram for web::http::client::MasterRequest:

Public Member Functions

 MasterRequest (SocketContext *socketContext, const std::string &hostFieldValue)
 MasterRequest (MasterRequest &)=delete
 MasterRequest (MasterRequest &&) noexcept
MasterRequestoperator= (MasterRequest &)=delete
MasterRequestoperator= (MasterRequest &&) noexcept=delete
 ~MasterRequest () override
void setMasterRequest (const std::shared_ptr< MasterRequest > &masterRequest)
std::shared_ptr< MasterRequestgetMasterRequest () const
SocketContextgetSocketContext () const
void init ()
void disconnect ()
bool isConnected () const
bool send (const char *chunk, std::size_t chunkLen, const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> &onResponseReceived, const std::function< void(const std::shared_ptr< Request > &, const std::string &)> &onResponseParseError)
bool send (const std::string &chunk, const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> &onResponseReceived, const std::function< void(const std::shared_ptr< Request > &, const std::string &)> &onResponseParseError)
bool upgrade (const std::string &url, const std::string &protocols, const std::function< void(bool)> &onUpgradeInitiate, const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &, bool)> &onResponseReceived, const std::function< void(const std::shared_ptr< Request > &, const std::string &)> &onResponseParseError)
bool sendFile (const std::string &file, const std::function< void(int errnum)> &onStatus, const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> &onResponseReceived, const std::function< void(const std::shared_ptr< Request > &, const std::string &)> &onResponseParseError)
MasterRequestsendHeader ()
MasterRequestsendFragment (const char *chunk, std::size_t chunkLen)
MasterRequestsendFragment (const std::string &data)
bool end (const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> &onResponseReceived, const std::function< void(const std::shared_ptr< Request > &, const std::string &)> &onResponseParseError)
Public Member Functions inherited from web::http::client::Request
 Request (const std::string &connectionName, const std::string &host)
 Request (Request &)=delete
Requestoperator= (Request &)=delete
Requestoperator= (Request &&) noexcept=delete
std::string getConnectionName () const
Requesthost (const std::string &hostFieldValue)
Requestappend (const std::string &field, const std::string &value)
Requestset (const std::string &field, const std::string &value, bool overwrite=true)
Requestset (const std::map< std::string, std::string > &headers, bool overwrite=true)
Requesttype (const std::string &type)
Requestcookie (const std::string &name, const std::string &value)
Requestcookie (const std::map< std::string, std::string > &cookies)
Requestquery (const std::string &key, const std::string &value)
RequestsetTrailer (const std::string &field, const std::string &value, bool overwrite=true)
std::string header (const std::string &field) const
const std::map< std::string, std::string > & getQueries () const
const CiStringMap< std::string > & getHeaders () const
const CiStringMap< std::string > & getTrailer () const
const CiStringMap< std::string > & getCookies () const
Public Member Functions inherited from core::pipe::Sink
 Sink (Sink &)=delete
Sinkoperator= (Sink &)=delete

Private Member Functions

bool requestEventSource (const std::string &url, const std::function< std::size_t()> &onServerSentEvent, const std::function< void()> &onOpen, const std::function< void()> &onError)
bool initiate (const std::shared_ptr< MasterRequest > &request)
bool executeSendFile (const std::string &file, const std::function< void(int)> &onStatus)
bool executeUpgrade (const std::string &url, const std::string &protocols, const std::function< void(bool)> &onStatus)
bool executeSendHeader ()
bool executeSendFragment (const char *chunk, std::size_t chunkLen)
bool executeEnd ()
bool executeSse ()
void requestPrepared (const std::shared_ptr< MasterRequest > &request)
void requestDelivered ()
void deliverResponse (const std::shared_ptr< MasterRequest > &request, const std::shared_ptr< Response > &response)
void deliverResponseParseError (const std::shared_ptr< MasterRequest > &request, const std::string &message)
void onSourceConnect (core::pipe::Source *source) override
void onSourceData (const char *chunk, std::size_t chunkLen) override
void onSourceEof () override
void onSourceError (int errnum) override

Private Attributes

std::list< RequestCommand * > requestCommands
std::size_t contentLengthSent = 0
std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> onResponseReceived
std::function< void(const std::shared_ptr< Request > &, const std::string &message)> onResponseParseError
web::http::client::SocketContextsocketContext
std::weak_ptr< MasterRequestmasterRequest

Friends

class commands::SendFileCommand
class commands::SendFragmentCommand
class commands::SendHeaderCommand
class commands::UpgradeCommand
class commands::EndCommand
class commands::SseCommand
class SocketContext
template<typename Client>
class tools::EventSourceT

Additional Inherited Members

Public Attributes inherited from web::http::client::Request
std::string hostFieldValue
std::string method = "GET"
std::string url = "/"
int httpMajor = 1
int httpMinor = 1
std::size_t count {0}
Protected Member Functions inherited from web::http::client::Request
 Request (Request &&request) noexcept
Protected Member Functions inherited from core::pipe::Sink
 Sink ()=default
 Sink (Sink &&) noexcept=default
Sinkoperator= (Sink &&) noexcept=default
virtual ~Sink ()
bool isStreaming () const
void stop ()
Protected Attributes inherited from web::http::client::Request
std::map< std::string, std::string > queries
CiStringMap< std::string > headers
CiStringMap< std::string > cookies
CiStringMap< std::string > trailer
std::string connectionName
std::size_t contentLength = 0
TransferEncoding transferEncoding = TransferEncoding::HTTP10
ConnectionState connectionState = ConnectionState::Default

Detailed Description

Definition at line 144 of file Request.h.

Constructor & Destructor Documentation

◆ MasterRequest() [1/3]

web::http::client::MasterRequest::MasterRequest ( SocketContext * socketContext,
const std::string & hostFieldValue )

Definition at line 264 of file Request.cpp.

265 : Request(socketContext->getSocketConnection()->getConnectionName(), host)
267 this->init();
268 }
web::http::client::SocketContext * socketContext
Definition Request.h:229
Request(const std::string &connectionName, const std::string &host)
Definition Request.cpp:77
Request & host(const std::string &hostFieldValue)
Definition Request.cpp:125

References core::socket::stream::SocketConnection::getConnectionName(), core::socket::stream::SocketContext::getSocketConnection(), init(), web::http::client::Request::Request(), and socketContext.

Here is the call graph for this function:

◆ MasterRequest() [2/3]

web::http::client::MasterRequest::MasterRequest ( MasterRequest & )
explicitdelete

◆ MasterRequest() [3/3]

web::http::client::MasterRequest::MasterRequest ( MasterRequest && request)
explicitnoexcept

Definition at line 270 of file Request.cpp.

271 : Request(std::move(request))
272 , requestCommands(std::move(request.requestCommands))
273 , contentLengthSent(request.contentLengthSent)
274 , onResponseReceived(std::move(request.onResponseReceived))
275 , onResponseParseError(std::move(request.onResponseParseError))
276 , socketContext(request.socketContext)
277 , masterRequest(request.masterRequest) { // NOLINT
278 request.init();
279 }
std::function< void(const std::shared_ptr< Request > &, const std::string &message)> onResponseParseError
Definition Request.h:227
std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> onResponseReceived
Definition Request.h:226
std::list< RequestCommand * > requestCommands
Definition Request.h:222
std::weak_ptr< MasterRequest > masterRequest
Definition Request.h:231

References contentLengthSent, init(), masterRequest, onResponseParseError, onResponseReceived, web::http::client::Request::Request(), requestCommands, and socketContext.

Here is the call graph for this function:

◆ ~MasterRequest()

web::http::client::MasterRequest::~MasterRequest ( )
override

Definition at line 281 of file Request.cpp.

281 {
282 for (const RequestCommand* requestCommand : requestCommands) {
283 delete requestCommand;
284 }
285
286 if (isConnected() && Sink::isStreaming()) {
287 socketContext->streamEof();
288 }
289 }

References isConnected(), core::pipe::Sink::isStreaming(), requestCommands, socketContext, and core::socket::stream::SocketContext::streamEof().

Here is the call graph for this function:

Member Function Documentation

◆ deliverResponse()

void web::http::client::MasterRequest::deliverResponse ( const std::shared_ptr< MasterRequest > & request,
const std::shared_ptr< Response > & response )
private

Definition at line 716 of file Request.cpp.

716 {
717 onResponseReceived(request, response);
718 }

References onResponseReceived.

Referenced by web::http::client::SocketContext::deliverResponse().

Here is the caller graph for this function:

◆ deliverResponseParseError()

void web::http::client::MasterRequest::deliverResponseParseError ( const std::shared_ptr< MasterRequest > & request,
const std::string & message )
private

Definition at line 720 of file Request.cpp.

720 {
721 onResponseParseError(request, message);
722 }

References onResponseParseError.

Referenced by web::http::client::SocketContext::deliverResponseParseError().

Here is the caller graph for this function:

◆ disconnect()

void web::http::client::MasterRequest::disconnect ( )

Definition at line 307 of file Request.cpp.

307 {
308 stop();
309 socketContext = nullptr;
310 }
void stop()
Definition Sink.cpp:70

References socketContext, and core::pipe::Sink::stop().

Referenced by NextTester::dispatchNextRequest(), and web::http::client::SocketContext::onDisconnected().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ end()

bool web::http::client::MasterRequest::end ( const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> & onResponseReceived,
const std::function< void(const std::shared_ptr< Request > &, const std::string &)> & onResponseParseError )

Definition at line 525 of file Request.cpp.

526 {
527 bool queued = true;
528
529 if (isConnected()) {
530 const std::shared_ptr<MasterRequest> newRequest = std::make_shared<MasterRequest>(std::move(*this));
531
532 newRequest->sendHeader();
533
534 newRequest->requestCommands.push_back(new commands::EndCommand(onResponseReceived, onResponseParseError));
535
536 requestPrepared(newRequest);
537 } else {
538 queued = false;
539 }
540
541 return queued;
542 }
void requestPrepared(const std::shared_ptr< MasterRequest > &request)
Definition Request.cpp:712

References web::http::client::commands::EndCommand::EndCommand(), isConnected(), requestCommands, requestPrepared(), and sendHeader().

Referenced by NextTester::dispatchNextRequest().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ executeEnd()

bool web::http::client::MasterRequest::executeEnd ( )
private

Definition at line 656 of file Request.cpp.

656 {
657 return true;
658 }

Referenced by web::http::client::commands::EndCommand::execute(), and executeSendFile().

Here is the caller graph for this function:

◆ executeSendFile()

bool web::http::client::MasterRequest::executeSendFile ( const std::string & file,
const std::function< void(int)> & onStatus )
private

Definition at line 568 of file Request.cpp.

568 {
569 bool atomar = true;
570
571 std::string absolutFileName = file;
572
573 if (std::filesystem::exists(absolutFileName)) {
574 std::error_code ec;
575 absolutFileName = std::filesystem::canonical(absolutFileName);
576
577 if (std::filesystem::is_regular_file(absolutFileName, ec) && !ec) {
578 core::file::FileReader::open(absolutFileName, [this, &absolutFileName, &onStatus, &atomar](int fd) {
579 onStatus(errno);
580
581 if (fd >= 0) {
582 if (httpMajor == 1) {
583 atomar = false;
584
585 set("Content-Type", web::http::MimeTypes::contentType(absolutFileName), false);
586 set("Last-Modified", httputils::file_mod_http_date(absolutFileName), false);
587 if (httpMinor == 1 && contentLength == 0) {
588 set("Transfer-Encoding", "chunked");
589 } else {
590 set("Content-Length", std::to_string(std::filesystem::file_size(absolutFileName) + contentLength));
591 }
592
594 }
595 } else {
596 executeEnd();
597 }
598 })->pipe(this);
599 } else {
600 errno = EINVAL;
601 onStatus(errno);
602 }
603 } else {
604 errno = ENOENT;
605 onStatus(errno);
606 }
607
608 return atomar;
609 }
static FileReader * open(const std::string &path, const std::function< void(int)> &callback)
void pipe(Source *source)
Definition Sink.cpp:58
static std::string contentType(const std::string &file)
Request & set(const std::string &field, const std::string &value, bool overwrite=true)
Definition Request.cpp:143
std::size_t contentLength
Definition Request.h:136
std::string file_mod_http_date(const std::string &filePath)

References web::http::client::Request::contentLength, web::http::MimeTypes::contentType(), executeEnd(), executeSendHeader(), httputils::file_mod_http_date(), web::http::client::Request::httpMajor, web::http::client::Request::httpMinor, core::file::FileReader::open(), core::pipe::Source::pipe(), and web::http::client::Request::set().

Referenced by web::http::client::commands::SendFileCommand::execute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ executeSendFragment()

bool web::http::client::MasterRequest::executeSendFragment ( const char * chunk,
std::size_t chunkLen )
private

Definition at line 696 of file Request.cpp.

696 {
698 socketContext->sendToPeer(to_hex_str(chunkLen).append("\r\n"));
699 }
700
701 socketContext->sendToPeer(chunk, chunkLen);
702 contentLengthSent += chunkLen;
703
705 socketContext->sendToPeer("\r\n");
706 contentLength += chunkLen;
707 }
708
709 return true;
710 }
TransferEncoding transferEncoding
Definition Request.h:138
Request & append(const std::string &field, const std::string &value)
Definition Request.cpp:131
#define to_hex_str(int_val)
Definition Request.cpp:73

References web::http::Chunked, web::http::client::Request::contentLength, contentLengthSent, core::socket::SocketContext::sendToPeer(), core::socket::stream::SocketContext::sendToPeer(), socketContext, and web::http::client::Request::transferEncoding.

Referenced by web::http::client::commands::SendFragmentCommand::execute(), onSourceData(), and requestDelivered().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ executeSendHeader()

bool web::http::client::MasterRequest::executeSendHeader ( )
private

Definition at line 664 of file Request.cpp.

664 {
665 const std::string httpVersion = "HTTP/" + std::to_string(httpMajor) + "." + std::to_string(httpMinor);
666
667 std::string queryString;
668 if (!queries.empty()) {
669 queryString += "?";
670 for (auto& [key, value] : queries) {
671 queryString += httputils::url_encode(key) + "=" + httputils::url_encode(value) + "&";
672 }
673 queryString.pop_back();
674 }
675
676 socketContext->sendToPeer(method + " " + url + queryString + " " + httpVersion + "\r\n");
677 socketContext->sendToPeer("Date: " + httputils::to_http_date() + "\r\n");
678
679 if (!headers.contains("Transfer-Encoding") && contentLength > 0) {
680 set("Content-Length", std::to_string(contentLength));
681 }
682
683 for (const auto& [field, value] : headers) {
684 socketContext->sendToPeer(std::string(field).append(":").append(value).append("\r\n"));
685 }
686
687 for (const auto& [name, value] : cookies) {
688 socketContext->sendToPeer(std::string("Cookie:").append(name).append("=").append(value).append("\r\n"));
689 }
690
691 socketContext->sendToPeer("\r\n");
692
693 return true;
694 }
CiStringMap< std::string > headers
Definition Request.h:130
std::map< std::string, std::string > queries
Definition Request.h:129
CiStringMap< std::string > cookies
Definition Request.h:131
std::string url_encode(const std::string &text)
std::string to_http_date(struct tm *tm=nullptr)

References web::http::client::Request::contentLength, web::http::client::Request::cookies, web::http::client::Request::headers, web::http::client::Request::httpMajor, web::http::client::Request::httpMinor, web::http::client::Request::method, web::http::client::Request::queries, core::socket::SocketContext::sendToPeer(), web::http::client::Request::set(), socketContext, httputils::to_http_date(), web::http::client::Request::url, and httputils::url_encode().

Referenced by web::http::client::commands::SendHeaderCommand::execute(), executeSendFile(), and executeUpgrade().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ executeSse()

bool web::http::client::MasterRequest::executeSse ( )
private

Definition at line 660 of file Request.cpp.

660 {
661 return true;
662 }

Referenced by web::http::client::commands::SseCommand::execute().

Here is the caller graph for this function:

◆ executeUpgrade()

bool web::http::client::MasterRequest::executeUpgrade ( const std::string & url,
const std::string & protocols,
const std::function< void(bool)> & onStatus )
private

Definition at line 611 of file Request.cpp.

611 {
612 this->url = url;
613
614 set("Connection", "Upgrade", true);
615 set("Upgrade", protocols, true);
616
617 web::http::client::SocketContextUpgradeFactory* socketContextUpgradeFactory =
619
620 if (socketContextUpgradeFactory != nullptr) {
621 LOG(DEBUG) << connectionName << " HTTP: "
622 << "SocketContextUpgradeFactory create success: " << socketContextUpgradeFactory->name();
623 LOG(DEBUG) << connectionName << " HTTP: Initiating upgrade: " << method << " " << url
624 << " HTTP/" + std::to_string(httpMajor) + "." + std::to_string(httpMinor);
625
626 } else {
627 LOG(DEBUG) << connectionName << " HTTP: "
628 << "SocketContextUpgradeFactory create failed: " << protocols;
629 LOG(DEBUG) << connectionName << " HTTP: Not initiating upgrade " << method << " " << url
630 << " HTTP/" + std::to_string(httpMajor) + "." + std::to_string(httpMinor);
631 }
632
633 LOG(DEBUG) << connectionName << " HTTP: Upgrade request:\n"
635 url,
636 "HTTP/" + std::to_string(httpMajor) + "." + std::to_string(httpMinor),
637 queries,
638 headers,
639 trailer,
640 cookies,
641 std::vector<char>());
642
643 onStatus(socketContextUpgradeFactory != nullptr);
644
645 if (socketContextUpgradeFactory != nullptr) {
647
648 socketContextUpgradeFactory->checkRefCount();
649 } else {
650 socketContext->close();
651 }
652
653 return true;
654 }
#define LOG(level)
Definition Logger.h:148
CiStringMap< std::string > trailer
Definition Request.h:132
std::string connectionName
Definition Request.h:134
SocketContextUpgradeFactory * select(const std::string &protocols, Request &req)
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)

References web::http::client::SocketContextUpgradeFactory::checkRefCount(), core::socket::stream::SocketContext::close(), web::http::client::Request::connectionName, web::http::client::Request::cookies, logger::DEBUG, executeSendHeader(), web::http::client::Request::headers, web::http::client::Request::httpMajor, web::http::client::Request::httpMinor, web::http::client::SocketContextUpgradeFactorySelector::instance(), logger::LogMessage::LogMessage(), web::http::client::Request::method, web::http::SocketContextUpgradeFactory< RequestT, ResponseT >::name(), web::http::client::Request::queries, web::http::client::SocketContextUpgradeFactorySelector::select(), web::http::client::Request::set(), socketContext, httputils::toString(), web::http::client::Request::trailer, and web::http::client::Request::url.

Referenced by web::http::client::commands::UpgradeCommand::execute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getMasterRequest()

std::shared_ptr< MasterRequest > web::http::client::MasterRequest::getMasterRequest ( ) const

Definition at line 113 of file Request.cpp.

113 {
114 return masterRequest.lock();
115 }

References masterRequest.

◆ getSocketContext()

SocketContext * web::http::client::MasterRequest::getSocketContext ( ) const

Definition at line 117 of file Request.cpp.

117 {
118 return socketContext;
119 }

References socketContext.

Referenced by web::http::client::SocketContext::initiateRequest(), main(), web::http::client::SocketContext::requestCompleted(), web::http::client::SocketContext::requestDelivered(), requestEventSource(), and upgrade().

Here is the caller graph for this function:

◆ init()

◆ initiate()

bool web::http::client::MasterRequest::initiate ( const std::shared_ptr< MasterRequest > & request)
private

Definition at line 544 of file Request.cpp.

544 {
545 bool error = false;
546 bool atomar = true;
547
548 for (RequestCommand* requestCommand : requestCommands) {
549 if (!error) {
550 this->onResponseParseError = requestCommand->onResponseParseError;
551 this->onResponseReceived = requestCommand->onResponseReceived;
552
553 atomar = requestCommand->execute(request);
554 error = requestCommand->getError();
555 }
556
557 delete requestCommand;
558 }
559 requestCommands.clear();
560
561 if (atomar && !error) {
563 }
564
565 return !error;
566 }

References web::http::client::RequestCommand::execute(), web::http::client::RequestCommand::getError(), onResponseParseError, web::http::client::RequestCommand::onResponseParseError, onResponseReceived, web::http::client::RequestCommand::onResponseReceived, requestCommands, and requestDelivered().

Referenced by web::http::client::SocketContext::initiateRequest().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ isConnected()

bool web::http::client::MasterRequest::isConnected ( ) const

Definition at line 121 of file Request.cpp.

121 {
122 return socketContext != nullptr;
123 }

References socketContext.

Referenced by NextTester::dispatchNextRequest(), end(), onSourceConnect(), onSourceData(), onSourceEof(), onSourceError(), requestDelivered(), requestEventSource(), send(), sendFile(), sendFragment(), sendHeader(), upgrade(), and ~MasterRequest().

Here is the caller graph for this function:

◆ onSourceConnect()

void web::http::client::MasterRequest::onSourceConnect ( core::pipe::Source * source)
overrideprivatevirtual

Implements core::pipe::Sink.

Definition at line 741 of file Request.cpp.

741 {
742 if (isConnected()) {
743 if (socketContext->streamToPeer(source)) {
744 source->start();
745 }
746 } else {
747 source->stop();
748 }
749 }
Source * source
Definition Sink.h:90

References isConnected(), socketContext, core::pipe::Source::start(), core::pipe::Source::stop(), and core::socket::stream::SocketContext::streamToPeer().

Here is the call graph for this function:

◆ onSourceData()

void web::http::client::MasterRequest::onSourceData ( const char * chunk,
std::size_t chunkLen )
overrideprivatevirtual

Implements core::pipe::Sink.

Definition at line 751 of file Request.cpp.

751 {
752 if (isConnected()) {
753 executeSendFragment(chunk, chunkLen);
754 }
755 }
bool executeSendFragment(const char *chunk, std::size_t chunkLen)
Definition Request.cpp:696

References executeSendFragment(), and isConnected().

Here is the call graph for this function:

◆ onSourceEof()

void web::http::client::MasterRequest::onSourceEof ( )
overrideprivatevirtual

Implements core::pipe::Sink.

Definition at line 757 of file Request.cpp.

757 {
758 if (isConnected()) {
759 socketContext->streamEof();
760
762 }
763 }

References isConnected(), requestDelivered(), socketContext, and core::socket::stream::SocketContext::streamEof().

Here is the call graph for this function:

◆ onSourceError()

void web::http::client::MasterRequest::onSourceError ( int errnum)
overrideprivatevirtual

Implements core::pipe::Sink.

Definition at line 765 of file Request.cpp.

765 {
766 errno = errnum;
767
768 if (isConnected()) {
769 socketContext->streamEof();
770 socketContext->close();
771
773 }
774 }

References core::socket::stream::SocketContext::close(), isConnected(), requestDelivered(), socketContext, and core::socket::stream::SocketContext::streamEof().

Here is the call graph for this function:

◆ operator=() [1/2]

MasterRequest & web::http::client::MasterRequest::operator= ( MasterRequest && )
deletenoexcept

◆ operator=() [2/2]

MasterRequest & web::http::client::MasterRequest::operator= ( MasterRequest & )
delete

◆ requestDelivered()

void web::http::client::MasterRequest::requestDelivered ( )
private

Definition at line 724 of file Request.cpp.

724 {
725 if (isConnected()) {
727 executeSendFragment("", 0); // For transfer encoding chunked. Terminate the chunk sequence.
728
729 if (!trailer.empty()) {
730 for (auto& [field, value] : trailer) {
731 socketContext->sendToPeer(std::string(field).append(":").append(value).append("\r\n"));
732 }
733 socketContext->sendToPeer("\r\n");
734 }
735 }
736
737 socketContext->requestDelivered(contentLengthSent == contentLength);
738 }
739 }

References web::http::Chunked, web::http::client::Request::contentLength, contentLengthSent, executeSendFragment(), isConnected(), web::http::client::SocketContext::requestDelivered(), core::socket::SocketContext::sendToPeer(), socketContext, web::http::client::Request::trailer, and web::http::client::Request::transferEncoding.

Referenced by initiate(), onSourceEof(), and onSourceError().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ requestEventSource()

bool web::http::client::MasterRequest::requestEventSource ( const std::string & url,
const std::function< std::size_t()> & onServerSentEvent,
const std::function< void()> & onOpen,
const std::function< void()> & onError )
private

Definition at line 434 of file Request.cpp.

437 {
438 if (isConnected()) {
439 const std::shared_ptr<MasterRequest> newRequest = std::make_shared<MasterRequest>(std::move(*this));
440
441 newRequest->url = url;
442 newRequest->httpMajor = 1;
443 newRequest->httpMinor = 1;
444
445 newRequest->set("Connection", "keep-alive", true);
446 newRequest->set("Accept", "text/event-stream", true);
447 newRequest->set("Cache-Control", "no-cache", true);
448
449 newRequest->sendHeader();
450
451 newRequest->requestCommands.push_back(new commands::SseCommand(
452 [masterRequest = this->masterRequest, onServerSentEvent, onOpen, onError](const std::shared_ptr<Request>& request,
453 const std::shared_ptr<Response>& response) {
454 if (!masterRequest.expired() && masterRequest.lock()->isConnected()) {
455 if (web::http::ciContains(response->headers["Content-Type"], "text/event-stream") &&
456 web::http::ciContains(request->header("Accept"), "text/event-stream")) {
457 masterRequest.lock()->getSocketContext()->setSseEventReceiver(onServerSentEvent);
458
459 onOpen();
460 } else {
461 masterRequest.lock()->getSocketContext()->close();
462
463 onError();
464 }
465 }
466 },
467 [masterRequest = this->masterRequest, connectionName = this->connectionName, onError](
468 [[maybe_unused]] const std::shared_ptr<Request>& request, const std::string& status) {
469 if (!masterRequest.expired() && masterRequest.lock()->isConnected()) {
470 LOG(DEBUG) << connectionName << " error in response: " << status;
471 masterRequest.lock()->getSocketContext()->close();
472 onError();
473 }
474 }));
475
476 requestPrepared(newRequest);
477 }
478
479 return isConnected();
480 }
bool ciContains(const std::string &str1, const std::string &str2)

References web::http::ciContains(), core::socket::stream::SocketContext::close(), logger::DEBUG, getSocketContext(), web::http::client::Request::header(), web::http::client::Response::headers, web::http::client::Request::httpMajor, web::http::client::Request::httpMinor, isConnected(), logger::LogMessage::LogMessage(), requestCommands, requestPrepared(), sendHeader(), web::http::client::Request::set(), web::http::client::SocketContext::setSseEventReceiver(), web::http::client::commands::SseCommand::SseCommand(), and web::http::client::Request::url.

Here is the call graph for this function:

◆ requestPrepared()

void web::http::client::MasterRequest::requestPrepared ( const std::shared_ptr< MasterRequest > & request)
private

Definition at line 712 of file Request.cpp.

712 {
713 socketContext->requestPrepared(request);
714 }

References web::http::client::SocketContext::requestPrepared(), and socketContext.

Referenced by end(), requestEventSource(), send(), sendFile(), and upgrade().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ send() [1/2]

bool web::http::client::MasterRequest::send ( const char * chunk,
std::size_t chunkLen,
const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> & onResponseReceived,
const std::function< void(const std::shared_ptr< Request > &, const std::string &)> & onResponseParseError )

Definition at line 313 of file Request.cpp.

316 {
317 bool queued = true;
318
319 if (isConnected()) {
320 const std::shared_ptr<MasterRequest> newRequest = std::make_shared<MasterRequest>(std::move(*this));
321
322 if (chunkLen > 0) {
323 newRequest->set("Content-Type", "application/octet-stream", false);
324 }
325
326 newRequest->sendHeader();
327 newRequest->sendFragment(chunk, chunkLen);
328
329 newRequest->requestCommands.push_back(new commands::EndCommand(onResponseReceived, onResponseParseError));
330
331 newRequest->requestPrepared(newRequest);
332
333 } else {
334 queued = false;
335 }
336
337 return queued;
338 }

References web::http::client::commands::EndCommand::EndCommand(), isConnected(), requestCommands, requestPrepared(), sendFragment(), sendHeader(), and web::http::client::Request::set().

Referenced by send().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ send() [2/2]

bool web::http::client::MasterRequest::send ( const std::string & chunk,
const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> & onResponseReceived,
const std::function< void(const std::shared_ptr< Request > &, const std::string &)> & onResponseParseError )

Definition at line 341 of file Request.cpp.

343 {
344 if (!chunk.empty()) {
345 set("Content-Type", "text/html; charset=utf-8", false);
346 }
347
348 return send(chunk.data(), chunk.size(), onResponseReceived, onResponseParseError);
349 }
bool send(const char *chunk, std::size_t chunkLen, const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> &onResponseReceived, const std::function< void(const std::shared_ptr< Request > &, const std::string &)> &onResponseParseError)
Definition Request.cpp:313

References send(), and web::http::client::Request::set().

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sendFile()

bool web::http::client::MasterRequest::sendFile ( const std::string & file,
const std::function< void(int errnum)> & onStatus,
const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> & onResponseReceived,
const std::function< void(const std::shared_ptr< Request > &, const std::string &)> & onResponseParseError )

Definition at line 482 of file Request.cpp.

486 {
487 bool queued = false;
488
489 if (isConnected()) {
490 const std::shared_ptr<MasterRequest> newRequest = std::make_shared<MasterRequest>(std::move(*this));
491
492 newRequest->requestCommands.push_back(new commands::SendFileCommand(file, onStatus, onResponseReceived, onResponseParseError));
493
494 requestPrepared(newRequest);
495
496 queued = true;
497 }
498
499 return queued;
500 }

References isConnected(), requestCommands, requestPrepared(), and web::http::client::commands::SendFileCommand::SendFileCommand().

Here is the call graph for this function:

◆ sendFragment() [1/2]

MasterRequest & web::http::client::MasterRequest::sendFragment ( const char * chunk,
std::size_t chunkLen )

Definition at line 510 of file Request.cpp.

510 {
511 if (isConnected()) {
512 contentLength += chunkLen;
513
514 requestCommands.push_back(new commands::SendFragmentCommand(chunk, chunkLen));
515 }
516
517 return *this;
518 }

References web::http::client::Request::contentLength, isConnected(), requestCommands, and web::http::client::commands::SendFragmentCommand::SendFragmentCommand().

Referenced by send(), and sendFragment().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sendFragment() [2/2]

MasterRequest & web::http::client::MasterRequest::sendFragment ( const std::string & data)

Definition at line 520 of file Request.cpp.

520 {
521 return sendFragment(data.data(), data.size());
522 }
MasterRequest & sendFragment(const char *chunk, std::size_t chunkLen)
Definition Request.cpp:510

References sendFragment().

Here is the call graph for this function:

◆ sendHeader()

MasterRequest & web::http::client::MasterRequest::sendHeader ( )

Definition at line 502 of file Request.cpp.

502 {
503 if (isConnected()) {
504 requestCommands.push_back(new commands::SendHeaderCommand());
505 }
506
507 return *this;
508 }

References isConnected(), requestCommands, and web::http::client::commands::SendHeaderCommand::SendHeaderCommand().

Referenced by end(), requestEventSource(), and send().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ setMasterRequest()

void web::http::client::MasterRequest::setMasterRequest ( const std::shared_ptr< MasterRequest > & masterRequest)

Definition at line 109 of file Request.cpp.

109 {
111 }

References masterRequest.

◆ upgrade()

bool web::http::client::MasterRequest::upgrade ( const std::string & url,
const std::string & protocols,
const std::function< void(bool)> & onUpgradeInitiate,
const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &, bool)> & onResponseReceived,
const std::function< void(const std::shared_ptr< Request > &, const std::string &)> & onResponseParseError )

Definition at line 351 of file Request.cpp.

356 {
357 if (isConnected()) {
358 masterRequest.lock()->url = url;
359
360 masterRequest.lock()->requestCommands.push_back(new commands::UpgradeCommand(
361 url,
362 protocols,
363 onUpgradeInitiate,
365 const std::shared_ptr<Request>& request, const std::shared_ptr<Response>& response) {
366 if (!masterRequest.expired() && masterRequest.lock()->isConnected()) {
367 LOG(DEBUG) << connectionName << " HTTP upgrade: Response to upgrade request: " << request->method << " "
368 << request->url << " "
369 << "HTTP/" << request->httpMajor << "." << request->httpMinor << "\n"
370 << httputils::toString(response->httpVersion,
371 response->statusCode,
372 response->reason,
373 response->headers,
374 response->cookies,
375 response->body);
376
377 std::string socketContextUpgradeName;
378
379 if (web::http::ciContains(response->get("connection"), "Upgrade")) {
380 SocketContextUpgradeFactory* socketContextUpgradeFactory =
382
383 if (socketContextUpgradeFactory != nullptr) {
384 socketContextUpgradeName = socketContextUpgradeFactory->name();
385
386 LOG(DEBUG) << connectionName
387 << " HTTP upgrade: SocketContextUpgradeFactory create success for: " << socketContextUpgradeName;
388
389 core::socket::stream::SocketContext* socketContextUpgrade =
390 socketContextUpgradeFactory->create(masterRequest.lock()->getSocketContext()->getSocketConnection());
391
392 if (socketContextUpgrade != nullptr) {
393 LOG(DEBUG) << connectionName
394 << " HTTP upgrade: SocketContextUpgrade create success for: " << socketContextUpgradeName;
395 masterRequest.lock()->getSocketContext()->getSocketConnection()->setSocketContext(socketContextUpgrade);
396 } else {
397 LOG(DEBUG) << connectionName
398 << " HTTP upgrade: SocketContextUpgrade create failed for: " << socketContextUpgradeName;
399
400 masterRequest.lock()->getSocketContext()->close();
401 }
402 } else {
403 LOG(DEBUG) << connectionName << " HTTP upgrade: SocketContextUpgradeFactory not supported by server: "
404 << request->header("upgrade");
405
406 masterRequest.lock()->getSocketContext()->close();
407 }
408 } else {
409 LOG(DEBUG) << connectionName << " HTTP upgrade: No upgrade requested";
410
411 masterRequest.lock()->getSocketContext()->close();
412 }
413
414 LOG(DEBUG) << connectionName << " HTTP upgrade: bootstrap "
415 << (!socketContextUpgradeName.empty() ? "success" : "failed");
416 LOG(DEBUG) << " Protocol selected: " << socketContextUpgradeName;
417 LOG(DEBUG) << " requested: " << request->header("upgrade");
418 LOG(DEBUG) << " Subprotocol selected: " << response->get("Sec-WebSocket-Protocol");
419 LOG(DEBUG) << " requested: " << request->header("Sec-WebSocket-Protocol");
420
421 onResponseReceived(request, response, !socketContextUpgradeName.empty());
422 }
423 },
425
426 const std::shared_ptr<MasterRequest> newRequest = std::make_shared<MasterRequest>(std::move(*this));
427
428 requestPrepared(newRequest);
429 }
430
431 return isConnected();
432 }

References web::http::client::Response::body, web::http::ciContains(), core::socket::stream::SocketContext::close(), web::http::client::Response::cookies, web::http::SocketContextUpgradeFactory< RequestT, ResponseT >::create(), logger::DEBUG, web::http::client::Response::get(), core::socket::stream::SocketContext::getSocketConnection(), getSocketContext(), web::http::client::Request::header(), web::http::client::Response::headers, web::http::client::Request::httpMajor, web::http::client::Request::httpMinor, web::http::client::Response::httpVersion, web::http::client::SocketContextUpgradeFactorySelector::instance(), isConnected(), logger::LogMessage::LogMessage(), masterRequest, web::http::client::Request::method, web::http::SocketContextUpgradeFactory< RequestT, ResponseT >::name(), web::http::client::Response::reason, requestCommands, requestPrepared(), web::http::client::SocketContextUpgradeFactorySelector::select(), core::socket::stream::SocketConnection::setSocketContext(), web::http::client::Response::statusCode, httputils::toString(), web::http::client::commands::UpgradeCommand::UpgradeCommand(), and web::http::client::Request::url.

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ commands::EndCommand

friend class commands::EndCommand
friend

Definition at line 201 of file Request.h.

◆ commands::SendFileCommand

friend class commands::SendFileCommand
friend

Definition at line 197 of file Request.h.

◆ commands::SendFragmentCommand

friend class commands::SendFragmentCommand
friend

Definition at line 198 of file Request.h.

◆ commands::SendHeaderCommand

friend class commands::SendHeaderCommand
friend

Definition at line 199 of file Request.h.

◆ commands::SseCommand

friend class commands::SseCommand
friend

Definition at line 202 of file Request.h.

◆ commands::UpgradeCommand

friend class commands::UpgradeCommand
friend

Definition at line 200 of file Request.h.

◆ SocketContext

friend class SocketContext
friend

Definition at line 233 of file Request.h.

◆ tools::EventSourceT

template<typename Client>
friend class tools::EventSourceT
friend

Definition at line 236 of file Request.h.

Member Data Documentation

◆ contentLengthSent

std::size_t web::http::client::MasterRequest::contentLengthSent = 0
private

Definition at line 224 of file Request.h.

Referenced by executeSendFragment(), init(), MasterRequest(), and requestDelivered().

◆ masterRequest

std::weak_ptr<MasterRequest> web::http::client::MasterRequest::masterRequest
private

Definition at line 231 of file Request.h.

Referenced by getMasterRequest(), MasterRequest(), setMasterRequest(), and upgrade().

◆ onResponseParseError

std::function<void(const std::shared_ptr<Request>&, const std::string& message)> web::http::client::MasterRequest::onResponseParseError
private

Definition at line 227 of file Request.h.

Referenced by deliverResponseParseError(), initiate(), and MasterRequest().

◆ onResponseReceived

std::function<void(const std::shared_ptr<Request>&, const std::shared_ptr<Response>&)> web::http::client::MasterRequest::onResponseReceived
private

Definition at line 226 of file Request.h.

Referenced by deliverResponse(), initiate(), and MasterRequest().

◆ requestCommands

std::list<RequestCommand*> web::http::client::MasterRequest::requestCommands
private

◆ socketContext


The documentation for this class was generated from the following files: