20 #include <ripple/basics/Log.h>
21 #include <ripple/basics/StringUtilities.h>
22 #include <ripple/basics/contract.h>
23 #include <ripple/beast/core/LexicalCast.h>
24 #include <ripple/net/AutoSocket.h>
25 #include <ripple/net/HTTPClient.h>
26 #include <ripple/net/HTTPClientSSLContext.h>
27 #include <boost/asio.hpp>
28 #include <boost/asio/ip/tcp.hpp>
29 #include <boost/asio/ssl.hpp>
30 #include <boost/regex.hpp>
54 boost::asio::io_service& io_service,
55 const unsigned short port,
73 boost::asio::streambuf& sb,
78 osRequest <<
"GET " << strPath
84 "Connection: close\r\n\r\n";
94 void(boost::asio::streambuf& sb,
std::string const& strHost)> build,
97 const boost::system::error_code& ecResult,
118 const boost::system::error_code& ecResult,
132 std::placeholders::_1,
133 std::placeholders::_2),
145 auto query = std::make_shared<boost::asio::ip::tcp::resolver::query>(
148 boost::asio::ip::resolver_query_base::numeric_service);
160 std::placeholders::_1));
172 std::placeholders::_1,
173 std::placeholders::_2));
183 if (ecResult == boost::asio::error::operation_aborted)
186 JLOG(
j_.
trace()) <<
"Deadline cancelled.";
193 << ecResult.message();
200 JLOG(
j_.
trace()) <<
"Deadline arrived.";
205 boost::system::errc::bad_address,
206 boost::system::system_category()};
215 std::placeholders::_1));
225 << ecResult.message();
231 const boost::system::error_code& ecResult,
232 boost::asio::ip::tcp::resolver::iterator itrEndpoint)
250 JLOG(
j_.
trace()) <<
"Resolve complete.";
252 boost::asio::async_connect(
258 std::placeholders::_1));
275 JLOG(
j_.
trace()) <<
"Connected.";
294 AutoSocket::ssl_socket::client,
298 std::placeholders::_1));
320 JLOG(
j_.
trace()) <<
"Session started.";
329 std::placeholders::_1,
330 std::placeholders::_2));
336 const boost::system::error_code& ecResult,
358 std::placeholders::_1,
359 std::placeholders::_2));
365 const boost::system::error_code& ecResult,
371 JLOG(
j_.
trace()) <<
"Header: \"" << strHeader <<
"\"";
373 static boost::regex reStatus{
374 "\\`HTTP/1\\S+ (\\d{3}) .*\\'"};
375 static boost::regex reSize{
376 "\\`.*\\r\\nContent-Length:\\s+([0-9]+).*\\'"};
377 static boost::regex reBody{
"\\`.*\\r\\n\\r\\n(.*)\\'"};
379 boost::smatch smMatch;
381 if (!boost::regex_match(strHeader, smMatch, reStatus))
384 JLOG(
j_.
trace()) <<
"No status code";
386 boost::system::errc::bad_address,
387 boost::system::system_category()});
393 if (boost::regex_match(strHeader, smMatch, reBody))
397 if (boost::regex_match(strHeader, smMatch, reSize))
398 return beast::lexicalCast<std::size_t>(
405 JLOG(
j_.
trace()) <<
"Response field too large";
407 boost::system::errc::value_too_large,
408 boost::system::system_category()});
412 if (responseSize == 0)
426 boost::asio::transfer_all(),
430 std::placeholders::_1,
431 std::placeholders::_2));
437 const boost::system::error_code& ecResult,
453 JLOG(
j_.
trace()) <<
"Complete.";
469 const boost::system::error_code& ecResult,
473 boost::system::error_code ecCancel;
479 JLOG(
j_.
trace()) <<
"invokeComplete: Deadline cancel error: "
480 << ecCancel.message();
483 JLOG(
j_.
debug()) <<
"invokeComplete: Deadline popping: "
499 mComplete(ecResult ? ecResult : ecCancel, iStatus, strData);
525 const boost::system::error_code& ecResult,
530 boost::asio::basic_waitable_timer<std::chrono::steady_clock>
mDeadline;
545 boost::asio::io_service& io_service,
547 const unsigned short port,
552 const boost::system::error_code& ecResult,
558 std::make_shared<HTTPClientImp>(io_service, port, responseMax, j);
559 client->get(bSSL, deqSites, strPath, timeout,
complete);
565 boost::asio::io_service& io_service,
567 const unsigned short port,
572 const boost::system::error_code& ecResult,
580 std::make_shared<HTTPClientImp>(io_service, port, responseMax, j);
581 client->get(bSSL, deqSites, strPath, timeout,
complete);
587 boost::asio::io_service& io_service,
589 const unsigned short port,
595 const boost::system::error_code& ecResult,
603 std::make_shared<HTTPClientImp>(io_service, port, responseMax, j);
604 client->request(bSSL, deqSites, setRequest, timeout,
complete);