20 #include <ripple/basics/contract.h>
21 #include <ripple/basics/Log.h>
22 #include <ripple/basics/StringUtilities.h>
23 #include <ripple/net/HTTPClient.h>
24 #include <ripple/net/HTTPClientSSLContext.h>
25 #include <ripple/net/AutoSocket.h>
26 #include <ripple/beast/core/LexicalCast.h>
27 #include <boost/asio.hpp>
28 #include <boost/asio/ssl.hpp>
29 #include <boost/asio/ip/tcp.hpp>
30 #include <boost/regex.hpp>
31 #include <boost/optional.hpp>
54 const unsigned short port,
75 "GET " << strPath <<
" HTTP/1.0\r\n"
76 "Host: " << strHost <<
"\r\n"
78 "Connection: close\r\n\r\n";
88 boost::asio::streambuf& sb,
92 const boost::system::error_code& ecResult,
113 const boost::system::error_code& ecResult,
127 std::placeholders::_1,
128 std::placeholders::_2),
139 auto query = std::make_shared<boost::asio::ip::tcp::resolver::query>(
141 beast::lexicalCast <std::string> (
mPort),
142 boost::asio::ip::resolver_query_base::numeric_service);
155 std::placeholders::_1));
166 std::placeholders::_1,
167 std::placeholders::_2));
176 if (ecResult == boost::asio::error::operation_aborted)
179 JLOG (
j_.
trace()) <<
"Deadline cancelled.";
185 JLOG (
j_.
trace()) <<
"Deadline error: "
186 <<
mDeqSites[0] <<
": " << ecResult.message ();
193 JLOG (
j_.
trace()) <<
"Deadline arrived.";
198 boost::system::errc::bad_address,
199 boost::system::system_category ()};
208 std::placeholders::_1));
214 const boost::system::error_code& ecResult
219 JLOG (
j_.
trace()) <<
"Shutdown error: "
220 <<
mDeqSites[0] <<
": " << ecResult.message ();
225 const boost::system::error_code& ecResult,
226 boost::asio::ip::tcp::resolver::iterator itrEndpoint
240 JLOG (
j_.
trace()) <<
"Resolve error: "
247 JLOG (
j_.
trace()) <<
"Resolve complete.";
249 boost::asio::async_connect (
255 std::placeholders::_1));
271 JLOG (
j_.
trace()) <<
"Connected.";
278 JLOG (
j_.
trace()) <<
"postConnectVerify: "
290 AutoSocket::ssl_socket::client,
294 std::placeholders::_1));
315 JLOG (
j_.
trace()) <<
"Session started.";
323 std::placeholders::_1,
324 std::placeholders::_2));
329 const boost::system::error_code& ecResult,
350 std::placeholders::_1,
351 std::placeholders::_2));
356 const boost::system::error_code& ecResult,
362 JLOG (
j_.
trace()) <<
"Header: \"" << strHeader <<
"\"";
364 static boost::regex reStatus {
365 "\\`HTTP/1\\S+ (\\d{3}) .*\\'"};
366 static boost::regex reSize {
367 "\\`.*\\r\\nContent-Length:\\s+([0-9]+).*\\'"};
368 static boost::regex reBody {
369 "\\`.*\\r\\n\\r\\n(.*)\\'"};
371 boost::smatch smMatch;
373 if (!boost::regex_match (strHeader, smMatch, reStatus))
376 JLOG (
j_.
trace()) <<
"No status code";
378 boost::system::error_code {
379 boost::system::errc::bad_address,
380 boost::system::system_category ()});
386 if (boost::regex_match (strHeader, smMatch, reBody))
390 if (boost::regex_match(strHeader, smMatch, reSize))
391 return beast::lexicalCast <std::size_t>(
398 JLOG (
j_.
trace()) <<
"Response field too large";
400 boost::system::error_code {
401 boost::system::errc::value_too_large,
402 boost::system::system_category ()});
406 if (responseSize == 0)
420 boost::asio::transfer_all (),
423 std::placeholders::_1,
424 std::placeholders::_2));
429 const boost::system::error_code& ecResult,
445 JLOG (
j_.
trace()) <<
"Complete.";
460 const boost::system::error_code& ecResult,
464 boost::system::error_code ecCancel;
470 JLOG (
j_.
trace()) <<
"invokeComplete: Deadline cancel error: "
471 << ecCancel.message ();
474 JLOG (
j_.
debug()) <<
"invokeComplete: Deadline popping: "
490 mComplete (ecResult ? ecResult : ecCancel, iStatus, strData);
516 const boost::system::error_code& ecResult,
520 boost::asio::basic_waitable_timer<std::chrono::steady_clock>
mDeadline;
534 boost::asio::io_service& io_service,
536 const unsigned short port,
540 std::function<
bool (
const boost::system::error_code& ecResult,
int iStatus,
544 auto client = std::make_shared<HTTPClientImp> (
545 io_service, port, responseMax, j);
546 client->get (bSSL, deqSites, strPath, timeout, complete);
551 boost::asio::io_service& io_service,
553 const unsigned short port,
557 std::function<
bool (
const boost::system::error_code& ecResult,
int iStatus,
563 auto client = std::make_shared<HTTPClientImp> (
564 io_service, port, responseMax, j);
565 client->get (bSSL, deqSites, strPath, timeout, complete);
571 boost::asio::io_service& io_service,
573 const unsigned short port,
579 const boost::system::error_code& ecResult,
586 auto client = std::make_shared<HTTPClientImp> (
587 io_service, port, responseMax, j);
588 client->request (bSSL, deqSites, setRequest, timeout, complete);