40 tcp::resolver resolver_;
41 ssl::stream<tcp::socket> stream_;
42 boost::beast::flat_buffer buffer_;
43 http::request<http::empty_body> req_;
44 http::request<http::empty_body> proxyHandshake;
45 http::response<http::string_body> res_;
46 http::response<http::empty_body> proxyHandshakeResponse;
49 http::response_parser<http::empty_body> http_proxy_handshake_parser;
57 , http_proxy_handshake_parser(proxyHandshakeResponse)
64 const std::string& etpServerHost,
65 uint16_t etpServerPort,
66 const std::string& etpServerTarget,
68 std::string authorization =
"",
69 const std::string& proxyHost =
"",
70 uint16_t proxyPort = 80,
71 const std::string& proxyAuthorization =
"")
73 size_t hostSizeWithNullTermChar = etpServerHost.size() + 1;
74 char* copyHost =
new char[hostSizeWithNullTermChar];
75 std::memcpy(copyHost, etpServerHost.c_str(), hostSizeWithNullTermChar);
77 if (!SSL_set_tlsext_host_name(stream_.native_handle(), copyHost))
79 boost::system::error_code ec{
static_cast<int>(::ERR_get_error()), boost::asio::error::get_ssl_category() };
80 std::cerr << ec.message() <<
"\n";
87 req_.version(version);
88 req_.method(http::verb::get);
89 req_.target(etpServerTarget);
90 req_.set(http::field::host, etpServerHost +
':' + std::to_string(etpServerPort));
91 req_.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
92 if (!authorization.empty()) {
93 req_.set(http::field::authorization, authorization);
96 if (!proxyHost.empty()) {
97 proxyHandshake.version(version);
98 proxyHandshake.method(http::verb::connect);
99 proxyHandshake.target(etpServerHost +
':' + std::to_string(etpServerPort));
100 proxyHandshake.set(http::field::host, etpServerHost +
':' + std::to_string(etpServerPort));
101 if (!authorization.empty()) {
102 proxyHandshake.set(http::field::authorization, authorization);
104 if (!proxyAuthorization.empty()) {
105 proxyHandshake.set(http::field::proxy_authorization, proxyAuthorization);
110 resolver_.async_resolve(
111 proxyHost.empty() ? etpServerHost : proxyHost,
112 std::to_string(proxyHost.empty() ? etpServerPort : proxyPort),
114 &HttpsClientSession::on_resolve,
116 std::placeholders::_1,
117 std::placeholders::_2));
122 boost::system::error_code ec,
123 tcp::resolver::results_type results)
126 std::cerr <<
"resolve : " << ec.message() << std::endl;
131 boost::asio::async_connect(
132 stream_.next_layer(),
136 &HttpsClientSession::on_connect,
138 std::placeholders::_1));
142 on_connect(boost::system::error_code ec)
145 std::cerr <<
"connect : " << ec.message() << std::endl;
149 if (proxyHandshake.count(http::field::host) > 0) {
151 http::async_write(stream_.next_layer(), proxyHandshake,
153 &HttpsClientSession::on_proxy_handshake_write,
155 std::placeholders::_1,
156 std::placeholders::_2));
160 stream_.async_handshake(
161 ssl::stream_base::client,
163 &HttpsClientSession::on_handshake,
165 std::placeholders::_1));
171 boost::system::error_code ec,
172 std::size_t bytes_transferred)
174 boost::ignore_unused(bytes_transferred);
177 std::cerr <<
"Proxy handshake write : " << ec.message() << std::endl;
193 http_proxy_handshake_parser.skip(
true);
196 http::async_read(stream_.next_layer(), buffer_, http_proxy_handshake_parser,
198 &HttpsClientSession::on_proxy_handshake_read,
200 std::placeholders::_1,
201 std::placeholders::_2));
205 on_proxy_handshake_read(
206 boost::system::error_code ec,
207 std::size_t bytes_transferred)
209 boost::ignore_unused(bytes_transferred);
211 std::cerr <<
"read : " << ec.message() << std::endl;
216 stream_.async_handshake(
217 ssl::stream_base::client,
219 &HttpsClientSession::on_handshake,
221 std::placeholders::_1));
225 on_handshake(boost::system::error_code ec)
228 std::cerr <<
"handshake : " << ec.message() << std::endl;
233 http::async_write(stream_, req_,
235 &HttpsClientSession::on_write,
237 std::placeholders::_1,
238 std::placeholders::_2));
243 boost::system::error_code ec,
244 std::size_t bytes_transferred)
246 boost::ignore_unused(bytes_transferred);
249 std::cerr <<
"write : " << ec.message() << std::endl;
254 http::async_read(stream_, buffer_, res_,
256 &HttpsClientSession::on_read,
258 std::placeholders::_1,
259 std::placeholders::_2));
264 boost::system::error_code ec,
265 std::size_t bytes_transferred)
267 boost::ignore_unused(bytes_transferred);
270 std::cerr <<
"read : " << ec.message() << std::endl;
275 boost::system::error_code closeEc;
276 stream_.next_layer().close(closeEc);
288 on_shutdown(boost::system::error_code ec)
290 if (ec == boost::asio::error::eof)
294 ec.assign(0, ec.category());
305 const http::response<http::string_body>& getResponse()
const {