20#include <xrpl/basics/Log.h> 
   21#include <xrpl/beast/core/LexicalCast.h> 
   22#include <xrpl/net/AutoSocket.h> 
   23#include <xrpl/net/HTTPClient.h> 
   24#include <xrpl/net/HTTPClientSSLContext.h> 
   26#include <boost/asio.hpp> 
   27#include <boost/asio/ip/resolver_query_base.hpp> 
   28#include <boost/asio/ip/tcp.hpp> 
   29#include <boost/asio/ssl.hpp> 
   30#include <boost/regex.hpp> 
   59        boost::asio::io_context& io_context,
 
   60        unsigned short const port,
 
 
   78        boost::asio::streambuf& sb,
 
   83        osRequest << 
"GET " << strPath
 
   89                     "Connection: close\r\n\r\n";
 
 
   99            void(boost::asio::streambuf& sb, 
std::string const& strHost)> build,
 
  102            boost::system::error_code 
const& ecResult,
 
 
  123            boost::system::error_code 
const& ecResult,
 
  137                std::placeholders::_1,
 
  138                std::placeholders::_2),
 
 
  153            boost::asio::ip::resolver_query_base::numeric_service);
 
  160        catch (boost::system::system_error 
const& e)
 
  168                std::placeholders::_1));
 
  182                    std::placeholders::_1,
 
  183                    std::placeholders::_2));
 
 
  193        if (ecResult == boost::asio::error::operation_aborted)
 
  196            JLOG(
j_.
trace()) << 
"Deadline cancelled.";
 
  203                             << ecResult.message();
 
  210            JLOG(
j_.
trace()) << 
"Deadline arrived.";
 
  215                boost::system::errc::bad_address,
 
  216                boost::system::system_category()};
 
  225                std::placeholders::_1));
 
 
  235                             << ecResult.message();
 
 
  241        boost::system::error_code 
const& ecResult,
 
  242        boost::asio::ip::tcp::resolver::results_type result)
 
  260            JLOG(
j_.
trace()) << 
"Resolve complete.";
 
  262            boost::asio::async_connect(
 
  268                    std::placeholders::_1));
 
 
  285            JLOG(
j_.
trace()) << 
"Connected.";
 
  304                AutoSocket::ssl_socket::client,
 
  308                    std::placeholders::_1));
 
 
  330            JLOG(
j_.
trace()) << 
"Session started.";
 
  339                    std::placeholders::_1,
 
  340                    std::placeholders::_2));
 
 
  346        boost::system::error_code 
const& ecResult,
 
  368                    std::placeholders::_1,
 
  369                    std::placeholders::_2));
 
 
  375        boost::system::error_code 
const& ecResult,
 
  381        JLOG(
j_.
trace()) << 
"Header: \"" << strHeader << 
"\"";
 
  383        static boost::regex reStatus{
 
  384            "\\`HTTP/1\\S+ (\\d{3}) .*\\'"};  
 
  385        static boost::regex reSize{
 
  386            "\\`.*\\r\\nContent-Length:\\s+([0-9]+).*\\'", boost::regex::icase};
 
  387        static boost::regex reBody{
"\\`.*\\r\\n\\r\\n(.*)\\'"};
 
  389        boost::smatch smMatch;
 
  391        if (!boost::regex_match(strHeader, smMatch, reStatus))
 
  394            JLOG(
j_.
trace()) << 
"No status code";
 
  396                boost::system::errc::bad_address,
 
  397                boost::system::system_category()});
 
  403        if (boost::regex_match(strHeader, smMatch, reBody))  
 
  407            if (boost::regex_match(strHeader, smMatch, reSize))
 
  408                return beast::lexicalCast<std::size_t>(
 
  415            JLOG(
j_.
trace()) << 
"Response field too large";
 
  417                boost::system::errc::value_too_large,
 
  418                boost::system::system_category()});
 
  422        if (responseSize == 0)
 
  436                boost::asio::transfer_all(),
 
  440                    std::placeholders::_1,
 
  441                    std::placeholders::_2));
 
 
  447        boost::system::error_code 
const& ecResult,
 
  463                JLOG(
j_.
trace()) << 
"Complete.";
 
 
  479        boost::system::error_code 
const& ecResult,
 
  483        boost::system::error_code ecCancel;
 
  488        catch (boost::system::system_error 
const& e)
 
  491                << 
"invokeComplete: Deadline cancel error: " << e.what();
 
  495        JLOG(
j_.
debug()) << 
"invokeComplete: Deadline popping: " 
  511                mComplete(ecResult ? ecResult : ecCancel, iStatus, strData);
 
 
  531        boost::asio::ip::resolver_query_base::flags 
flags;
 
 
  545        boost::system::error_code 
