42 class HttpClientSession :
public std::enable_shared_from_this<HttpClientSession>
44 tcp::resolver resolver_;
45#if BOOST_VERSION < 107000
48 beast::tcp_stream stream_;
50 boost::beast::flat_buffer buffer_;
51 http::request<http::empty_body> req_;
52 http::response<http::string_body> res_;
57 HttpClientSession(boost::asio::io_context& ioc)
58#if BOOST_VERSION < 107000
62 : resolver_(net::make_strand(ioc))
63 , stream_(net::make_strand(ioc))
71 const std::string& etpServerHost,
72 uint16_t etpServerPort,
73 const std::string& etpServerTarget,
75 const std::string& etpServerAuthorization =
"",
76 const std::string& proxyHost =
"",
77 uint16_t proxyPort = 80,
78 const std::string& proxyAuthorization =
"")
81 req_.version(version);
82 req_.method(http::verb::get);
83 req_.target(etpServerTarget);
84 req_.set(http::field::host, etpServerHost +
':' + std::to_string(etpServerPort));
85 req_.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
86 if (!etpServerAuthorization.empty()) {
87 req_.set(http::field::authorization, etpServerAuthorization);
89 if (!proxyAuthorization.empty()) {
90 req_.set(http::field::proxy_authorization, proxyAuthorization);
94 resolver_.async_resolve(
95 proxyHost.empty() ? etpServerHost : proxyHost,
96 std::to_string(proxyHost.empty() ? etpServerPort : proxyPort),
98 &HttpClientSession::on_resolve,
100 std::placeholders::_1,
101 std::placeholders::_2));
106 boost::system::error_code ec,
107 tcp::resolver::results_type results)
110 std::cerr <<
"resolve : " << ec.message() << std::endl;
115 std::vector<tcp::endpoint> endpoints(results.begin(), results.end());
116 std::stable_partition(endpoints.begin(), endpoints.end(), [](
auto entry) {return entry.protocol() == tcp::v4(); });
119#if BOOST_VERSION < 107000
120 boost::asio::async_connect(
125 &HttpClientSession::on_connect,
127 std::placeholders::_1));
129 stream_.expires_after(std::chrono::seconds(3));
130 stream_.async_connect(
132 beast::bind_front_handler(
133 &HttpClientSession::on_connect,
134 shared_from_this()));
138#if BOOST_VERSION < 107000
139 void on_connect(boost::system::error_code ec)
141 void on_connect(boost::beast::error_code ec, tcp::resolver::results_type::endpoint_type)
145 std::cerr <<
"connect : " << ec.message() << std::endl;
150 http::async_write(stream_, req_,
152 &HttpClientSession::on_write,
154 std::placeholders::_1,
155 std::placeholders::_2));
160 boost::system::error_code ec,
161 std::size_t bytes_transferred)
163 boost::ignore_unused(bytes_transferred);
166 std::cerr <<
"write : " << ec.message() << std::endl;
171 http::async_read(stream_, buffer_, res_,
173 &HttpClientSession::on_read,
175 std::placeholders::_1,
176 std::placeholders::_2));
181 boost::system::error_code ec,
182 std::size_t bytes_transferred)
184 boost::ignore_unused(bytes_transferred);
187 std::cerr <<
"HTTP read : " << ec.message() << std::endl;
192#if BOOST_VERSION < 107000
193 stream_.shutdown(tcp::socket::shutdown_both, ec);
195 stream_.socket().shutdown(tcp::socket::shutdown_both, ec);
199 if (ec && ec != boost::system::errc::not_connected) {
200 std::cerr <<
"shutdown : " << ec.message() << std::endl;
207 const http::response<http::string_body>& getResponse()
const {