summaryrefslogtreecommitdiffhomepage
path: root/https.cpp
diff options
context:
space:
mode:
authorRoland Reichwein <mail@reichwein.it>2020-04-10 19:35:06 +0200
committerRoland Reichwein <mail@reichwein.it>2020-04-10 19:35:06 +0200
commit07f01d1ab5e68fc042356fd90fa07c199791b29c (patch)
tree89860e4e85ee49931b4193255de0a2032d94392e /https.cpp
parentda2666726e48a3dc00f05589cdf4947f22deb3c3 (diff)
Ported to Debian 10
Diffstat (limited to 'https.cpp')
-rw-r--r--https.cpp145
1 files changed, 137 insertions, 8 deletions
diff --git a/https.cpp b/https.cpp
index 60f37e7..facc533 100644
--- a/https.cpp
+++ b/https.cpp
@@ -10,10 +10,15 @@
#include <boost/asio/buffer.hpp>
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
-#include <boost/beast/version.hpp>
-#include <boost/beast/ssl.hpp>
#include <boost/asio/dispatch.hpp>
#include <boost/asio/ssl/context.hpp>
+#ifdef BOOST_LATEST
+#include <boost/beast/ssl.hpp>
+#else
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/ssl/stream.hpp>
+#include <boost/asio/bind_executor.hpp>
+#endif
#include <boost/asio/strand.hpp>
#include <boost/config.hpp>
@@ -39,8 +44,15 @@ namespace {
// Report a failure
void
-fail(beast::error_code ec, char const* what)
+fail(
+#ifdef BOOST_LATEST
+ beast::error_code ec,
+#else
+ boost::system::error_code ec,
+#endif
+ char const* what)
{
+#ifdef BOOST_LATEST
// ssl::error::stream_truncated, also known as an SSL "short read",
// indicates the peer closed the connection without performing the
// required closing handshake (for example, Google does this to
@@ -60,6 +72,7 @@ fail(beast::error_code ec, char const* what)
if(ec == net::ssl::error::stream_truncated)
return;
+#endif
std::cerr << what << ": " << ec.message() << "\n";
}
@@ -67,7 +80,13 @@ fail(beast::error_code ec, char const* what)
// Handles an HTTP server connection
class session : public std::enable_shared_from_this<session>
{
+#ifdef BOOST_LATEST
beast::ssl_stream<beast::tcp_stream> stream_;
+#else
+ tcp::socket socket_;
+ ssl::stream<tcp::socket&> stream_;
+ boost::asio::strand<boost::asio::io_context::executor_type> strand_;
+#endif
beast::flat_buffer buffer_;
Server& m_server;
http::request<http::string_body> req_;
@@ -80,6 +99,7 @@ class session : public std::enable_shared_from_this<session>
res_ = sp;
// Write the response
+#ifdef BOOST_LATEST
http::async_write(
stream_,
*sp,
@@ -87,15 +107,38 @@ class session : public std::enable_shared_from_this<session>
&session::on_write,
shared_from_this(),
sp->need_eof()));
+#else
+ http::async_write(
+ stream_,
+ *sp,
+ boost::asio::bind_executor(
+ strand_,
+ std::bind(
+ &session::on_write,
+ shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2,
+ sp->need_eof())));
+#endif
}
public:
// Take ownership of the socket
explicit
session(
+#ifdef BOOST_LATEST
tcp::socket&& socket,
+#else
+ tcp::socket socket,
+#endif
ssl::context& ctx,
Server& server)
+#ifdef BOOST_LATEST
: stream_(std::move(socket), ctx)
+#else
+ : socket_(std::move(socket))
+ , stream_(socket_, ctx)
+ , strand_(socket_.get_executor())
+#endif
, m_server(server)
{
}
@@ -104,6 +147,7 @@ public:
void
run()
{
+#ifdef BOOST_LATEST
// We need to be executing within a strand to perform async operations
// on the I/O objects in this session.
net::dispatch(
@@ -111,8 +155,19 @@ public:
beast::bind_front_handler(
&session::on_run,
shared_from_this()));
+#else
+ stream_.async_handshake(
+ ssl::stream_base::server,
+ boost::asio::bind_executor(
+ strand_,
+ std::bind(
+ &session::on_handshake,
+ shared_from_this(),
+ std::placeholders::_1)));
+#endif
}
+#ifdef BOOST_LATEST
void
on_run()
{
@@ -127,9 +182,16 @@ public:
&session::on_handshake,
shared_from_this()));
}
+#endif
void
- on_handshake(beast::error_code ec)
+ on_handshake(
+#ifdef BOOST_LATEST
+ beast::error_code ec
+#else
+ boost::system::error_code ec
+#endif
+ )
{
if(ec)
return fail(ec, "handshake");
@@ -144,6 +206,7 @@ public:
// otherwise the operation behavior is undefined.
req_ = {};
+#ifdef BOOST_LATEST
// Set the timeout.
beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
@@ -152,11 +215,25 @@ public:
beast::bind_front_handler(
&session::on_read,
shared_from_this()));
+#else
+ http::async_read(stream_, buffer_, req_,
+ boost::asio::bind_executor(
+ strand_,
+ std::bind(
+ &session::on_read,
+ shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2)));
+#endif
}
void
on_read(
+#ifdef BOOST_LATEST
beast::error_code ec,
+#else
+ boost::system::error_code ec,
+#endif
std::size_t bytes_transferred)
{
boost::ignore_unused(bytes_transferred);
@@ -174,9 +251,16 @@ public:
void
on_write(
+#ifdef BOOST_LATEST
bool close,
beast::error_code ec,
- std::size_t bytes_transferred)
+ std::size_t bytes_transferred
+#else
+ boost::system::error_code ec,
+ std::size_t bytes_transferred,
+ bool close
+#endif
+ )
{
boost::ignore_unused(bytes_transferred);
@@ -200,6 +284,7 @@ public:
void
do_close()
{
+#ifdef BOOST_LATEST
// Set the timeout.
beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
@@ -208,6 +293,15 @@ public:
beast::bind_front_handler(
&session::on_shutdown,
shared_from_this()));
+#else
+ stream_.async_shutdown(
+ boost::asio::bind_executor(
+ strand_,
+ std::bind(
+ &session::on_shutdown,
+ shared_from_this(),
+ std::placeholders::_1)));
+#endif
}
void
@@ -225,9 +319,14 @@ public:
// Accepts incoming connections and launches the sessions
class listener : public std::enable_shared_from_this<listener>
{
+#ifdef BOOST_LATEST
net::io_context& ioc_;
+#endif
ssl::context& ctx_;
tcp::acceptor acceptor_;
+#ifndef BOOST_LATEST
+ tcp::socket socket_;
+#endif
::Server& m_server;
public:
@@ -235,13 +334,22 @@ public:
net::io_context& ioc,
ssl::context& ctx,
tcp::endpoint endpoint,
- Server& server)
- : ioc_(ioc)
- , ctx_(ctx)
+ Server& server) :
+#ifdef BOOST_LATEST
+ ioc_(ioc),
+#endif
+ ctx_(ctx)
, acceptor_(ioc)
+#ifndef BOOST_LATEST
+ , socket_(ioc)
+#endif
, m_server(server)
{
+#ifdef BOOST_LATEST
beast::error_code ec;
+#else
+ boost::system::error_code ec;
+#endif
// Open the acceptor
acceptor_.open(endpoint.protocol(), ec);
@@ -281,6 +389,10 @@ public:
void
run()
{
+#ifndef BOOST_LATEST
+ if(! acceptor_.is_open())
+ return;
+#endif
do_accept();
}
@@ -289,15 +401,28 @@ private:
do_accept()
{
// The new connection gets its own strand
+#ifdef BOOST_LATEST
acceptor_.async_accept(
net::make_strand(ioc_),
beast::bind_front_handler(
&listener::on_accept,
shared_from_this()));
+#else
+ acceptor_.async_accept(
+ socket_,
+ std::bind(
+ &listener::on_accept,
+ shared_from_this(),
+ std::placeholders::_1));
+#endif
}
void
+#ifdef BOOST_LATEST
on_accept(beast::error_code ec, tcp::socket socket)
+#else
+ on_accept(boost::system::error_code ec)
+#endif
{
if(ec)
{
@@ -307,7 +432,11 @@ private:
{
// Create the session and run it
std::make_shared<session>(
+#ifdef BOOST_LATEST
std::move(socket),
+#else
+ std::move(socket_),
+#endif
ctx_,
m_server)->run();
}