const& ecResult,
 
  550    boost::asio::basic_waitable_timer<std::chrono::steady_clock> 
mDeadline;
 
 
  565    boost::asio::io_context& io_context,
 
  567    unsigned short const port,
 
  572        boost::system::error_code 
const& ecResult,
 
  579    client->get(bSSL, deqSites, strPath, timeout, complete);
 
 
  585    boost::asio::io_context& io_context,
 
  587    unsigned short const port,
 
  592        boost::system::error_code 
const& ecResult,
 
  601    client->get(bSSL, deqSites, strPath, timeout, complete);
 
 
  607    boost::asio::io_context& io_context,
 
  609    unsigned short const port,
 
  615        boost::system::error_code 
const& ecResult,
 
  624    client->request(bSSL, deqSites, setRequest, timeout, complete);
 
 
void async_handshake(handshake_type type, callback cbFunc)
 
void async_write(Buf const &buffers, Handler handler)
 
lowest_layer_type & lowest_layer()
 
void async_read_until(Seq const &buffers, Condition condition, Handler handler)
 
void async_read(Buf const &buffers, Condition cond, Handler handler)
 
void async_shutdown(ShutdownHandler handler)
 
A generic endpoint for log messages.
 
Stream trace() const
Severity stream access functions.
 
void handleWrite(boost::system::error_code const &ecResult, std::size_t bytes_transferred)
 
void makeGet(std::string const &strPath, boost::asio::streambuf &sb, std::string const &strHost)
 
std::shared_ptr< Query > mQuery
 
std::chrono::seconds mTimeout
 
std::function< void(boost::asio::streambuf &sb, std::string const  &strHost)> mBuild
 
std::size_t const maxResponseSize_
 
void handleShutdown(boost::system::error_code const &ecResult)
 
void invokeComplete(boost::system::error_code const &ecResult, int iStatus=0, std::string const &strData="")
 
void get(bool bSSL, std::deque< std::string > deqSites, std::string const &strPath, std::chrono::seconds timeout, std::function< bool(boost::system::error_code const &ecResult, int iStatus, std::string const &strData)> complete)
 
boost::asio::streambuf mHeader
 
boost::asio::ip::tcp::resolver mResolver
 
boost::asio::streambuf mRequest
 
void handleHeader(boost::system::error_code const &ecResult, std::size_t bytes_transferred)
 
void handleConnect(boost::system::error_code const &ecResult)
 
std::function< bool(boost::system::error_code const  &ecResult, int iStatus, std::string const  &strData)> mComplete
 
void handleRequest(boost::system::error_code const &ecResult)
 
void handleResolve(boost::system::error_code const &ecResult, boost::asio::ip::tcp::resolver::results_type result)
 
void request(bool bSSL, std::deque< std::string > deqSites, std::function< void(boost::asio::streambuf &sb, std::string const &strHost)> build, std::chrono::seconds timeout, std::function< bool(boost::system::error_code const &ecResult, int iStatus, std::string const &strData)> complete)
 
boost::asio::basic_waitable_timer< std::chrono::steady_clock > mDeadline
 
unsigned short const mPort
 
std::deque< std::string > mDeqSites
 
void handleData(boost::system::error_code const &ecResult, std::size_t bytes_transferred)
 
void handleDeadline(boost::system::error_code const &ecResult)
 
boost::asio::streambuf mResponse
 
boost::system::error_code mShutdown
 
HTTPClientImp(boost::asio::io_context &io_context, unsigned short const port, std::size_t maxResponseSize, beast::Journal &j)
 
Provides an asynchronous HTTP client implementation with optional SSL.
 
static void request(bool bSSL, boost::asio::io_context &io_context, std::string strSite, unsigned short const port, std::function< void(boost::asio::streambuf &sb, std::string const &strHost)> build, std::size_t responseMax, std::chrono::seconds timeout, std::function< bool(boost::system::error_code const &ecResult, int iStatus, std::string const &strData)> complete, beast::Journal &j)
 
static void initializeSSLContext(std::string const &sslVerifyDir, std::string const &sslVerifyFile, bool sslVerify, beast::Journal j)
 
static void get(bool bSSL, boost::asio::io_context &io_context, std::deque< std::string > deqSites, unsigned short const port, std::string const &strPath, std::size_t responseMax, std::chrono::seconds timeout, std::function< bool(boost::system::error_code const &ecResult, int iStatus, std::string const &strData)> complete, beast::Journal &j)
 
static constexpr auto maxClientHeaderBytes
 
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
 
static std::optional< HTTPClientSSLContext > httpClientSSLContext
 
T shared_from_this(T... args)
 
boost::asio::ip::resolver_query_base::flags flags