diff options
Diffstat (limited to 'boost/beast/experimental/core')
-rw-r--r-- | boost/beast/experimental/core/detail/flat_stream.hpp | 64 | ||||
-rw-r--r-- | boost/beast/experimental/core/detail/impl/timeout_service.ipp | 181 | ||||
-rw-r--r-- | boost/beast/experimental/core/detail/service_base.hpp | 50 | ||||
-rw-r--r-- | boost/beast/experimental/core/detail/timeout_service.hpp | 124 | ||||
-rw-r--r-- | boost/beast/experimental/core/detail/timeout_work_guard.hpp | 73 | ||||
-rw-r--r-- | boost/beast/experimental/core/flat_stream.hpp | 354 | ||||
-rw-r--r-- | boost/beast/experimental/core/impl/flat_stream.ipp | 309 | ||||
-rw-r--r-- | boost/beast/experimental/core/impl/timeout_service.ipp | 31 | ||||
-rw-r--r-- | boost/beast/experimental/core/impl/timeout_socket.hpp | 207 | ||||
-rw-r--r-- | boost/beast/experimental/core/ssl_stream.hpp | 730 | ||||
-rw-r--r-- | boost/beast/experimental/core/timeout_service.hpp | 40 | ||||
-rw-r--r-- | boost/beast/experimental/core/timeout_socket.hpp | 240 |
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 |