77 lines
2.3 KiB
C++
77 lines
2.3 KiB
C++
#include "http_client.hpp"
|
|
#include <boost/asio/connect.hpp>
|
|
#include <boost/bind/bind.hpp>
|
|
#include <boost/asio.hpp>
|
|
|
|
#include <iostream>
|
|
#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<void(const std::string&)>& 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));
|
|
}
|
|
}
|