12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- //
- // Copyright (c) 2016-2019 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/beast/core/buffer_traits.hpp>
- #include <boost/asio/buffer.hpp>
- #include <cstdlib>
- 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 max_size = 16 * 1024;
- // Largest stack we will use to flatten
- static std::size_t constexpr max_stack = 8 * 1024;
- struct flatten_result
- {
- std::size_t size;
- bool flatten;
- };
- // calculates the flatten settings for a buffer sequence
- template<class BufferSequence>
- static
- flatten_result
- flatten(
- BufferSequence const& buffers, std::size_t limit)
- {
- flatten_result result{0, false};
- auto first = net::buffer_sequence_begin(buffers);
- auto last = net::buffer_sequence_end(buffers);
- if(first != last)
- {
- result.size = buffer_bytes(*first);
- if(result.size < limit)
- {
- auto it = first;
- auto prev = first;
- while(++it != last)
- {
- auto const n = buffer_bytes(*it);
- if(result.size + n > limit)
- break;
- result.size += n;
- prev = it;
- }
- result.flatten = prev != first;
- }
- }
- return result;
- }
- };
- } // detail
- } // beast
- } // boost
- #endif
|