#include "http_client.hpp" #include #include #include #include #include "factory.hpp" namespace acs { void http_client::on_resolve(const boost::system::error_code& ec, const tcp::resolver::iterator& iterator) { if (ec) return fail("Resolve failed.", ec); async_connect(socket_, iterator, boost::bind( &http_client::on_connect, this, boost::asio::placeholders::error)); } void http_client::on_connect(const boost::system::error_code& ec) { if (ec) return fail("Connect failed.", ec); http::async_write(socket_, request_, boost::bind( &http_client::on_write, this, boost::asio::placeholders::error)); } void http_client::on_write(const boost::system::error_code& ec) { if (ec) return fail("Failed to send request.", ec); http::async_read(socket_, buffer_, response_, boost::bind( &http_client::on_read, this, boost::asio::placeholders::error)); } void http_client::on_read(const boost::system::error_code& ec) { if (ec) return fail("Failed to fetch responce.", ec); callback_(buffers_to_string(response_.body().data())); reset(); } void http_client::fail(const std::string& message, const boost::beast::error_code& ec) { std::cerr << message << " Message: " << ec.message() << std::endl; reset(); callback_(""); } void http_client::reset() { buffer_.consume(buffer_.max_size()); buffer_.shrink_to_fit(); request_.clear(); response_.clear(); } http_client::http_client() : io_service_( factory::get()->get_loop()->get_io_service()), resolver_(*io_service_), socket_(*io_service_) { } void http_client::async_get(const std::string& host, const std::string& query, const std::function& callback) { host_ = host; callback_ = callback; request_ = { http::verb::get, query, 11 }; request_.set(http::field::host, host_); request_.prepare_payload(); resolver_.async_resolve({ host, "7722" }, boost::bind(&http_client::on_resolve, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator)); } }