diff options
Diffstat (limited to 'boost/beast/http/impl/fields.ipp')
-rw-r--r-- | boost/beast/http/impl/fields.ipp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/boost/beast/http/impl/fields.ipp b/boost/beast/http/impl/fields.ipp new file mode 100644 index 0000000000..379d0a4d50 --- /dev/null +++ b/boost/beast/http/impl/fields.ipp @@ -0,0 +1,138 @@ +// +// 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_HTTP_IMPL_FIELDS_IPP +#define BOOST_BEAST_HTTP_IMPL_FIELDS_IPP + +#include <boost/beast/http/fields.hpp> + +namespace boost { +namespace beast { +namespace http { +namespace detail { + +// `basic_fields` assumes that `std::size_t` is larger than `uint16_t`, so we +// verify it explicitly here, so that users that use split compilation don't +// need to pay the (fairly small) price for this sanity check +BOOST_STATIC_ASSERT((std::numeric_limits<std::size_t>::max)() >= + (std::numeric_limits<std::uint32_t>::max)()); + +// Filter a token list +// +inline +void +filter_token_list( + beast::detail::temporary_buffer& s, + string_view value, + iequals_predicate const& pred) +{ + token_list te{value}; + auto it = te.begin(); + auto last = te.end(); + if(it == last) + return; + while(pred(*it)) + if(++it == last) + return; + s.append(*it); + while(++it != last) + { + if(! pred(*it)) + { + s.append(", ", *it); + } + } +} + +void +filter_token_list_last( + beast::detail::temporary_buffer& s, + string_view value, + iequals_predicate const& pred) +{ + token_list te{value}; + if(te.begin() != te.end()) + { + auto it = te.begin(); + auto next = std::next(it); + if(next == te.end()) + { + if(! pred(*it)) + s.append(*it); + return; + } + s.append(*it); + for(;;) + { + it = next; + next = std::next(it); + if(next == te.end()) + { + if(! pred(*it)) + { + s.append(", ", *it); + } + return; + } + s.append(", ", *it); + } + } +} + +void +keep_alive_impl( + beast::detail::temporary_buffer& s, string_view value, + unsigned version, bool keep_alive) +{ + if(version < 11) + { + if(keep_alive) + { + // remove close + filter_token_list(s, value, iequals_predicate{"close", {}}); + // add keep-alive + if(s.empty()) + s.append("keep-alive"); + else if(! token_list{value}.exists("keep-alive")) + s.append(", keep-alive"); + } + else + { + // remove close and keep-alive + filter_token_list(s, value, + iequals_predicate{"close", "keep-alive"}); + } + } + else + { + if(keep_alive) + { + // remove close and keep-alive + filter_token_list(s, value, + iequals_predicate{"close", "keep-alive"}); + } + else + { + // remove keep-alive + filter_token_list(s, value, iequals_predicate{"keep-alive", {}}); + // add close + if(s.empty()) + s.append("close"); + else if(! token_list{value}.exists("close")) + s.append(", close"); + } + } +} + +} // detail +} // http +} // beast +} // boost + +#endif // BOOST_BEAST_HTTP_IMPL_FIELDS_IPP |