summaryrefslogtreecommitdiff
path: root/boost/beast/experimental/core
diff options
context:
space:
mode:
Diffstat (limited to 'boost/beast/experimental/core')
-rw-r--r--boost/beast/experimental/core/detail/flat_stream.hpp64
-rw-r--r--boost/beast/experimental/core/detail/impl/timeout_service.ipp181
-rw-r--r--boost/beast/experimental/core/detail/service_base.hpp50
-rw-r--r--boost/beast/experimental/core/detail/timeout_service.hpp124
-rw-r--r--boost/beast/experimental/core/detail/timeout_work_guard.hpp73
-rw-r--r--boost/beast/experimental/core/flat_stream.hpp354
-rw-r--r--boost/beast/experimental/core/impl/flat_stream.ipp309
-rw-r--r--boost/beast/experimental/core/impl/timeout_service.ipp31
-rw-r--r--boost/beast/experimental/core/impl/timeout_socket.hpp207
-rw-r--r--boost/beast/experimental/core/ssl_stream.hpp730
-rw-r--r--boost/beast/experimental/core/timeout_service.hpp40
-rw-r--r--boost/beast/experimental/core/timeout_socket.hpp240
12 files changed, 0 insertions, 2403 deletions
diff --git a/boost/beast/experimental/core/detail/flat_stream.hpp b/boost/beast/experimental/core/detail/flat_stream.hpp
deleted file mode 100644
index 3a56897b5a..0000000000
--- a/boost/beast/experimental/core/detail/flat_stream.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_DETAIL_FLAT_STREAM_HPP
-#define BOOST_BEAST_CORE_DETAIL_FLAT_STREAM_HPP
-
-#include <boost/asio/buffer.hpp>
-#include <cstdlib>
-#include <iterator>
-
-namespace boost {
-namespace beast {
-namespace detail {
-
-class flat_stream_base
-{
-public:
- // Largest buffer size we will flatten.
- // 16KB is the upper limit on reasonably sized HTTP messages.
- static std::size_t constexpr coalesce_limit = 16 * 1024;
-
- // calculates the coalesce settings for a buffer sequence
- template<class BufferSequence>
- static
- std::pair<std::size_t, bool>
- coalesce(BufferSequence const& buffers, std::size_t limit)
- {
- std::pair<std::size_t, bool> result{0, false};
- auto first = boost::asio::buffer_sequence_begin(buffers);
- auto last = boost::asio::buffer_sequence_end(buffers);
- if(first != last)
- {
- result.first = boost::asio::buffer_size(*first);
- if(result.first < limit)
- {
- auto it = first;
- auto prev = first;
- while(++it != last)
- {
- auto const n =
- boost::asio::buffer_size(*it);
- if(result.first + n > limit)
- break;
- result.first += n;
- prev = it;
- }
- result.second = prev != first;
- }
- }
- return result;
- }
-};
-
-} // detail
-} // beast
-} // boost
-
-#endif
diff --git a/boost/beast/experimental/core/detail/impl/timeout_service.ipp b/boost/beast/experimental/core/detail/impl/timeout_service.ipp
deleted file mode 100644
index fd1427bda7..0000000000
--- a/boost/beast/experimental/core/detail/impl/timeout_service.ipp
+++ /dev/null
@@ -1,181 +0,0 @@
-//
-// Copyright (c) 2018 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_DETAIL_IMPL_TIMEOUT_SERVICE_IPP
-#define BOOST_BEAST_CORE_DETAIL_IMPL_TIMEOUT_SERVICE_IPP
-
-namespace boost {
-namespace beast {
-namespace detail {
-
-//------------------------------------------------------------------------------
-
-inline
-timeout_object::
-timeout_object(boost::asio::io_context& ioc)
- : svc_(boost::asio::use_service<timeout_service>(ioc))
-{
-}
-
-//------------------------------------------------------------------------------
-
-inline
-timeout_service::
-timeout_service(boost::asio::io_context& ctx)
- : service_base(ctx)
- , strand_(ctx.get_executor())
- , timer_(ctx)
-{
-}
-
-inline
-void
-timeout_service::
-on_work_started(timeout_object& obj)
-{
- std::lock_guard<std::mutex> lock(m_);
- BOOST_VERIFY(++obj.outstanding_work_ == 1);
- insert(obj, *fresh_);
- if(++count_ == 1)
- do_async_wait();
-}
-
-inline
-void
-timeout_service::
-on_work_complete(timeout_object& obj)
-{
- std::lock_guard<std::mutex> lock(m_);
- remove(obj);
-}
-
-inline
-void
-timeout_service::
-on_work_stopped(timeout_object& obj)
-{
- std::lock_guard<std::mutex> lock(m_);
- BOOST_ASSERT(count_ > 0);
- BOOST_VERIFY(--obj.outstanding_work_ == 0);
- if(obj.list_ != nullptr)
- remove(obj);
- if(--count_ == 0)
- timer_.cancel();
-}
-
-inline
-void
-timeout_service::
-set_option(std::chrono::seconds n)
-{
- interval_ = n;
-}
-
-//------------------------------------------------------------------------------
-
-// Precondition: caller holds the mutex
-inline
-void
-timeout_service::
-insert(timeout_object& obj, list_type& list)
-{
- BOOST_ASSERT(obj.list_ == nullptr);
- list.push_back(&obj); // can throw
- obj.list_ = &list;
- obj.pos_ = list.size();
-}
-
-// Precondition: caller holds the mutex
-inline
-void
-timeout_service::
-remove(timeout_object& obj)
-{
- BOOST_ASSERT(obj.list_ != nullptr);
- BOOST_ASSERT(
- obj.list_ == stale_ ||
- obj.list_ == fresh_);
- BOOST_ASSERT(obj.list_->size() > 0);
- auto& list = *obj.list_;
- auto const n = list.size() - 1;
- if(obj.pos_ != n)
- {
- auto other = list[n];
- list[obj.pos_] = other;
- other->pos_ = obj.pos_;
- }
- obj.list_ = nullptr;
- list.resize(n);
-}
-
-inline
-void
-timeout_service::
-do_async_wait()
-{
- timer_.expires_after(interval_);
- timer_.async_wait(
- boost::asio::bind_executor(
- strand_,
- [this](error_code ec)
- {
- this->on_timer(ec);
- }));
-}
-
-inline
-void
-timeout_service::
-on_timer(error_code ec)
-{
- if(ec == boost::asio::error::operation_aborted)
- {
- BOOST_ASSERT(fresh_->empty());
- BOOST_ASSERT(stale_->empty());
- return;
- }
-
- {
- std::lock_guard<std::mutex> lock(m_);
- if(! stale_->empty())
- {
- for(auto obj : *stale_)
- {
- obj->list_ = nullptr;
- obj->on_timeout();
- }
- stale_->clear();
- }
- std::swap(fresh_, stale_);
- }
-
- do_async_wait();
-}
-
-//------------------------------------------------------------------------------
-
-inline
-void
-timeout_service::
-shutdown() noexcept
-{
- boost::asio::post(
- boost::asio::bind_executor(
- strand_,
- [this]()
- {
- timer_.cancel();
- }));
-}
-
-} // detail
-} // beast
-} // boost
-
-#endif
diff --git a/boost/beast/experimental/core/detail/service_base.hpp b/boost/beast/experimental/core/detail/service_base.hpp
deleted file mode 100644
index 278db3f71d..0000000000
--- a/boost/beast/experimental/core/detail/service_base.hpp
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// Copyright (c) 2018 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_DETAIL_SERVICE_BASE_HPP
-#define BOOST_BEAST_CORE_DETAIL_SERVICE_BASE_HPP
-
-#include <boost/asio/execution_context.hpp>
-
-namespace boost {
-namespace beast {
-namespace detail {
-
-template<class T>
-class service_id : public boost::asio::execution_context::id
-{
-};
-
-template<class T>
-class service_base
- : public boost::asio::execution_context::service
-{
-protected:
- boost::asio::execution_context& ctx_;
-
-public:
- static service_id<T> id;
-
- explicit
- service_base(boost::asio::execution_context& ctx)
- : boost::asio::execution_context::service(ctx)
- , ctx_(ctx)
- {
- }
-};
-
-template<class T>
-service_id<T>
-service_base<T>::id;
-
-} // detail
-} // beast
-} // boost
-
-#endif
diff --git a/boost/beast/experimental/core/detail/timeout_service.hpp b/boost/beast/experimental/core/detail/timeout_service.hpp
deleted file mode 100644
index b32cedda00..0000000000
--- a/boost/beast/experimental/core/detail/timeout_service.hpp
+++ /dev/null
@@ -1,124 +0,0 @@
-//
-// Copyright (c) 2018 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_DETAIL_TIMEOUT_SERVICE_HPP
-#define BOOST_BEAST_CORE_DETAIL_TIMEOUT_SERVICE_HPP
-
-#include <boost/beast/core/error.hpp>
-#include <boost/beast/experimental/core/detail/service_base.hpp>
-#include <boost/assert.hpp>
-#include <boost/core/ignore_unused.hpp>
-#include <boost/asio/bind_executor.hpp>
-#include <boost/asio/executor.hpp>
-#include <boost/asio/io_context.hpp>
-#include <boost/asio/post.hpp>
-#include <boost/asio/steady_timer.hpp>
-#include <boost/asio/strand.hpp>
-#include <chrono>
-#include <cstdlib>
-#include <mutex>
-#include <utility>
-#include <vector>
-
-namespace boost {
-namespace beast {
-namespace detail {
-
-//------------------------------------------------------------------------------
-
-class timeout_service;
-
-class timeout_object
-{
- friend class timeout_service;
-
- using list_type = std::vector<timeout_object*>;
-
- timeout_service& svc_;
- std::size_t pos_;
- list_type* list_ = nullptr;
- char outstanding_work_ = 0;
-
-public:
- timeout_object() = delete;
- timeout_object(timeout_object&&) = delete;
- timeout_object(timeout_object const&) = delete;
- timeout_object& operator=(timeout_object&&) = delete;
- timeout_object& operator=(timeout_object const&) = delete;
-
- // VFALCO should be execution_context
- explicit
- timeout_object(boost::asio::io_context& ioc);
-
- timeout_service&
- service() const
- {
- return svc_;
- }
-
- virtual void on_timeout() = 0;
-};
-
-//------------------------------------------------------------------------------
-
-class timeout_service
- : public service_base<timeout_service>
-{
-public:
- using key_type = timeout_service;
-
- // VFALCO Should be execution_context
- explicit
- timeout_service(boost::asio::io_context& ctx);
-
- void
- on_work_started(timeout_object& obj);
-
- void
- on_work_complete(timeout_object& obj);
-
- void
- on_work_stopped(timeout_object& obj);
-
- void
- set_option(std::chrono::seconds n);
-
-private:
- friend class timeout_object;
-
- using list_type = std::vector<timeout_object*>;
-
- void insert(timeout_object& obj, list_type& list);
- void remove(timeout_object& obj);
- void do_async_wait();
- void on_timer(error_code ec);
-
- virtual void shutdown() noexcept override;
-
- boost::asio::strand<
- boost::asio::io_context::executor_type> strand_;
-
- std::mutex m_;
- list_type list_[2];
- list_type* fresh_ = &list_[0];
- list_type* stale_ = &list_[1];
- std::size_t count_ = 0;
- boost::asio::steady_timer timer_;
- std::chrono::seconds interval_{30ul};
-};
-
-//------------------------------------------------------------------------------
-
-} // detail
-} // beast
-} // boost
-
-#include <boost/beast/experimental/core/detail/impl/timeout_service.ipp>
-
-#endif
diff --git a/boost/beast/experimental/core/detail/timeout_work_guard.hpp b/boost/beast/experimental/core/detail/timeout_work_guard.hpp
deleted file mode 100644
index 463567ae78..0000000000
--- a/boost/beast/experimental/core/detail/timeout_work_guard.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-// Copyright (c) 2018 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_DETAIL_TIMEOUT_WORK_GUARD_HPP
-#define BOOST_BEAST_CORE_DETAIL_TIMEOUT_WORK_GUARD_HPP
-
-#include <boost/beast/experimental/core/detail/timeout_service.hpp>
-#include <boost/assert.hpp>
-#include <boost/core/exchange.hpp>
-
-namespace boost {
-namespace beast {
-namespace detail {
-
-class timeout_work_guard
-{
- timeout_object* obj_;
-
-public:
- timeout_work_guard(timeout_work_guard const&) = delete;
- timeout_work_guard& operator=(timeout_work_guard&&) = delete;
- timeout_work_guard& operator=(timeout_work_guard const&) = delete;
-
- ~timeout_work_guard()
- {
- reset();
- }
-
- timeout_work_guard(timeout_work_guard&& other)
- : obj_(boost::exchange(other.obj_, nullptr))
- {
- }
-
- explicit
- timeout_work_guard(timeout_object& obj)
- : obj_(&obj)
- {
- obj_->service().on_work_started(*obj_);
- }
-
- bool
- owns_work() const
- {
- return obj_ != nullptr;
- }
-
- void
- reset()
- {
- if(obj_)
- obj_->service().on_work_stopped(*obj_);
- }
-
- void
- complete()
- {
- BOOST_ASSERT(obj_ != nullptr);
- obj_->service().on_work_complete(*obj_);
- obj_ = nullptr;
- }
-};
-
-} // detail
-} // beast
-} // boost
-
-#endif
diff --git a/boost/beast/experimental/core/flat_stream.hpp b/boost/beast/experimental/core/flat_stream.hpp
deleted file mode 100644
index ab22e544fb..0000000000
--- a/boost/beast/experimental/core/flat_stream.hpp
+++ /dev/null
@@ -1,354 +0,0 @@
-//
-// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_FLAT_STREAM_HPP
-#define BOOST_BEAST_CORE_FLAT_STREAM_HPP
-
-#include <boost/beast/core/detail/config.hpp>
-#include <boost/beast/core/error.hpp>
-#include <boost/beast/core/type_traits.hpp>
-#include <boost/beast/experimental/core/detail/flat_stream.hpp>
-#include <boost/asio/async_result.hpp>
-#include <cstdlib>
-#include <utility>
-
-namespace boost {
-namespace beast {
-
-/** Stream wrapper to improve ssl::stream write performance.
-
- This wrapper flattens writes for buffer sequences having length
- greater than 1 and total size below a predefined amount, using
- a dynamic memory allocation. It is primarily designed to overcome
- a performance limitation of the current version of `boost::asio::ssl::stream`,
- which does not use OpenSSL's scatter/gather interface for its
- low-level read some and write some operations.
-
- @par Example
-
- To use the @ref flat_stream template with SSL streams, declare
- a variable of the correct type. Parameters passed to the constructor
- will be forwarded to the next layer's constructor:
-
- @code
- flat_stream<ssl::stream<ip::tcp::socket>> fs{ioc, ctx};
- @endcode
- Alternatively you can write
- @code
- ssl::stream<ip::tcp::socket> ss{ioc, ctx};
- flat_stream<ssl::stream<ip::tcp::socket>&> fs{ss};
- @endcode
-
- The resulting stream may be passed to any stream algorithms which
- operate on synchronous or asynchronous read or write streams,
- examples include:
-
- @li `boost::asio::read`, `boost::asio::async_read`
-
- @li `boost::asio::write`, `boost::asio::async_write`
-
- @li `boost::asio::read_until`, `boost::asio::async_read_until`
-
- The stream may also be used as a template parameter in other
- stream wrappers, such as for websocket:
- @code
- websocket::stream<flat_stream<ssl::stream<ip::tcp::socket>>> ws{ioc, ctx};
- @endcode
-
- @tparam NextLayer The type representing the next layer, to which
- data will be read and written during operations. For synchronous
- operations, the type must support the @b SyncStream concept. For
- asynchronous operations, the type must support the @b AsyncStream
- concept. This type will usually be some variation of
- `boost::asio::ssl::stream`.
-
- @par Concepts
- @b AsyncStream
- @b SyncStream
-
- @see
- @li https://github.com/boostorg/beast/issues/1108
- @li https://github.com/boostorg/asio/issues/100
- @li https://stackoverflow.com/questions/38198638/openssl-ssl-write-from-multiple-buffers-ssl-writev
- @li https://stackoverflow.com/questions/50026167/performance-drop-on-port-from-beast-1-0-0-b66-to-boost-1-67-0-beast
-*/
-template<class NextLayer>
-class flat_stream
-#if ! BOOST_BEAST_DOXYGEN
- : private detail::flat_stream_base
-#endif
-{
- // Largest buffer size we will flatten.
- // 16KB is the upper limit on reasonably sized HTTP messages.
- static std::size_t constexpr max_size = 16 * 1024;
-
- template<class, class> class write_op;
-
- NextLayer stream_;
-
-public:
- /// The type of the next layer.
- using next_layer_type =
- typename std::remove_reference<NextLayer>::type;
-
- /// The type of the lowest layer.
- using lowest_layer_type = boost::beast::get_lowest_layer<next_layer_type>;
-
- /// The type of the executor associated with the object.
- using executor_type = typename next_layer_type::executor_type;
-
- flat_stream(flat_stream&&) = default;
- flat_stream(flat_stream const&) = default;
- flat_stream& operator=(flat_stream&&) = default;
- flat_stream& operator=(flat_stream const&) = default;
-
- /** Destructor
-
- The treatment of pending operations will be the same as that
- of the next layer.
- */
- ~flat_stream() = default;
-
- /** Constructor
-
- Arguments, if any, are forwarded to the next layer's constructor.
- */
- template<class... Args>
- explicit
- flat_stream(Args&&... args);
-
- //--------------------------------------------------------------------------
-
- /** Get the executor associated with the object.
-
- This function may be used to obtain the executor object that the
- stream uses to dispatch handlers for asynchronous operations.
-
- @return A copy of the executor that stream will use to dispatch handlers.
- */
- executor_type
- get_executor() noexcept
- {
- return stream_.get_executor();
- }
-
- /** Get a reference to the next layer
-
- This function returns a reference to the next layer
- in a stack of stream layers.
-
- @return A reference to the next layer in the stack of
- stream layers.
- */
- next_layer_type&
- next_layer()
- {
- return stream_;
- }
-
- /** Get a reference to the next layer
-
- This function returns a reference to the next layer in a
- stack of stream layers.
-
- @return A reference to the next layer in the stack of
- stream layers.
- */
- next_layer_type const&
- next_layer() const
- {
- return stream_;
- }
-
- /** Get a reference to the lowest layer
-
- This function returns a reference to the lowest layer
- in a stack of stream layers.
-
- @return A reference to the lowest layer in the stack of
- stream layers.
- */
- lowest_layer_type&
- lowest_layer()
- {
- return stream_.lowest_layer();
- }
-
- /** Get a reference to the lowest layer
-
- This function returns a reference to the lowest layer
- in a stack of stream layers.
-
- @return A reference to the lowest layer in the stack of
- stream layers. Ownership is not transferred to the caller.
- */
- lowest_layer_type const&
- lowest_layer() const
- {
- return stream_.lowest_layer();
- }
-
- //--------------------------------------------------------------------------
-
- /** Read some data from the stream.
-
- This function is used to read data from the stream. The function call will
- block until one or more bytes of data has been read successfully, or until
- an error occurs.
-
- @param buffers The buffers into which the data will be read.
-
- @returns The number of bytes read.
-
- @throws boost::system::system_error Thrown on failure.
-
- @note The `read_some` operation may not read all of the requested number of
- bytes. Consider using the function `boost::asio::read` if you need to ensure
- that the requested amount of data is read before the blocking operation
- completes.
- */
- template<class MutableBufferSequence>
- std::size_t
- read_some(MutableBufferSequence const& buffers);
-
- /** Read some data from the stream.
-
- This function is used to read data from the stream. The function call will
- block until one or more bytes of data has been read successfully, or until
- an error occurs.
-
- @param buffers The buffers into which the data will be read.
-
- @param ec Set to indicate what error occurred, if any.
-
- @returns The number of bytes read.
-
- @note The `read_some` operation may not read all of the requested number of
- bytes. Consider using the function `boost::asio::read` if you need to ensure
- that the requested amount of data is read before the blocking operation
- completes.
- */
- template<class MutableBufferSequence>
- std::size_t
- read_some(
- MutableBufferSequence const& buffers,
- error_code& ec);
-
- /** Start an asynchronous read.
-
- This function is used to asynchronously read one or more bytes of data from
- the stream. The function call always returns immediately.
-
- @param buffers The buffers into which the data will be read. Although the
- buffers object may be copied as necessary, ownership of the underlying
- buffers is retained by the caller, which must guarantee that they remain
- valid until the handler is called.
-
- @param handler The handler to be called when the read operation completes.
- Copies will be made of the handler as required. The equivalent function
- signature of the handler must be:
- @code void handler(
- const boost::system::error_code& error, // Result of operation.
- std::size_t bytes_transferred // Number of bytes read.
- ); @endcode
-
- @note The `read_some` operation may not read all of the requested number of
- bytes. Consider using the function `boost::asio::async_read` if you need
- to ensure that the requested amount of data is read before the asynchronous
- operation completes.
- */
- template<
- class MutableBufferSequence,
- class ReadHandler>
- BOOST_ASIO_INITFN_RESULT_TYPE(
- ReadHandler, void(error_code, std::size_t))
- async_read_some(
- MutableBufferSequence const& buffers,
- ReadHandler&& handler);
-
- /** Write some data to the stream.
-
- This function is used to write data on the stream. The function call will
- block until one or more bytes of data has been written successfully, or
- until an error occurs.
-
- @param buffers The data to be written.
-
- @returns The number of bytes written.
-
- @throws boost::system::system_error Thrown on failure.
-
- @note The `write_some` operation may not transmit all of the data to the
- peer. Consider using the function `boost::asio::write` if you need to
- ensure that all data is written before the blocking operation completes.
- */
- template<class ConstBufferSequence>
- std::size_t
- write_some(ConstBufferSequence const& buffers);
-
- /** Write some data to the stream.
-
- This function is used to write data on the stream. The function call will
- block until one or more bytes of data has been written successfully, or
- until an error occurs.
-
- @param buffers The data to be written.
-
- @param ec Set to indicate what error occurred, if any.
-
- @returns The number of bytes written.
-
- @note The `write_some` operation may not transmit all of the data to the
- peer. Consider using the function `boost::asio::write` if you need to
- ensure that all data is written before the blocking operation completes.
- */
- template<class ConstBufferSequence>
- std::size_t
- write_some(
- ConstBufferSequence const& buffers,
- error_code& ec);
-
- /** Start an asynchronous write.
-
- This function is used to asynchronously write one or more bytes of data to
- the stream. The function call always returns immediately.
-
- @param buffers The data to be written to the stream. Although the buffers
- object may be copied as necessary, ownership of the underlying buffers is
- retained by the caller, which must guarantee that they remain valid until
- the handler is called.
-
- @param handler The handler to be called when the write operation completes.
- Copies will be made of the handler as required. The equivalent function
- signature of the handler must be:
- @code void handler(
- const boost::system::error_code& error, // Result of operation.
- std::size_t bytes_transferred // Number of bytes written.
- ); @endcode
-
- @note The `async_write_some` operation may not transmit all of the data to
- the peer. Consider using the function `boost::asio::async_write` if you need
- to ensure that all data is written before the asynchronous operation completes.
- */
- template<
- class ConstBufferSequence,
- class WriteHandler>
- BOOST_ASIO_INITFN_RESULT_TYPE(
- WriteHandler, void(error_code, std::size_t))
- async_write_some(
- ConstBufferSequence const& buffers,
- WriteHandler&& handler);
-};
-
-} // beast
-} // boost
-
-#include <boost/beast/experimental/core/impl/flat_stream.ipp>
-
-#endif
diff --git a/boost/beast/experimental/core/impl/flat_stream.ipp b/boost/beast/experimental/core/impl/flat_stream.ipp
deleted file mode 100644
index a94622f7cc..0000000000
--- a/boost/beast/experimental/core/impl/flat_stream.ipp
+++ /dev/null
@@ -1,309 +0,0 @@
-//
-// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_IMPL_FLAT_STREAM_IPP
-#define BOOST_BEAST_CORE_IMPL_FLAT_STREAM_IPP
-
-#include <boost/beast/core/buffers_prefix.hpp>
-#include <boost/beast/websocket/teardown.hpp>
-#include <boost/asio/associated_allocator.hpp>
-#include <boost/asio/associated_executor.hpp>
-#include <boost/asio/buffer.hpp>
-#include <boost/asio/coroutine.hpp>
-#include <boost/asio/handler_continuation_hook.hpp>
-#include <boost/asio/handler_invoke_hook.hpp>
-
-namespace boost {
-namespace beast {
-
-template<class NextLayer>
-template<class ConstBufferSequence, class Handler>
-class flat_stream<NextLayer>::write_op
- : public boost::asio::coroutine
-{
- using alloc_type = typename
-#if defined(BOOST_NO_CXX11_ALLOCATOR)
- boost::asio::associated_allocator_t<Handler>::template
- rebind<char>::other;
-#else
- std::allocator_traits<boost::asio::associated_allocator_t<Handler>>
- ::template rebind_alloc<char>;
-#endif
-
- struct deleter
- {
- alloc_type alloc;
- std::size_t size = 0;
-
- explicit
- deleter(alloc_type const& alloc_)
- : alloc(alloc_)
- {
- }
-
- void
- operator()(char* p)
- {
- alloc.deallocate(p, size);
- }
- };
-
- flat_stream<NextLayer>& s_;
- ConstBufferSequence b_;
- std::unique_ptr<char, deleter> p_;
- Handler h_;
-
-public:
- template<class DeducedHandler>
- write_op(
- flat_stream<NextLayer>& s,
- ConstBufferSequence const& b,
- DeducedHandler&& h)
- : s_(s)
- , b_(b)
- , p_(nullptr, deleter{
- (boost::asio::get_associated_allocator)(h)})
- , h_(std::forward<DeducedHandler>(h))
- {
- }
-
- using allocator_type =
- boost::asio::associated_allocator_t<Handler>;
-
- allocator_type
- get_allocator() const noexcept
- {
- return (boost::asio::get_associated_allocator)(h_);
- }
-
- using executor_type = boost::asio::associated_executor_t<
- Handler, decltype(std::declval<NextLayer&>().get_executor())>;
-
- executor_type
- get_executor() const noexcept
- {
- return (boost::asio::get_associated_executor)(
- h_, s_.get_executor());
- }
-
- void
- operator()(
- boost::system::error_code ec,
- std::size_t bytes_transferred);
-
- friend
- bool asio_handler_is_continuation(write_op* op)
- {
- using boost::asio::asio_handler_is_continuation;
- return asio_handler_is_continuation(
- std::addressof(op->h_));
- }
-
- template<class Function>
- friend
- void asio_handler_invoke(Function&& f, write_op* op)
- {
- using boost::asio::asio_handler_invoke;
- asio_handler_invoke(f, std::addressof(op->h_));
- }
-};
-
-template<class NextLayer>
-template<class ConstBufferSequence, class Handler>
-void
-flat_stream<NextLayer>::
-write_op<ConstBufferSequence, Handler>::
-operator()(
- error_code ec,
- std::size_t bytes_transferred)
-{
- BOOST_ASIO_CORO_REENTER(*this)
- {
- BOOST_ASIO_CORO_YIELD
- {
- auto const result = coalesce(b_, coalesce_limit);
- if(result.second)
- {
- p_.get_deleter().size = result.first;
- p_.reset(p_.get_deleter().alloc.allocate(
- p_.get_deleter().size));
- boost::asio::buffer_copy(
- boost::asio::buffer(
- p_.get(), p_.get_deleter().size),
- b_, result.first);
- s_.stream_.async_write_some(
- boost::asio::buffer(
- p_.get(), p_.get_deleter().size),
- std::move(*this));
- }
- else
- {
- s_.stream_.async_write_some(
- boost::beast::buffers_prefix(result.first, b_),
- std::move(*this));
- }
- }
- p_.reset();
- h_(ec, bytes_transferred);
- }
-}
-
-//------------------------------------------------------------------------------
-
-template<class NextLayer>
-template<class... Args>
-flat_stream<NextLayer>::
-flat_stream(Args&&... args)
- : stream_(std::forward<Args>(args)...)
-{
-}
-
-template<class NextLayer>
-template<class MutableBufferSequence>
-std::size_t
-flat_stream<NextLayer>::
-read_some(MutableBufferSequence const& buffers)
-{
- static_assert(boost::beast::is_sync_read_stream<next_layer_type>::value,
- "SyncReadStream requirements not met");
- static_assert(boost::asio::is_mutable_buffer_sequence<
- MutableBufferSequence>::value,
- "MutableBufferSequence requirements not met");
- error_code ec;
- auto n = read_some(buffers, ec);
- if(ec)
- BOOST_THROW_EXCEPTION(boost::system::system_error{ec});
- return n;
-}
-
-template<class NextLayer>
-template<class MutableBufferSequence>
-std::size_t
-flat_stream<NextLayer>::
-read_some(MutableBufferSequence const& buffers, error_code& ec)
-{
- return stream_.read_some(buffers, ec);
-}
-
-template<class NextLayer>
-template<
- class MutableBufferSequence,
- class ReadHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(
- ReadHandler, void(error_code, std::size_t))
-flat_stream<NextLayer>::
-async_read_some(
- MutableBufferSequence const& buffers,
- ReadHandler&& handler)
-{
- static_assert(boost::beast::is_async_read_stream<next_layer_type>::value,
- "AsyncReadStream requirements not met");
- static_assert(boost::asio::is_mutable_buffer_sequence<
- MutableBufferSequence >::value,
- "MutableBufferSequence requirements not met");
- return stream_.async_read_some(
- buffers, std::forward<ReadHandler>(handler));
-}
-
-template<class NextLayer>
-template<class ConstBufferSequence>
-std::size_t
-flat_stream<NextLayer>::
-write_some(ConstBufferSequence const& buffers)
-{
- static_assert(boost::beast::is_sync_write_stream<next_layer_type>::value,
- "SyncWriteStream requirements not met");
- static_assert(boost::asio::is_const_buffer_sequence<
- ConstBufferSequence>::value,
- "ConstBufferSequence requirements not met");
- auto const result = coalesce(buffers, coalesce_limit);
- if(result.second)
- {
- std::unique_ptr<char[]> p{new char[result.first]};
- auto const b = boost::asio::buffer(p.get(), result.first);
- boost::asio::buffer_copy(b, buffers);
- return stream_.write_some(b);
- }
- return stream_.write_some(
- boost::beast::buffers_prefix(result.first, buffers));
-}
-
-template<class NextLayer>
-template<class ConstBufferSequence>
-std::size_t
-flat_stream<NextLayer>::
-write_some(ConstBufferSequence const& buffers, error_code& ec)
-{
- static_assert(boost::beast::is_sync_write_stream<next_layer_type>::value,
- "SyncWriteStream requirements not met");
- static_assert(boost::asio::is_const_buffer_sequence<
- ConstBufferSequence>::value,
- "ConstBufferSequence requirements not met");
- auto const result = coalesce(buffers, coalesce_limit);
- if(result.second)
- {
- std::unique_ptr<char[]> p{new char[result.first]};
- auto const b = boost::asio::buffer(p.get(), result.first);
- boost::asio::buffer_copy(b, buffers);
- return stream_.write_some(b, ec);
- }
- return stream_.write_some(
- boost::beast::buffers_prefix(result.first, buffers), ec);
-}
-
-template<class NextLayer>
-template<
- class ConstBufferSequence,
- class WriteHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(
- WriteHandler, void(error_code, std::size_t))
-flat_stream<NextLayer>::
-async_write_some(
- ConstBufferSequence const& buffers,
- WriteHandler&& handler)
-{
- static_assert(boost::beast::is_async_write_stream<next_layer_type>::value,
- "AsyncWriteStream requirements not met");
- static_assert(boost::asio::is_const_buffer_sequence<
- ConstBufferSequence>::value,
- "ConstBufferSequence requirements not met");
- BOOST_BEAST_HANDLER_INIT(
- WriteHandler, void(error_code, std::size_t));
- write_op<ConstBufferSequence, BOOST_ASIO_HANDLER_TYPE(
- WriteHandler, void(error_code, std::size_t))>{
- *this, buffers, std::move(init.completion_handler)}({}, 0);
- return init.result.get();
-}
-
-template<class NextLayer>
-void
-teardown(
- boost::beast::websocket::role_type role,
- flat_stream<NextLayer>& s,
- error_code& ec)
-{
- using boost::beast::websocket::teardown;
- teardown(role, s.next_layer(), ec);
-}
-
-template<class NextLayer, class TeardownHandler>
-void
-async_teardown(
- boost::beast::websocket::role_type role,
- flat_stream<NextLayer>& s,
- TeardownHandler&& handler)
-{
- using boost::beast::websocket::async_teardown;
- async_teardown(role, s.next_layer(), std::move(handler));
-}
-
-} // beast
-} // boost
-
-#endif
diff --git a/boost/beast/experimental/core/impl/timeout_service.ipp b/boost/beast/experimental/core/impl/timeout_service.ipp
deleted file mode 100644
index 4da0eed115..0000000000
--- a/boost/beast/experimental/core/impl/timeout_service.ipp
+++ /dev/null
@@ -1,31 +0,0 @@
-//
-// Copyright (c) 2018 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_IMPL_TIMEOUT_SERVICE_HPP
-#define BOOST_BEAST_CORE_IMPL_TIMEOUT_SERVICE_HPP
-
-#include <boost/beast/experimental/core/detail/timeout_service.hpp>
-
-namespace boost {
-namespace beast {
-
-inline
-void
-set_timeout_service_options(
- boost::asio::io_context& ioc,
- std::chrono::seconds interval)
-{
- boost::asio::use_service<
- detail::timeout_service>(ioc).set_option(interval);
-}
-
-} // beast
-} // boost
-
-#endif
diff --git a/boost/beast/experimental/core/impl/timeout_socket.hpp b/boost/beast/experimental/core/impl/timeout_socket.hpp
deleted file mode 100644
index 8c5a7d7427..0000000000
--- a/boost/beast/experimental/core/impl/timeout_socket.hpp
+++ /dev/null
@@ -1,207 +0,0 @@
-//
-// Copyright (c) 2018 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_IMPL_TIMOUT_SOCKET_HPP
-#define BOOST_BEAST_CORE_IMPL_TIMOUT_SOCKET_HPP
-
-#include <boost/beast/core/bind_handler.hpp>
-#include <boost/beast/core/type_traits.hpp>
-#include <boost/beast/experimental/core/detail/timeout_work_guard.hpp>
-#include <boost/asio/executor_work_guard.hpp>
-#include <memory>
-#include <utility>
-
-namespace boost {
-namespace beast {
-
-template<class Protocol, class Executor>
-template<class Handler>
-class basic_timeout_socket<Protocol, Executor>::async_op
-{
- Handler h_;
- basic_timeout_socket& s_;
- detail::timeout_work_guard work_;
-
-public:
- async_op(async_op&&) = default;
- async_op(async_op const&) = delete;
-
- template<class Buffers, class DeducedHandler>
- async_op(
- Buffers const& b,
- DeducedHandler&& h,
- basic_timeout_socket& s,
- std::true_type)
- : h_(std::forward<DeducedHandler>(h))
- , s_(s)
- , work_(s.rd_timer_)
- {
- s_.sock_.async_read_some(b, std::move(*this));
- }
-
- template<class Buffers, class DeducedHandler>
- async_op(
- Buffers const& b,
- DeducedHandler&& h,
- basic_timeout_socket& s,
- std::false_type)
- : h_(std::forward<DeducedHandler>(h))
- , s_(s)
- , work_(s.wr_timer_)
- {
- s_.sock_.async_write_some(b, std::move(*this));
- }
-
- using allocator_type =
- boost::asio::associated_allocator_t<Handler>;
-
- allocator_type
- get_allocator() const noexcept
- {
- return (boost::asio::get_associated_allocator)(h_);
- }
-
- using executor_type =
- boost::asio::associated_executor_t<Handler, decltype(
- std::declval<basic_timeout_socket<Protocol>&>().get_executor())>;
-
- executor_type
- get_executor() const noexcept
- {
- return (boost::asio::get_associated_executor)(
- h_, s_.get_executor());
- }
-
- friend
- bool asio_handler_is_continuation(async_op* op)
- {
- using boost::asio::asio_handler_is_continuation;
- return asio_handler_is_continuation(
- std::addressof(op->h_));
- }
-
- template<class Function>
- friend
- void asio_handler_invoke(Function&& f, async_op* op)
- {
- using boost::asio::asio_handler_invoke;
- asio_handler_invoke(f, std::addressof(op->h_));
- }
-
- void
- operator()(error_code ec, std::size_t bytes_transferred)
- {
- if(s_.expired_)
- {
- BOOST_ASSERT(ec == boost::asio::error::operation_aborted);
- ec = boost::asio::error::timed_out;
- }
- else
- {
- work_.complete();
- }
- h_(ec, bytes_transferred);
- }
-};
-
-//------------------------------------------------------------------------------
-
-template<class Protocol, class Executor>
-basic_timeout_socket<Protocol, Executor>::
-timer::
-timer(basic_timeout_socket& s)
- : detail::timeout_object(s.ex_.context())
- , s_(s)
-{
-}
-
-template<class Protocol, class Executor>
-auto
-basic_timeout_socket<Protocol, Executor>::
-timer::
-operator=(timer&&)
- -> timer&
-{
- return *this;
-}
-
-template<class Protocol, class Executor>
-void
-basic_timeout_socket<Protocol, Executor>::
-timer::
-on_timeout()
-{
- boost::asio::post(
- s_.ex_,
- [this]()
- {
- s_.expired_ = true;
- s_.sock_.cancel();
- });
-}
-
-//------------------------------------------------------------------------------
-
-template<class Protocol, class Executor>
-template<class ExecutionContext, class>
-basic_timeout_socket<Protocol, Executor>::
-basic_timeout_socket(ExecutionContext& ctx)
- : ex_(ctx.get_executor())
- , rd_timer_(*this)
- , wr_timer_(*this)
- , sock_(ctx)
-{
-}
-
-template<class Protocol, class Executor>
-template<class MutableBufferSequence, class ReadHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void(boost::system::error_code, std::size_t))
-basic_timeout_socket<Protocol, Executor>::
-async_read_some(
- MutableBufferSequence const& buffers,
- ReadHandler&& handler)
-{
- static_assert(boost::asio::is_mutable_buffer_sequence<
- MutableBufferSequence>::value,
- "MutableBufferSequence requirements not met");
- BOOST_BEAST_HANDLER_INIT(
- ReadHandler, void(error_code, std::size_t));
- async_op<BOOST_ASIO_HANDLER_TYPE(ReadHandler,
- void(error_code, std::size_t))>(buffers,
- std::forward<ReadHandler>(handler), *this,
- std::true_type{});
- return init.result.get();
-}
-
-template<class Protocol, class Executor>
-template<class ConstBufferSequence, class WriteHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void(boost::system::error_code, std::size_t))
-basic_timeout_socket<Protocol, Executor>::
-async_write_some(
- ConstBufferSequence const& buffers,
- WriteHandler&& handler)
-{
- static_assert(boost::asio::is_const_buffer_sequence<
- ConstBufferSequence>::value,
- "ConstBufferSequence requirements not met");
- BOOST_BEAST_HANDLER_INIT(
- WriteHandler, void(error_code, std::size_t));
- async_op<BOOST_ASIO_HANDLER_TYPE(WriteHandler,
- void(error_code, std::size_t))>(buffers,
- std::forward<WriteHandler>(handler), *this,
- std::false_type{});
- return init.result.get();
-}
-
-} // beast
-} // boost
-
-#endif
diff --git a/boost/beast/experimental/core/ssl_stream.hpp b/boost/beast/experimental/core/ssl_stream.hpp
deleted file mode 100644
index b61bfbdef4..0000000000
--- a/boost/beast/experimental/core/ssl_stream.hpp
+++ /dev/null
@@ -1,730 +0,0 @@
-//
-// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_SSL_STREAM_HPP
-#define BOOST_BEAST_CORE_SSL_STREAM_HPP
-
-#include <boost/beast/core/detail/config.hpp>
-
-// This include is necessary to work with `ssl::stream` and `boost::beast::websocket::stream`
-#include <boost/beast/websocket/ssl.hpp>
-
-#include <boost/beast/experimental/core/flat_stream.hpp>
-#include <boost/asio/ssl/stream.hpp>
-#include <cstddef>
-#include <memory>
-#include <type_traits>
-#include <utility>
-
-namespace boost {
-namespace beast {
-
-/** Provides stream-oriented functionality using OpenSSL
-
- The stream class template provides asynchronous and blocking
- stream-oriented functionality using SSL.
-
- @par Thread Safety
- @e Distinct @e objects: Safe.@n
- @e Shared @e objects: Unsafe. The application must also ensure that all
- asynchronous operations are performed within the same implicit or explicit
- strand.
-
- @par Example
- To use this template with a `boost::asio::ip::tcp::socket`, you would write:
- @code
- boost::asio::io_context ioc;
- boost::asio::ssl::context ctx{boost::asio::ssl::context::sslv23};
- boost::beast::ssl_stream<boost::asio:ip::tcp::socket> sock{ioc, ctx};
- @endcode
-
- In addition to providing an interface identical to `boost::asio::ssl::stream`,
- the wrapper has the following additional properties:
-
- @li Satisfies @b MoveConstructible
-
- @li Satisfies @b MoveAssignable
-
- @li Constructible from a moved socket.
-
- @li Uses @ref flat_stream internally, as a performance work-around for a
- limitation of `boost::asio::ssl::stream` when writing buffer sequences
- having length greater than one.
-
- @par Concepts:
- @li AsyncReadStream
- @li AsyncWriteStream
- @li Stream
- @li SyncReadStream
- @li SyncWriteStream
-*/
-template<class NextLayer>
-class ssl_stream
- : public boost::asio::ssl::stream_base
-{
- using ssl_stream_type = boost::asio::ssl::stream<NextLayer>;
- using stream_type = boost::beast::flat_stream<ssl_stream_type>;
-
- std::unique_ptr<stream_type> p_;
- boost::asio::ssl::context* ctx_;
-
-public:
- /// The native handle type of the SSL stream.
- using native_handle_type =
- typename ssl_stream_type::native_handle_type;
-
- /// Structure for use with deprecated impl_type.
- using impl_struct = typename ssl_stream_type::impl_struct;
-
- /// The type of the next layer.
- using next_layer_type = typename ssl_stream_type::next_layer_type;
-
- /// The type of the lowest layer.
- using lowest_layer_type = typename ssl_stream_type::lowest_layer_type;
-
- /// The type of the executor associated with the object.
- using executor_type = typename stream_type::executor_type;
-
- /** Construct a stream.
-
- This constructor creates a stream and initialises the underlying stream
- object.
-
- @param arg The argument to be passed to initialise the underlying stream.
-
- @param ctx The SSL context to be used for the stream.
- */
- template<class Arg>
- ssl_stream(
- Arg&& arg,
- boost::asio::ssl::context& ctx)
- : p_(new stream_type{
- std::forward<Arg>(arg), ctx})
- , ctx_(&ctx)
- {
- }
-
- /// Move Constructor
- ssl_stream(ssl_stream&& other)
- : p_(std::move(other.p_))
- , ctx_(other.ctx_)
- {
- }
-
- /// Move Assignment
- ssl_stream& operator=(ssl_stream&& other)
- {
- p_ = std::move(other.p_);
- ctx_ = other.ctx_;
- return *this;
- }
-
- /** Get the executor associated with the object.
-
- This function may be used to obtain the executor object that the stream
- uses to dispatch handlers for asynchronous operations.
-
- @return A copy of the executor that stream will use to dispatch handlers.
- */
- executor_type
- get_executor() noexcept
- {
- return p_->get_executor();
- }
-
- /** Get the underlying implementation in the native type.
-
- This function may be used to obtain the underlying implementation of the
- context. This is intended to allow access to context functionality that is
- not otherwise provided.
-
- @par Example
- The native_handle() function returns a pointer of type @c SSL* that is
- suitable for passing to functions such as @c SSL_get_verify_result and
- @c SSL_get_peer_certificate:
- @code
- boost::beast::ssl_stream<boost::asio:ip::tcp::socket> ss{ioc, ctx};
-
- // ... establish connection and perform handshake ...
-
- if (X509* cert = SSL_get_peer_certificate(ss.native_handle()))
- {
- if (SSL_get_verify_result(ss.native_handle()) == X509_V_OK)
- {
- // ...
- }
- }
- @endcode
- */
- native_handle_type
- native_handle()
- {
- return p_->next_layer().native_handle();
- }
-
- /** Get a reference to the next layer.
-
- This function returns a reference to the next layer in a stack of stream
- layers.
-
- @note The next layer is the wrapped stream and not the @ref flat_stream
- used in the implementation.
-
- @return A reference to the next layer in the stack of stream layers.
- Ownership is not transferred to the caller.
- */
- next_layer_type const&
- next_layer() const
- {
- return p_->next_layer().next_layer();
- }
-
- /** Get a reference to the next layer.
-
- This function returns a reference to the next layer in a stack of stream
- layers.
-
- @note The next layer is the wrapped stream and not the @ref flat_stream
- used in the implementation.
-
- @return A reference to the next layer in the stack of stream layers.
- Ownership is not transferred to the caller.
- */
- next_layer_type&
- next_layer()
- {
- return p_->next_layer().next_layer();
- }
-
- /** Get a reference to the lowest layer.
-
- This function returns a reference to the lowest layer in a stack of stream
- layers.
-
- @return A reference to the lowest layer in the stack of stream layers.
- Ownership is not transferred to the caller.
- */
- lowest_layer_type&
- lowest_layer()
- {
- return p_->lowest_layer();
- }
-
- /** Get a reference to the lowest layer.
-
- This function returns a reference to the lowest layer in a stack of stream
- layers.
-
- @return A reference to the lowest layer in the stack of stream layers.
- Ownership is not transferred to the caller.
- */
- lowest_layer_type const&
- lowest_layer() const
- {
- return p_->lowest_layer();
- }
-
- /** Set the peer verification mode.
-
- This function may be used to configure the peer verification mode used by
- the stream. The new mode will override the mode inherited from the context.
-
- @param v A bitmask of peer verification modes.
-
- @throws boost::system::system_error Thrown on failure.
-
- @note Calls @c SSL_set_verify.
- */
- void
- set_verify_mode(boost::asio::ssl::verify_mode v)
- {
- p_->next_layer().set_verify_mode(v);
- }
-
- /** Set the peer verification mode.
-
- This function may be used to configure the peer verification mode used by
- the stream. The new mode will override the mode inherited from the context.
-
- @param v A bitmask of peer verification modes. See `verify_mode` for
- available values.
-
- @param ec Set to indicate what error occurred, if any.
-
- @note Calls @c SSL_set_verify.
- */
- boost::system::error_code
- set_verify_mode(boost::asio::ssl::verify_mode v,
- boost::system::error_code& ec)
- {
- return p_->next_layer().set_verify_mode(v, ec);
- }
-
- /** Set the peer verification depth.
-
- This function may be used to configure the maximum verification depth
- allowed by the stream.
-
- @param depth Maximum depth for the certificate chain verification that
- shall be allowed.
-
- @throws boost::system::system_error Thrown on failure.
-
- @note Calls @c SSL_set_verify_depth.
- */
- void
- set_verify_depth(int depth)
- {
- p_->next_layer().set_verify_depth(depth);
- }
-
- /** Set the peer verification depth.
-
- This function may be used to configure the maximum verification depth
- allowed by the stream.
-
- @param depth Maximum depth for the certificate chain verification that
- shall be allowed.
-
- @param ec Set to indicate what error occurred, if any.
-
- @note Calls @c SSL_set_verify_depth.
- */
- boost::system::error_code
- set_verify_depth(
- int depth, boost::system::error_code& ec)
- {
- return p_->next_layer().set_verify_depth(depth, ec);
- }
-
- /** Set the callback used to verify peer certificates.
-
- This function is used to specify a callback function that will be called
- by the implementation when it needs to verify a peer certificate.
-
- @param callback The function object to be used for verifying a certificate.
- The function signature of the handler must be:
- @code bool verify_callback(
- bool preverified, // True if the certificate passed pre-verification.
- verify_context& ctx // The peer certificate and other context.
- ); @endcode
- The return value of the callback is true if the certificate has passed
- verification, false otherwise.
-
- @throws boost::system::system_error Thrown on failure.
-
- @note Calls @c SSL_set_verify.
- */
- template<class VerifyCallback>
- void
- set_verify_callback(VerifyCallback callback)
- {
- p_->next_layer().set_verify_callback(callback);
- }
-
- /** Set the callback used to verify peer certificates.
-
- This function is used to specify a callback function that will be called
- by the implementation when it needs to verify a peer certificate.
-
- @param callback The function object to be used for verifying a certificate.
- The function signature of the handler must be:
- @code bool verify_callback(
- bool preverified, // True if the certificate passed pre-verification.
- boost::asio::verify_context& ctx // The peer certificate and other context.
- ); @endcode
- The return value of the callback is true if the certificate has passed
- verification, false otherwise.
-
- @param ec Set to indicate what error occurred, if any.
-
- @note Calls @c SSL_set_verify.
- */
- template<class VerifyCallback>
- boost::system::error_code
- set_verify_callback(VerifyCallback callback,
- boost::system::error_code& ec)
- {
- return p_->next_layer().set_verify_callback(callback, ec);
- }
-
- /** Perform SSL handshaking.
-
- This function is used to perform SSL handshaking on the stream. The
- function call will block until handshaking is complete or an error occurs.
-
- @param type The type of handshaking to be performed, i.e. as a client or as
- a server.
-
- @throws boost::system::system_error Thrown on failure.
- */
- void
- handshake(handshake_type type)
- {
- p_->next_layer().handshake(type);
- }
-
- /** Perform SSL handshaking.
-
- This function is used to perform SSL handshaking on the stream. The
- function call will block until handshaking is complete or an error occurs.
-
- @param type The type of handshaking to be performed, i.e. as a client or as
- a server.
-
- @param ec Set to indicate what error occurred, if any.
- */
- boost::system::error_code
- handshake(handshake_type type,
- boost::system::error_code& ec)
- {
- return p_->next_layer().handshake(type, ec);
- }
-
- /** Perform SSL handshaking.
-
- This function is used to perform SSL handshaking on the stream. The
- function call will block until handshaking is complete or an error occurs.
-
- @param type The type of handshaking to be performed, i.e. as a client or as
- a server.
-
- @param buffers The buffered data to be reused for the handshake.
-
- @throws boost::system::system_error Thrown on failure.
- */
- template<class ConstBufferSequence>
- void
- handshake(
- handshake_type type, ConstBufferSequence const& buffers)
- {
- p_->next_layer().handshake(type, buffers);
- }
-
- /** Perform SSL handshaking.
-
- This function is used to perform SSL handshaking on the stream. The
- function call will block until handshaking is complete or an error occurs.
-
- @param type The type of handshaking to be performed, i.e. as a client or as
- a server.
-
- @param buffers The buffered data to be reused for the handshake.
-
- @param ec Set to indicate what error occurred, if any.
- */
- template<class ConstBufferSequence>
- boost::system::error_code
- handshake(handshake_type type,
- ConstBufferSequence const& buffers,
- boost::system::error_code& ec)
- {
- return p_->next_layer().handshake(type, buffers, ec);
- }
-
- /** Start an asynchronous SSL handshake.
-
- This function is used to asynchronously perform an SSL handshake on the
- stream. This function call always returns immediately.
-
- @param type The type of handshaking to be performed, i.e. as a client or as
- a server.
-
- @param handler The handler to be called when the handshake operation
- completes. Copies will be made of the handler as required. The equivalent
- function signature of the handler must be:
- @code void handler(
- const boost::system::error_code& error // Result of operation.
- ); @endcode
- */
- template<class HandshakeHandler>
- BOOST_ASIO_INITFN_RESULT_TYPE(HandshakeHandler,
- void(boost::system::error_code))
- async_handshake(handshake_type type,
- BOOST_ASIO_MOVE_ARG(HandshakeHandler) handler)
- {
- return p_->next_layer().async_handshake(type,
- BOOST_ASIO_MOVE_CAST(HandshakeHandler)(handler));
- }
-
- /** Start an asynchronous SSL handshake.
-
- This function is used to asynchronously perform an SSL handshake on the
- stream. This function call always returns immediately.
-
- @param type The type of handshaking to be performed, i.e. as a client or as
- a server.
-
- @param buffers The buffered data to be reused for the handshake. Although
- the buffers object may be copied as necessary, ownership of the underlying
- buffers is retained by the caller, which must guarantee that they remain
- valid until the handler is called.
-
- @param handler The handler to be called when the handshake operation
- completes. Copies will be made of the handler as required. The equivalent
- function signature of the handler must be:
- @code void handler(
- const boost::system::error_code& error, // Result of operation.
- std::size_t bytes_transferred // Amount of buffers used in handshake.
- ); @endcode
- */
- template<class ConstBufferSequence, class BufferedHandshakeHandler>
- BOOST_ASIO_INITFN_RESULT_TYPE(BufferedHandshakeHandler,
- void (boost::system::error_code, std::size_t))
- async_handshake(handshake_type type, ConstBufferSequence const& buffers,
- BOOST_ASIO_MOVE_ARG(BufferedHandshakeHandler) handler)
- {
- return p_->next_layer().async_handshake(type, buffers,
- BOOST_ASIO_MOVE_CAST(BufferedHandshakeHandler)(handler));
- }
-
- /** Shut down SSL on the stream.
-
- This function is used to shut down SSL on the stream. The function call
- will block until SSL has been shut down or an error occurs.
-
- @throws boost::system::system_error Thrown on failure.
- */
- void
- shutdown()
- {
- p_->next_layer().shutdown();
- }
-
- /** Shut down SSL on the stream.
-
- This function is used to shut down SSL on the stream. The function call
- will block until SSL has been shut down or an error occurs.
-
- @param ec Set to indicate what error occurred, if any.
- */
- boost::system::error_code
- shutdown(boost::system::error_code& ec)
- {
- return p_->next_layer().shutdown(ec);
- }
-
- /** Asynchronously shut down SSL on the stream.
-
- This function is used to asynchronously shut down SSL on the stream. This
- function call always returns immediately.
-
- @param handler The handler to be called when the handshake operation
- completes. Copies will be made of the handler as required. The equivalent
- function signature of the handler must be:
- @code void handler(
- const boost::system::error_code& error // Result of operation.
- ); @endcode
- */
- template<class ShutdownHandler>
- BOOST_ASIO_INITFN_RESULT_TYPE(ShutdownHandler,
- void (boost::system::error_code))
- async_shutdown(BOOST_ASIO_MOVE_ARG(ShutdownHandler) handler)
- {
- return p_->next_layer().async_shutdown(
- BOOST_ASIO_MOVE_CAST(ShutdownHandler)(handler));
- }
-
- /** Write some data to the stream.
-
- This function is used to write data on the stream. The function call will
- block until one or more bytes of data has been written successfully, or
- until an error occurs.
-
- @param buffers The data to be written.
-
- @returns The number of bytes written.
-
- @throws boost::system::system_error Thrown on failure.
-
- @note The `write_some` operation may not transmit all of the data to the
- peer. Consider using the `boost::asio::write` function if you need to
- ensure that all data is written before the blocking operation completes.
- */
- template<class ConstBufferSequence>
- std::size_t
- write_some(ConstBufferSequence const& buffers)
- {
- return p_->write_some(buffers);
- }
-
- /** Write some data to the stream.
-
- This function is used to write data on the stream. The function call will
- block until one or more bytes of data has been written successfully, or
- until an error occurs.
-
- @param buffers The data to be written to the stream.
-
- @param ec Set to indicate what error occurred, if any.
-
- @returns The number of bytes written. Returns 0 if an error occurred.
-
- @note The `write_some` operation may not transmit all of the data to the
- peer. Consider using the `boost::asio::write` function if you need to
- ensure that all data is written before the blocking operation completes.
- */
- template<class ConstBufferSequence>
- std::size_t
- write_some(ConstBufferSequence const& buffers,
- boost::system::error_code& ec)
- {
- return p_->write_some(buffers, ec);
- }
-
- /** Start an asynchronous write.
-
- This function is used to asynchronously write one or more bytes of data to
- the stream. The function call always returns immediately.
-
- @param buffers The data to be written to the stream. Although the buffers
- object may be copied as necessary, ownership of the underlying buffers is
- retained by the caller, which must guarantee that they remain valid until
- the handler is called.
-
- @param handler The handler to be called when the write operation completes.
- Copies will be made of the handler as required. The equivalent function
- signature of the handler must be:
- @code void handler(
- const boost::system::error_code& error, // Result of operation.
- std::size_t bytes_transferred // Number of bytes written.
- ); @endcode
-
- @note The `async_write_some` operation may not transmit all of the data to
- the peer. Consider using the `boost::asio::async_write` function if you
- need to ensure that all data is written before the asynchronous operation
- completes.
- */
- template<class ConstBufferSequence, class WriteHandler>
- BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (boost::system::error_code, std::size_t))
- async_write_some(ConstBufferSequence const& buffers,
- BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
- {
- return p_->async_write_some(buffers,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
- }
-
- /** Read some data from the stream.
-
- This function is used to read data from the stream. The function call will
- block until one or more bytes of data has been read successfully, or until
- an error occurs.
-
- @param buffers The buffers into which the data will be read.
-
- @returns The number of bytes read.
-
- @throws boost::system::system_error Thrown on failure.
-
- @note The `read_some` operation may not read all of the requested number of
- bytes. Consider using the `boost::asio::read` function if you need to ensure
- that the requested amount of data is read before the blocking operation
- completes.
- */
- template<class MutableBufferSequence>
- std::size_t
- read_some(MutableBufferSequence const& buffers)
- {
- return p_->read_some(buffers);
- }
-
- /** Read some data from the stream.
-
- This function is used to read data from the stream. The function call will
- block until one or more bytes of data has been read successfully, or until
- an error occurs.
-
- @param buffers The buffers into which the data will be read.
-
- @param ec Set to indicate what error occurred, if any.
-
- @returns The number of bytes read. Returns 0 if an error occurred.
-
- @note The `read_some` operation may not read all of the requested number of
- bytes. Consider using the `boost::asio::read` function if you need to ensure
- that the requested amount of data is read before the blocking operation
- completes.
- */
- template<class MutableBufferSequence>
- std::size_t
- read_some(MutableBufferSequence const& buffers,
- boost::system::error_code& ec)
- {
- return p_->read_some(buffers, ec);
- }
-
- /** Start an asynchronous read.
-
- This function is used to asynchronously read one or more bytes of data from
- the stream. The function call always returns immediately.
-
- @param buffers The buffers into which the data will be read. Although the
- buffers object may be copied as necessary, ownership of the underlying
- buffers is retained by the caller, which must guarantee that they remain
- valid until the handler is called.
-
- @param handler The handler to be called when the read operation completes.
- Copies will be made of the handler as required. The equivalent function
- signature of the handler must be:
- @code void handler(
- const boost::system::error_code& error, // Result of operation.
- std::size_t bytes_transferred // Number of bytes read.
- ); @endcode
-
- @note The `async_read_some` operation may not read all of the requested
- number of bytes. Consider using the `boost::asio::async_read` function
- if you need to ensure that the requested amount of data is read before
- the asynchronous operation completes.
- */
- template<class MutableBufferSequence, class ReadHandler>
- BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void(boost::system::error_code, std::size_t))
- async_read_some(MutableBufferSequence const& buffers,
- BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
- {
- return p_->async_read_some(buffers,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
- }
-};
-
-// These hooks are used to inform boost::beast::websocket::stream on
-// how to tear down the connection as part of the WebSocket
-// protocol specifications
-#if ! BOOST_BEAST_DOXYGEN
-template<class SyncStream>
-void
-teardown(
- boost::beast::websocket::role_type role,
- ssl_stream<SyncStream>& stream,
- boost::system::error_code& ec)
-{
- // Just forward it to the wrapped stream
- using boost::beast::websocket::teardown;
- teardown(role, stream.next_layer(), ec);
-}
-
-template<class AsyncStream, class TeardownHandler>
-void
-async_teardown(
- boost::beast::websocket::role_type role,
- ssl_stream<AsyncStream>& stream,
- TeardownHandler&& handler)
-{
- // Just forward it to the wrapped stream
- using boost::beast::websocket::async_teardown;
- async_teardown(role,
- stream.next_layer(), std::forward<TeardownHandler>(handler));
-}
-#endif
-
-} // beast
-} // boost
-
-#endif
diff --git a/boost/beast/experimental/core/timeout_service.hpp b/boost/beast/experimental/core/timeout_service.hpp
deleted file mode 100644
index 2a5da2b887..0000000000
--- a/boost/beast/experimental/core/timeout_service.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright (c) 2018 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_TIMEOUT_SERVICE_HPP
-#define BOOST_BEAST_CORE_TIMEOUT_SERVICE_HPP
-
-//#include <boost/asio/execution_context.hpp>
-#include <boost/asio/io_context.hpp>
-#include <chrono>
-
-namespace boost {
-namespace beast {
-
-/** Set timeout service options in an execution context.
-
- This changes the time interval for all timeouts associated
- with the execution context. The option must be set before any
- timeout objects are constructed.
-
- @param ctx The execution context.
-
- @param interval The approximate amount of time until a timeout occurs.
-*/
-void
-set_timeout_service_options(
- boost::asio::io_context& ctx, // VFALCO should be execution_context
- std::chrono::seconds interval);
-
-} // beast
-} // boost
-
-#include <boost/beast/experimental/core/impl/timeout_service.ipp>
-
-#endif
diff --git a/boost/beast/experimental/core/timeout_socket.hpp b/boost/beast/experimental/core/timeout_socket.hpp
deleted file mode 100644
index b2c2a22ea5..0000000000
--- a/boost/beast/experimental/core/timeout_socket.hpp
+++ /dev/null
@@ -1,240 +0,0 @@
-//
-// Copyright (c) 2018 Vinnie Falco (vinnie dot falco at gmail dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// Official repository: https://github.com/boostorg/beast
-//
-
-#ifndef BOOST_BEAST_CORE_TIMEOUT_SOCKET_HPP
-#define BOOST_BEAST_CORE_TIMEOUT_SOCKET_HPP
-
-#include <boost/beast/core/detail/config.hpp>
-#include <boost/beast/core/error.hpp>
-#include <boost/beast/core/type_traits.hpp>
-#include <boost/beast/experimental/core/detail/timeout_service.hpp>
-#include <boost/asio/async_result.hpp>
-#include <boost/asio/basic_stream_socket.hpp>
-#include <boost/asio/executor.hpp>
-#include <chrono>
-
-namespace boost {
-namespace asio {
-namespace ip {
-class tcp;
-} // ip
-} // asio
-} // boost
-
-namespace boost {
-namespace beast {
-
-/** A socket wrapper which automatically times out on asynchronous reads.
-
- This wraps a normal stream socket and implements a simple and efficient
- timeout for asynchronous read operations.
-
- @note Meets the requirements of @b AsyncReadStream and @b AsyncWriteStream
-*/
-template<
- class Protocol,
- class Executor = boost::asio::executor
->
-class basic_timeout_socket
-{
- template<class> class async_op;
-
- class timer : public detail::timeout_object
- {
- basic_timeout_socket& s_;
-
- public:
- explicit timer(basic_timeout_socket& s);
- timer& operator=(timer&& other);
- void on_timeout() override;
- };
-
- Executor ex_; // must come first
- timer rd_timer_;
- timer wr_timer_;
- boost::asio::basic_stream_socket<Protocol> sock_;
- bool expired_ = false;
-
-public:
- /// The type of the next layer.
- using next_layer_type = boost::asio::basic_stream_socket<Protocol>;
-
- /// The type of the lowest layer.
- using lowest_layer_type = get_lowest_layer<next_layer_type>;
-
- /// The protocol used by the stream.
- using protocol_type = Protocol;
-
- /// The type of the executor associated with the object.
- using executor_type = Executor;
-
- // VFALCO we only support default-construction
- // of the contained socket for now.
- // This constructor needs a protocol parameter.
- //
- /** Constructor
- */
- template<class ExecutionContext
-#if ! BOOST_BEAST_DOXYGEN
- , class = typename std::enable_if<
- std::is_convertible<
- ExecutionContext&,
- boost::asio::execution_context&>::value &&
- std::is_constructible<
- executor_type,
- typename ExecutionContext::executor_type>::value
- >::type
-#endif
- >
- explicit
- basic_timeout_socket(ExecutionContext& ctx);
-
- //--------------------------------------------------------------------------
-
- /** Get the executor associated with the object.
-
- This function may be used to obtain the executor object that the
- stream uses to dispatch handlers for asynchronous operations.
-
- @return A copy of the executor that stream will use to dispatch handlers.
- */
- executor_type
- get_executor() const noexcept
- {
- return ex_;
- }
-
- /** Get a reference to the next layer
-
- This function returns a reference to the next layer
- in a stack of stream layers.
-
- @return A reference to the next layer in the stack of
- stream layers.
- */
- next_layer_type&
- next_layer()
- {
- return sock_;
- }
-
- /** Get a reference to the next layer
-
- This function returns a reference to the next layer in a
- stack of stream layers.
-
- @return A reference to the next layer in the stack of
- stream layers.
- */
- next_layer_type const&
- next_layer() const
- {
- return sock_;
- }
-
- /** Get a reference to the lowest layer
-
- This function returns a reference to the lowest layer
- in a stack of stream layers.
-
- @return A reference to the lowest layer in the stack of
- stream layers.
- */
- lowest_layer_type&
- lowest_layer()
- {
- return sock_.lowest_layer();
- }
-
- /** Get a reference to the lowest layer
-
- This function returns a reference to the lowest layer
- in a stack of stream layers.
-
- @return A reference to the lowest layer in the stack of
- stream layers. Ownership is not transferred to the caller.
- */
- lowest_layer_type const&
- lowest_layer() const
- {
- return sock_.lowest_layer();
- }
-
- //--------------------------------------------------------------------------
-
- /** Start an asynchronous read.
-
- This function is used to asynchronously read data from the stream socket.
- The function call always returns immediately.
-
- @param buffers One or more buffers into which the data will be read.
- Although the buffers object may be copied as necessary, ownership of the
- underlying memory blocks is retained by the caller, which must guarantee
- that they remain valid until the handler is called.
-
- @param handler The handler to be called when the read operation completes.
- Copies will be made of the handler as required. The function signature of
- the handler must be:
- @code void handler(
- const boost::system::error_code& error, // Result of operation.
- std::size_t bytes_transferred // Number of bytes read.
- ); @endcode
- Regardless of whether the asynchronous operation completes immediately or
- not, the handler will not be invoked from within this function. Invocation
- of the handler will be performed in a manner equivalent to using
- boost::asio::io_context::post().
- */
- template<class MutableBufferSequence, class ReadHandler>
- BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void(boost::system::error_code, std::size_t))
- async_read_some(
- MutableBufferSequence const& buffers,
- ReadHandler&& handler);
-
- /** Start an asynchronous write.
-
- This function is used to asynchronously write data to the stream socket.
- The function call always returns immediately.
-
- @param buffers One or more data buffers to be written to the socket.
- Although the buffers object may be copied as necessary, ownership of the
- underlying memory blocks is retained by the caller, which must guarantee
- that they remain valid until the handler is called.
-
- @param handler The handler to be called when the write operation completes.
- Copies will be made of the handler as required. The function signature of
- the handler must be:
- @code void handler(
- const boost::system::error_code& error, // Result of operation.
- std::size_t bytes_transferred // Number of bytes written.
- ); @endcode
- Regardless of whether the asynchronous operation completes immediately or
- not, the handler will not be invoked from within this function. Invocation
- of the handler will be performed in a manner equivalent to using
- boost::asio::io_context::post().
- */
- template<class ConstBufferSequence, class WriteHandler>
- BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void(boost::system::error_code, std::size_t))
- async_write_some(
- ConstBufferSequence const& buffers,
- WriteHandler&& handler);
-};
-
-/// A TCP/IP socket wrapper which has a built-in asynchronous timeout
-using timeout_socket = basic_timeout_socket<
- boost::asio::ip::tcp,
- boost::asio::io_context::executor_type>;
-
-} // beast
-} // boost
-
-#include <boost/beast/experimental/core/impl/timeout_socket.hpp>
-
-#endif