This repository has been archived on 2018-05-28. You can view files and clone it, but cannot push or open issues or pull requests.
BBB-Simple-ACS/client/http_client.cpp

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));
}
}