diff options
author | vvvv <vvvv@ydb.tech> | 2022-09-16 19:43:31 +0300 |
---|---|---|
committer | vvvv <vvvv@ydb.tech> | 2022-09-16 19:43:31 +0300 |
commit | 537a6ece545495ed4cfa87840624b35964bef3d9 (patch) | |
tree | b27444e50c26bc40d58977c80e67b8ac4fcb7587 /contrib/restricted/boost | |
parent | fc6228adb13e707d9218f74d753d669dd3950c66 (diff) | |
download | ydb-537a6ece545495ed4cfa87840624b35964bef3d9.tar.gz |
generic arrow function resolver
Diffstat (limited to 'contrib/restricted/boost')
148 files changed, 2641 insertions, 50141 deletions
diff --git a/contrib/restricted/boost/beast/CHANGELOG.md b/contrib/restricted/boost/beast/CHANGELOG.md new file mode 100644 index 0000000000..bf481e2ca2 --- /dev/null +++ b/contrib/restricted/boost/beast/CHANGELOG.md @@ -0,0 +1,2332 @@ +Version 167: + +* Revert: Tidy up calls to post() + +-------------------------------------------------------------------------------- + +Version 166: + +* Use boost::is_convertible as a workaround + +-------------------------------------------------------------------------------- + +Version 165: + +* Fix BOOST_NO_CXX11_ALLOCATOR check +* Tidy up a warning + +-------------------------------------------------------------------------------- + +Version 164: + +* Fix masking on continuation frames +* Add Access-Control-Expose-Headers field constant + +-------------------------------------------------------------------------------- + +Version 163: + +* Tidy up calls to post() +* Fix narrowing warnings + +-------------------------------------------------------------------------------- + +Version 162: + +* Add asio_handler_invoke overloads for stream algorithms +* Improve websocket::stream::control_callback javadoc + +-------------------------------------------------------------------------------- + +Version 161: + +* Don't copy the handler in write_some_op +* Add move-only handler tests +* Fix handler parameter javadocs + +-------------------------------------------------------------------------------- + +Version 160: + +* Examples clear the HTTP message before reading + +-------------------------------------------------------------------------------- + +Version 159: + +* Fix typo in release notes +* Safe treatment of zero-length string arguments in basic_fields +* Some basic_fields operations now give the strong exception guarantee + +-------------------------------------------------------------------------------- + +Version 158: + +* Tidy up end_of_stream javadoc +* Tidy up websocket docs +* Examples set reuse_address(true) +* Advanced servers support clean shutdown via SIGINT or SIGTERM +* DynamicBuffer input areas are not mutable +* Tidy up some documentation + +API Changes: + +* get_lowest_layer is a type alias + +Actions required: + +* Replace instances of `typename get_lowest_layer<T>::type` + with `get_lowest_layer<T>`. + +-------------------------------------------------------------------------------- + +Version 157: + +* Fix teardown for TIME_WAIT +* Fix big-endian websocket masking + +-------------------------------------------------------------------------------- + +Version 156: + +* Don't use typeid +* Add release notes to documentation +* Fix stale link for void-or-deduced + +-------------------------------------------------------------------------------- + +Version 155: + +* Fix memory leak in advanced server examples +* Fix soft-mutex assert in websocket stream +* Fix fallthrough warnings +* Tidy up bind_handler doc + +-------------------------------------------------------------------------------- + +Version 154: + +* Type check completion handlers +* bind_handler doc update +* bind_handler works with boost placeholders + +-------------------------------------------------------------------------------- + +Version 153: + +* Remove BOOST_VERSION checks +* Use make_error_code for setting an error_code from errc +* Use boost::winapi::GetLastError() consistently +* Update README.md for branches +* Avoid string_view::clear +* Fix iterator version of basic_fields::erase +* Fix use-after-move in example request handlers +* Add Bishop Fox interview media + +-------------------------------------------------------------------------------- + +Version 152: + +* Refactor detect_ssl_op +* Disable gdb on Travis for Meltdown + +WebSocket: + +* Redistribute the read tests in the translation units +* Refactor error headers +* Add WebSocket error conditions + +API Changes: + +* Refactor WebSocket errors (API Change): + +Actions Required: + +* Code which explicitly compares error_code values against the + constant `websocket::error::handshake_failed` should compare + against `websocket::condition::handshake_failed` instead. + +* Code which explicitly compares error_code values against the + constant `websocket::error::failed` should compare + against `websocket::condition::protocol_violation` instead. + +-------------------------------------------------------------------------------- + +Version 151: + +* Sanitizer failures are errors +* Depend on container_hash +* Fix high-ASCII in source file + +WebSocket: + +* Control callback is invoked on the execution context +* Add stream_fwd.hpp +* Remove unnecessary include + +API Changes: + +* http::parser is not MoveConstructible +* permessage-deflate is a compile-time feature + +-------------------------------------------------------------------------------- + +Version 150: + +* handler_ptr tests +* Documentation + +API Changes: + +* serializer::reader_impl is deprecated + +Actions Required: + +* Call serializer::writer_impl instead of reader_impl + +-------------------------------------------------------------------------------- + +Version 149: + +* built-in r-value return values can't be assigned +* Tidy up ssl_stream special members +* Fix CMakeLists.txt variable +* Protect calls from macros +* pausation always allocates +* Don't copy completion handlers +* handler_ptr is move-only +* Fix Travis memory utilization + +API Changes: + +* handler_ptr gives the strong exception guarantee + +Actions Required: + +* Change the constructor signature for state objects + used with handler_ptr to receive a const reference to + the handler. + +-------------------------------------------------------------------------------- + +Version 148: + +* Install codecov on codecov CI targets only +* Update reports for hybrid assessment +* Handle invalid deflate frames + +-------------------------------------------------------------------------------- + +Version 147: + +* Don't use boost::string_ref +* Use iterator wrapper in detail::buffers_range + +HTTP: + +* Tidy up basic_fields exception specifiers + +WebSocket: + +* control callback is copied or moved +* Send idle pings in advanced servers + +-------------------------------------------------------------------------------- + +Version 146: + +* Fix some typos +* Faster ascii_tolower +* Documentation tidying +* Fix typo in examples documentation +* Add detail::aligned_union and tidy up +* Use variant in buffers_cat_view + +API Changes: + +* Remove unintended public members of handler_ptr + +-------------------------------------------------------------------------------- + +Version 145: + +* Rename some detail functions +* Refactor basic_fields allocator internals +* Refactor HTTP async read composed operations +* null_buffers is deprecated +* Version 124 works with Boost 1.65.1 and earlier +* basic_fields does not support fancy pointers + +-------------------------------------------------------------------------------- + +Version 144-hf1: + +* Update reports for hybrid assessment +* Handle invalid deflate frames +* Install codecov on codecov CI targets only + +-------------------------------------------------------------------------------- + +Version 144: + +* Fix websocket permessage-deflate negotiation + +-------------------------------------------------------------------------------- + +Version 143: + +* Fix autobahn report link + +-------------------------------------------------------------------------------- + +Version 142: + +* Warn about upcoming API changes to certain concepts +* Fix name typo in http write test + +-------------------------------------------------------------------------------- + +Version 141: + +* Tidy up some documentation + +-------------------------------------------------------------------------------- + +Version 140: + +* Fix some integer warnings in 64-bit builds +* Fix utf8_checker test failures +* Fix signature for async_read_some, and tests +* Tidy up basic_parser +* Some basic_fields special members are protected + +-------------------------------------------------------------------------------- + +Version 139: + +* Revisit boost library min/max guidance + +-------------------------------------------------------------------------------- + +Version 138: + +* Tidy up some documentation + +-------------------------------------------------------------------------------- + +Version 137: + +* ConstBufferSequence mandates pointer equivalence +* Add FieldsWriter constructor requirement +* Tidy up some documented constructor syntax + +-------------------------------------------------------------------------------- + +Version 136: + +* Tidy up message doc image + +-------------------------------------------------------------------------------- + +Version 135: + +* Fix typo in example server help text + +-------------------------------------------------------------------------------- + +Version 134: + +* Add static_buffer_base default constructor definition + +-------------------------------------------------------------------------------- + +Version 133: + +* Remove const&& overload of message::body + +-------------------------------------------------------------------------------- + +Version 132: + +* Tidy up project folders in CMakeLists.txt +* Rename Cmake variables for clarity +* Add ref-qualified overloads for message::body +* Tidy up FieldsReader doc + +API Changes: + +* Fields::writer replaces Fields::reader +* BodyReader and BodyWriter names are swapped + +Actions Required: + +* Rename reader to writer for user defined Fields +* Swap the reader and writer names for user defined Body types +* Swap use of is_body_reader and is_body_writer + +-------------------------------------------------------------------------------- + +Version 131: + +* basic_fields returns const values +* Set SNI hostname in example SSL clients + +-------------------------------------------------------------------------------- + +Version 130: + +* Tidy up fallthrough warning +* Remove cxx11_sfinae_expr build requirement from tests + +-------------------------------------------------------------------------------- + +Version 129: + +* Add autobahn test report to doc +* Documentation tidying +* Fix prepare_payload: chunked is HTTP/1.1 + +-------------------------------------------------------------------------------- + +Version 128: + +* Update doc links +* Add explicit-failures-markup.xml + +HTTP: + +* Add message::need_eof +* Use message::need_eof in example servers +* Use synchronous writes in chunk output example + +WebSocket: + +* Fix utf8 validation for autobahn +* Temporarily disable utf8 validation tests +* Tidy up fast websocket server host names + +API Changes: + +* Remove serializer::keep_alive +* Remove serializer::chunked +* Add has_content_length_impl to Fields +* Add message::has_content_length +* Rename some basic_parser observers + +Actions Required: + +* Call message::keep_alive instead of serializer::keep_alive +* Call serializer::get::chunked instead of serializer::chunked +* Implement has_content_length_impl for user-defined Fields +* Remove the "is_" prefix from call sites invoking certain basic_parser members + +-------------------------------------------------------------------------------- + +Version 127: + +* Add BOOST_BEAST_NO_POSIX_FADVISE +* Version command line option for HTTP client examples +* More Jamfile compiler requirements for tests + +-------------------------------------------------------------------------------- + +Version 126: + +* Add CppCon2017 presentation link +* Update README.md +* Update stream write documentation for end of stream changes +* Tidy up unused variable warnings +* Don't return end_of_stream on win32 file body writes +* Fix doc typo +* Fix shadowing in session_alloc +* Fix executor type compilation +* Add Travis tests with the default compilers +* Update Boost.WinAPI usage to the new location and namespace. +* Fix buffered_read_stream async_read_some signature + +-------------------------------------------------------------------------------- + +Version 125: + +API Changes: + +* Update for Net-TS Asio + +Actions Required: + +* Use BOOST_ASIO_HANDLER_TYPE instead of handler_type +* Use BOOST_ASIO_INITFN_RESULT_TYPE instead of async_result +* Use boost::asio::async_completion +* Use boost::asio::is_dynamic_buffer +* Use boost::asio::is_const_buffer_sequence +* Use boost::asio::is_mutable_buffer_sequence +* boost::asio::associated_allocator_t replaces handler_alloc + +-------------------------------------------------------------------------------- + +Version 124: + +* Fix for a test matrix compiler +* Fix basic_fields javadoc + +API Changes: + +* http write returns success on connection close + +Actions Required: + +* Add code to servers to close the connection after successfully + writing a message where `message::keep_alive()` would return `false`. + +-------------------------------------------------------------------------------- + +Version 123: + +* Use unit-test subtree +* Fix spurious race in websocket close test +* Check compiler feature in Jamfile +* Clear previous message fields in parser + +-------------------------------------------------------------------------------- + +Version 122: + +* Add test for issue 807 +* assert on empty buffer in websocket read +* Fix zlib symbol conflicts +* CMake 3.5.1 is required +* config.hpp is not a public header +* Add missing case in error test + +-------------------------------------------------------------------------------- + +Version 121: + +* Add test for issue 802 +* Fix enum and non-enum in conditional exp. warning + +-------------------------------------------------------------------------------- + +Version 120: + +* Fix spurious strand_ in advanced_server_flex +* OpenSSL targets are optional (CMake) + +-------------------------------------------------------------------------------- + +Version 119: + +* Tidy up doc badge links + +-------------------------------------------------------------------------------- + +Version 118: + +* file_win32 opens for read-only in shared mode +* Remove unused strands in server examples +* Update build instructions +* Doc root is at index.html + +HTTP: + +* Fix writing header into std::ostream + +-------------------------------------------------------------------------------- + +Version 117: + +* Add buffers_to_string + +API Changes: + +* buffers_suffix replaces consuming_buffers +* buffers_prefix replaces buffer_prefix +* buffers_prefix_view replaces buffer_prefix_view +* buffers_front replaces buffer_front +* buffers_cat replaces buffer_cat +* buffers_cat_view replaces buffer_cat_view +* Remove buffers_suffix::get + +Actions Required: + +* Use buffers_suffix instead of consuming_buffers +* Use buffers_prefix instead of buffer_prefix +* Use buffers_prefix_view instead of buffer_prefix_view +* Use buffers_front instead of buffer_front +* Use buffers_cat instead of buffer_cat +* Use buffers_cat_view instead of buffer_cat_view +* Avoid calling buffers_suffix::get + +-------------------------------------------------------------------------------- + +Version 116: + +API Changes: + +* message::body is a member function +* message::version is a member function + +Actions Required: + +* Call member function message::body instead of accessing + the data member at call sites. + +* Call member function message::version instead of accessing + the version member at call sites. + +-------------------------------------------------------------------------------- + +Version 115: + +* Update README.md master doc link + +-------------------------------------------------------------------------------- + +Version 114: + +(No changes) + +-------------------------------------------------------------------------------- + +Version 113: + +* Fix handler signature in async_read_header +* Remove field_range copy constructor + +-------------------------------------------------------------------------------- + +Version 112: + +* Update websocket notes + +API Changes: + +* WebSocket writes return the bytes transferred + +* HTTP reads and writes return bytes transferred + +Actions Required: + +* Modify websocket write completion handlers to receive + the extra std::size_t bytes_transferred parameter. + +* Modify HTTP read and/or write completion handlers to + receive the extra std::size_t bytes_transferred parameter. + +-------------------------------------------------------------------------------- + +Version 111: + +WebSocket: + +* Fix utf8 check split code point at buffer end +* Refactor stream operations and tests plus coverage +* Suspended ops special members + +-------------------------------------------------------------------------------- + +Version 110: + +* Refactor stream open state variable +* Refactor websocket stream members +* Refactor websocket stream: fixes and tests +* Add test::stream::lowest_layer +* Fix invalid iterator in test reporter + +-------------------------------------------------------------------------------- + +Version 109: + +* refactor test::stream + +WebSocket: + +* Fix async_read_some handler signature +* websocket close fixes and tests +* websocket handshake uses coroutine +* websocket ping tests +* Fix websocket close_op resume state +* websocket write tests +* split up websocket tests +* websocket read tests + +API Changes: + +* websocket accept refactoring + +Actions Required: + +* Do not call websocket accept overloads which take + both a message and a buffer sequence, as it is + illegal per rfc6455. + +-------------------------------------------------------------------------------- + +Version 108: + +* Fix argument parsing in HTTP examples +* Don't use async_write_msg in examples + +-------------------------------------------------------------------------------- + +Version 107: + +* Use test::stream + +WebSocket + +* Fix done state for WebSocket reads +* Fix utf8 check for compressed frames +* Rename frame and header buffer types + +-------------------------------------------------------------------------------- + +Version 106: + +* Dynamic buffer input areas are mutable +* Add flat_static_buffer::reset + +HTTP: + +* Fix for basic_parser::skip(true) and docs + +WebSocket: + +* websocket test improvements +* Remove obsolete write_op +* Refactor write_op +* Refactor ping_op +* Refactor fail_op +* Refactor read_op +* Refactor close_op +* Refactor read_op + fail_op +* Websocket close will automatically drain +* Autobahn|Testsuite fixes +* Tidy up utf8_checker and tests + +-------------------------------------------------------------------------------- + +Version 105: + +* Fix compile error in websocket snippet +* Tidy up Jamfile and tests + +-------------------------------------------------------------------------------- + +Version 104: + +* Remove unused include +* Use #error in config.hpp +* Only set -std=c++11 on Travis +* Only set /permissive- on Appveyor +* Tidy up some test warnings +* tools/ renamed from build/ + +WebSocket: + +* Fix pausation::save + +-------------------------------------------------------------------------------- + +Version 103: + +* Boost test matrix fixes +* Tidy up allocator usage +* Example HTTP server fixes + +-------------------------------------------------------------------------------- + +Version 102: + +* Section headings in examples + +-------------------------------------------------------------------------------- + +Version 101: + +* Refactor all examples + +-------------------------------------------------------------------------------- + +Version 100: + +* Fix doc convenience includes +* Fix doc includes +* Remove unused test header +* Rename test macros +* Reorder define test macro params +* vcxproj workaround for include symlinks +* Add variadic min/max + +WebSocket: + +* Remove obsolete frame tests +* Refactor fail/clode code +* Call do_fail from read_some +* eof on accept returns error::closed +* Fix stream::read_size_hint calculation +* Documentation + +API Changes: + +* Calls to stream::close and stream::async_close will + automatically perform the required read operations + +* drain_buffer is removed + +* role_type replaces teardown_tag + +Actions Required: + +* Remove calling code which drains the connection after + calling stream::close or stream::async_close + +* Replace code which uses drain_buffer. For websocket::stream, + it is no longer necessary to manually drain the connection + after closing. + +* Modify signatures of teardown and async_teardown to use + role_type instead of teardown_tag + +* Change calls to teardown and async_teardown to pass the + correct role_type, client or server, depending on context. + +-------------------------------------------------------------------------------- + +Version 99: + +* Log the value of LIB_DIR for doc builds (debug) +* Use correct handler signature in fail_op +* Fix doc typo + +-------------------------------------------------------------------------------- + +Version 98: + +* basic_fields::key_compare is noexcept +* Fix bench-zlib cmake +* Use unique names Jam projects +* Trim utf8 checker test + +-------------------------------------------------------------------------------- + +Version 97: + +* Update redirect + +-------------------------------------------------------------------------------- + +Version 96: + +* Move bench/ to test/ +* Move extras/ to test/ +* Use <valgrind> property +* Rename wsload compile target +* Fix library.json +* Update boostorg links +* Add bench-zlib +* Faster zlib tests +* Less compression on websocket test + +-------------------------------------------------------------------------------- + +Version 95: + +* Tidy up Travis build scripts +* Move scripts to build/ +* Fix race in test::pipe +* close on test::pipe teardown +* Add test::stream +* Tidy up static_buffer braced init +* Fix html redirect +* Add valgrind variant, fix false positives + +-------------------------------------------------------------------------------- + +Version 94: + +* Use off-site Quick Start link temporarily + +-------------------------------------------------------------------------------- + +Version 93: + +* Unset BOOST_COROUTINES_NO_DEPRECATION_WARNING + +-------------------------------------------------------------------------------- + +Version 92: + +* Fix typo in test/CMakeLists.txt +* basic_fields::value_type is not copyable +* Update repository links in source comments +* Ignore Content-Length in some cases +* Tidy up doc snippet paths +* Use off-site doc link + +-------------------------------------------------------------------------------- + +Version 91: + +* Adjust redirect html +* Don't build pre-C++11 +* source.dox is path-independent +* Tidy up namespace qualifiers +* Tidy up MSVC CMakeLists.txt +* Optimize buffered_read_stream +* constexpr in derived buffers +* Set BOOST_ASIO_NO_DEPRECATED +* Use Asio array optimization in static_buffer_base +* Rename wstest source file +* Use fopen_s on Windows +* Fix Appveyor script +* Update project metadata +* Move benchmarks to bench/ +* Fix doc title +* Build stand-alone doc +* Update doc copyrights +* Refactor test build scripts + +WebSocket: + +* Tidy up websocket javadocs +* Refactor accept, handshake ops +* Use read buffer instead of buffered stream + +API Changes + +* control frame callbacks are non-const references + +Actions Required: + +* Modify calls to set the control frame callback, to + pass non-const reference instances, and manage the + lifetime of the instance. + +-------------------------------------------------------------------------------- + +Version 90: + +* Fix websocket read of zero length message +* Fix typo in equal_range +* Output to integrated documentation + +-------------------------------------------------------------------------------- + +Version 89: + +* Fix CONTRIBUTING.md links + +-------------------------------------------------------------------------------- + +Version 88: + +* Update doc links in README.md +* Refactor tests Jamfile +* Don't use program_options + +WebSocket: + +* Fix uninitialized frame done + +-------------------------------------------------------------------------------- + +Version 87: + +* Update appveyor for Boost branch +* Rename to BEAST_EXPECT +* variant fixes and tests +* Update README, add CONTRIBUTING.md and CODE_OF_CONDUCT.md + +-------------------------------------------------------------------------------- + +Version 86: + +* Boost prep +* Remove use of lexical_cast +* Use custom variant +* Update README.md +* Add local-travis.sh +* Use winapi +* Update CMakeLists.txt for boost +* Update documentation for boost +* Update copyrights +* Remove spurious declaration +* Tidy up Jamfile +* Normalize doc build scripts +* Use configured doxygen and xsltproc +* Fix Deferred Body Type Example Documentation +* Add library metadata + +API Changes: + +* websocket read returns the number of bytes inserted + +Actions Required: + +* Change the signature of completion handlers used with + websocket::stream::async_read to void(error_code, std::size_t) + +-------------------------------------------------------------------------------- + +Version 85: + +* Fix test failure +* Tidy up test warning + +-------------------------------------------------------------------------------- + +Version 84: + +* Tidy up buffer_front +* static_buffer::consume improvement +* multi_buffer is type-check friendly +* bind_handler allows placeholders +* Add consuming_buffers::get + +WebSocket: + +* WebSocket read optimization + +API Changes: + +* websocket::stream::read_buffer_size is removed + +Actions Required: + +* Remove calls websocket::stream::read_buffer_size +* Use read_some and write_some instead of read_frame and write_frame + +-------------------------------------------------------------------------------- + +Version 83: + +* Add flat_static_buffer::mutable_data +* Add buffer_front +* Add wstest compression option +* Turn some flat_static_buffer_tests on +* Documentation work +* read_some, async_read_some return bytes used +* Fix private timer::clock_type + +WebSocket + +* Add wstest compression option +* Fix buffer lifetime in websocket write + +API Changes: + +* Add static_buffer + +Actions Required: + +* Callers who depend on static_buffer returning sequences of + exactly length one should switch to flat_static_buffer. + +-------------------------------------------------------------------------------- + +Version 82: + +* Documentation tidying +* is_invocable works with move-only types +* Use std::function and reference wrapper +* Add session_alloc to example/common +* Silence spurious warning + +HTTP + +* Fix extraneous argument in async_write_header + +WebSocket + +* stream tidying +* Add rd_close_ to websocket stream state +* stream uses flat_buffer +* accept requires a message +* Add wstest benchmark tool + +API Changes: + +* Rename to flat_static_buffer and flat_static_buffer_base + +Actions Required: + +* Rename static_buffer to flat_static_buffer_base +* Rename static_buffer_n to flat_static_buffer + +-------------------------------------------------------------------------------- + +Version 81: + +* Pass string_view by value +* better is_final on empty_base_optimization +* Suppress incorrect GCC warning +* multi_buffer ctor is explicit +* File is not copy-constructible + +API Changes: + +* Refactor basic_parser, chunk parsing: + +Actions Required: + +* Adjust signatures for required members of user-defined + subclasses of basic_parser + +* Use the new basic_parser chunk callbacks for accessing + chunk extensions and chunk bodies. + +-------------------------------------------------------------------------------- + +Version 80: + +* Javadoc tidying +* Add basic_dynamic_body.hpp +* Shrink buffer_prefix_view +* Remove unused file_path +* Add basic_file_body.hpp +* buffers_ref is Assignable + +HTTP + +* Shrink chunk header buffer sequence size + +API Changes: + +* Refactor chunked-encoding serialization + +Actions Required: + +* Remove references to ChunkDecorators. Use the new chunk-encoding + buffer sequences to manually produce a chunked payload body in + the case where control over the chunk-extensions and/or trailers + is required. + +-------------------------------------------------------------------------------- + +Version 79: + +* Remove spurious fallthrough guidance + +-------------------------------------------------------------------------------- + +Version 78: + +* Add span +* Documentation work +* Use make_unique_noinit +* Fix warning in zlib +* Header file tidying +* Tidy up FieldsReader doc +* Add Boost.Locale utf8 benchmark comparison +* Tidy up dstream for existing Boost versions +* Tidy up file_posix unused variable +* Fix warning in root ca declaration + +HTTP: + +* Tidy up basic_string_body +* Add vector_body +* span, string, vector bodies are public +* Fix spurious uninitialized warning +* fields temp string uses allocator + +API Changes: + +* Add message::keep_alive() +* Add message::chunked() and message::content_length() +* Remove string_view_body + +Actions Required: + +* Change user defined implementations of Fields and + FieldsReader to meet the new requirements. + +* Use span_body<char> instead of string_view_body + +-------------------------------------------------------------------------------- + +Version 77: + +* file_posix works without large file support + +-------------------------------------------------------------------------------- + +Version 76: + +* Always go through write_some +* Use Boost.Config +* BodyReader may construct from a non-const message +* Add serializer::get +* Add serializer::chunked +* Serializer members are not const +* serializing file_body is not const +* Add file_body_win32 +* Fix parse illegal characters in obs-fold +* Disable SSE4.2 optimizations + +API Changes: + +* Rename to serializer::keep_alive +* BodyReader, BodyWriter use two-phase init + +Actions Required: + +* Use serializer::keep_alive instead of serializer::close and + take the logical NOT of the return value. + +* Modify instances of user-defined BodyReader and BodyWriter + types to perfrom two-phase initialization, as per the + updated documented type requirements. + +-------------------------------------------------------------------------------- + +Version 75: + +* Use file_body for valid requests, string_body otherwise. +* Construct buffer_prefix_view in-place +* Shrink serializer buffers using buffers_ref +* Tidy up BEAST_NO_BIG_VARIANTS +* Shrink serializer buffers using buffers_ref +* Add serializer::limit +* file_body tests +* Using SSE4.2 intrinsics in basic_parser if available + +-------------------------------------------------------------------------------- + +Version 74: + +* Add file_stdio and File concept +* Add file_win32 +* Add file_body +* Remove common/file_body.hpp +* Add file_posix +* Fix Beast include directories for cmake targets +* remove redundant flush() from example + +-------------------------------------------------------------------------------- + +Version 73: + +* Jamroot tweak +* Verify certificates in SSL clients +* Adjust benchmarks +* Initialize local variable in basic_parser +* Fixes for gcc-4.8 + +HTTP: + +* basic_parser optimizations +* Add basic_parser tests + +API Changes: + +* Refactor header and message constructors +* serializer::next replaces serializer::get + +Actions Required: + +* Evaluate each message constructor call site and + adjust the constructor argument list as needed. + +* Use serializer::next instead of serializer::get at call sites + +-------------------------------------------------------------------------------- + +Version 72: + +HTTP: + +* Tidy up set payload in http-server-fast +* Refine Body::size specification +* Newly constructed responses have a 200 OK result +* Refactor file_body for best practices +* Add http-server-threaded example +* Documentation tidying +* Various improvements to http_server_fast.cpp + +WebSocket: + +* Add websocket-server-async example + +-------------------------------------------------------------------------------- + +Version 71: + +* Fix extra ; warning +* Documentation revision +* Fix spurious on_chunk invocation +* Call prepare_payload in HTTP example +* Check trailers in test +* Fix buffer overflow handling for string_body and mutable_body +* Concept check in basic_dynamic_body +* Tidy up http_sync_port error check +* Tidy up Jamroot /permissive- + +WebSockets: + +* Fine tune websocket op asserts +* Refactor websocket composed ops +* Allow close, ping, and write to happen concurrently +* Fix race in websocket read op +* Fix websocket write op +* Add cmake options for examples and tests + +API Changes: + +* Return `std::size_t` from `Body::writer::put` + +Actions Required: + +* Return the number of bytes actually transferred from the + input buffers in user defined `Body::writer::put` functions. + +-------------------------------------------------------------------------------- + +Version 70: + +* Serialize in one step when possible +* Add basic_parser header and body limits +* Add parser::on_header to set a callback +* Fix BEAST_FALLTHROUGH +* Fix HEAD response in file_service + +API Changes: + +* Rename to message::base +* basic_parser default limits are now 1MB/8MB + +Actions Required: + +* Change calls to message::header_part() with message::base() + +* Call body_limit and/or header_limit as needed to adjust the + limits to suitable values if the defaults are insufficient. + +-------------------------------------------------------------------------------- + +Version 69: + +* basic_parser optimizations +* Use BEAST_FALLTHROUGH to silence warnings +* Add /permissive- to msvc toolchain + +-------------------------------------------------------------------------------- + +Version 68: + +* Split common tests to a new project +* Small speed up in fields comparisons +* Adjust buffer size in fast server +* Use string_ref in older Boost versions +* Optimize field lookups +* Add const_body, mutable_body to examples +* Link statically on cmake MSVC + +API Changes: + +* Change BodyReader, BodyWriter requirements +* Remove BodyReader::is_deferred +* http::error::bad_target replaces bad_path + +Actions Required: + +* Change user defined instances of BodyReader and BodyWriter + to meet the new requirements. + +* Replace references to http::error::bad_path with http::error::bad_target + +-------------------------------------------------------------------------------- + +Version 67: + +* Fix doc example link +* Add http-server-small example +* Merge stream_base to stream and tidy +* Use boost::string_view +* Rename to http-server-fast +* Appveyor use Boost 1.64.0 +* Group common example headers + +API Changes: + +* control_callback replaces ping_callback + +Actions Required: + +* Change calls to websocket::stream::ping_callback to use + websocket::stream::control_callback + +* Change user defined ping callbacks to have the new + signature and adjust the callback definition appropriately. + +-------------------------------------------------------------------------------- + +Version 66: + +* string_param optimizations +* Add serializer request/response aliases +* Make consuming_buffers smaller +* Fix costly potential value-init in parser +* Fix unused parameter warning +* Handle bad_alloc in parser +* Tidy up message piecewise ctors +* Add header aliases +* basic_fields optimizations +* Add http-server example +* Squelch spurious warning on gcc + +-------------------------------------------------------------------------------- + +Version 65: + +* Enable narrowing warning on msvc cmake +* Fix integer types in deflate_stream::bi_reverse +* Fix narrowing in static_ostream +* Fix narrowing in ostream +* Fix narrowing in inflate_stream +* Fix narrowing in deflate_stream +* Fix integer warnings +* Enable unused variable warning on msvc cmake + +-------------------------------------------------------------------------------- + +Version 64: + +* Simplify buffered_read_stream composed op +* Simplify ssl teardown composed op +* Simplify websocket write_op +* Exemplars are compiled code +* Better User-Agent in examples +* async_write requires a non-const message +* Doc tidying +* Add link_directories to cmake + +API Changes: + +* Remove make_serializer + +Actions Required: + +* Replace calls to make_serializer with variable declarations + +-------------------------------------------------------------------------------- + +Version 63: + +* Use std::to_string instead of lexical_cast +* Don't use cached Boost +* Put num_jobs back up on Travis +* Only build and run tests in variant=coverage +* Move benchmarks to a separate project +* Only run the tests under ubasan +* Tidy up CMakeLists.txt +* Tidy up Jamfiles +* Control running with valgrind explicitly + +-------------------------------------------------------------------------------- + +Version 62: + +* Remove libssl-dev from a Travis matrix item +* Increase detail::static_ostream coverage +* Add server-framework tests +* Doc fixes and tidy +* Tidy up namespaces in examples +* Clear the error faster +* Avoid explicit operator bool for error +* Add http::is_fields trait +* Squelch harmless not_connected errors +* Put slow tests back for coverage builds + +API Changes: + +* parser requires basic_fields +* Refine FieldsReader concept +* message::prepare_payload replaces message::prepare + +Actions Required: + +* Callers using `parser` with Fields types other than basic_fields + will need to create their own subclass of basic_parser to work + with their custom fields type. + +* Implement chunked() and keep_alive() for user defined FieldsReader types. + +* Change calls to msg.prepare to msg.prepare_payload. For messages + with a user-defined Fields, provide the function prepare_payload_impl + in the fields type according to the Fields requirements. + +-------------------------------------------------------------------------------- + +Version 61: + +* Remove Spirit dependency +* Use generic_cateogry for errno +* Reorganize SSL examples +* Tidy up some integer conversion warnings +* Add message::header_part() +* Tidy up names in error categories +* Flush the output stream in the example +* Clean close in Secure WebSocket client +* Add server-framework SSL HTTP and WebSocket ports +* Fix shadowing warnings +* Tidy up http-crawl example +* Add multi_port to server-framework +* Tidy up resolver calls +* Use one job on CI +* Don't run slow tests on certain targets + +API Changes: + +* header::version is unsigned +* status-codes is unsigned + +-------------------------------------------------------------------------------- + +Version 60: + +* String comparisons are public interfaces +* Fix response message type in async websocket accept +* New server-framework, full featured server example + +-------------------------------------------------------------------------------- + +Version 59: + +* Integrated Beast INTERFACE (cmake) +* Fix base64 alphabet +* Remove obsolete doc/README.md + +API Changes: + +* Change Body::size signature (API Change): + +Actions Required: + +* For any user-defined models of Body, change the function signature + to accept `value_type const&` and modify the function definition + accordingly. + +-------------------------------------------------------------------------------- + +Version 58: + +* Fix unaligned reads in utf8-checker +* Qualify size_t in message template +* Reorganize examples +* Specification for http read +* Avoid `std::string` in websocket +* Fix basic_fields insert ordering +* basic_fields::set optimization +* basic_parser::put doc +* Use static string in basic_fields::reader +* Remove redundant code +* Fix parsing chunk size with leading zeroes +* Better message formal parameter names + +API Changes: + +* `basic_fields::set` renamed from `basic_fields::replace` + +Actions Required: + +* Rename calls to `basic_fields::replace` to `basic_fields::set` + +-------------------------------------------------------------------------------- + +Version 57: + +* Fix message.hpp javadocs +* Fix warning in basic_parser.cpp +* Integrate docca for documentation and tidy + +-------------------------------------------------------------------------------- + +Version 56: + +* Add provisional IANA header field names +* Add string_view_body +* Call on_chunk when the extension is empty +* HTTP/1.1 is the default version +* Try harder to find Boost (cmake) +* Reset error codes +* More basic_parser tests +* Add an INTERFACE cmake target +* Convert buffer in range loops + +-------------------------------------------------------------------------------- + +Version 55: + +* Don't allocate memory to handle obs-fold +* Avoid a parser allocation using non-flat buffer +* read_size replaces read_size_helper + +-------------------------------------------------------------------------------- + +Version 54: + +* static_buffer coverage +* flat_buffer coverage +* multi_buffer coverage +* consuming_buffers members and coverage +* basic_fields members and coverage +* Add string_param +* Retain ownership when reading using a message +* Fix incorrect use of [[fallthrough]] + +API Changes: + +* basic_fields refactor + +-------------------------------------------------------------------------------- + +Version 53: + +* Fix basic_parser::maybe_flatten +* Fix read_size_helper usage + +-------------------------------------------------------------------------------- + +Version 52: + +* flat_buffer is an AllocatorAwareContainer +* Add drain_buffer class + +API Changes: + +* `auto_fragment` is a member of `stream` +* `binary`, `text` are members of `stream` +* read_buffer_size is a member of `stream` +* read_message_max is a member of `stream` +* `write_buffer_size` is a member of `stream` +* `ping_callback` is a member of stream +* Remove `opcode` from `read`, `async_read` +* `read_frame` returns `bool` fin +* `opcode` is private +* finish(error_code&) is a BodyReader requirement + +Actions Required: + +* Change call sites which use `auto_fragment` with `set_option` + to call `stream::auto_fragment` instead. + +* Change call sites which use message_type with `set_option` + to call `stream::binary` or `stream::text` instead. + +* Change call sites which use `read_buffer_size` with `set_option` to + call `stream::read_buffer_size` instead. + +* Change call sites which use `read_message_max` with `set_option` to + call `stream::read_message_max` instead. + +* Change call sites which use `write_buffer_size` with `set_option` to + call `stream::write_buffer_size` instead. + +* Change call sites which use `ping_callback1 with `set_option` to + call `stream::ping_callback` instead. + +* Remove the `opcode` reference parameter from calls to synchronous + and asynchronous read functions, replace the logic with calls to + `stream::got_binary` and `stream::got_text` instead. + +* Remove the `frame_info` parameter from all read frame call sites + +* Check the return value 'fin' for calls to `read_frame` + +* Change ReadHandlers passed to `async_read_frame` to have + the signature `void(error_code, bool fin)`, use the `bool` + to indicate if the frame is the last frame. + +* Remove all occurrences of the `opcode` enum at call sites + +-------------------------------------------------------------------------------- + +Version 51 + +* Fix operator<< for header +* Tidy up file_body +* Fix file_body::get() not setting the more flag correctly +* Use BOOST_FALLTHROUGH +* Use BOOST_STRINGIZE +* DynamicBuffer benchmarks +* Add construct, destroy to handler_alloc +* Fix infinite loop in basic_parser + +API Changes: + +* Tune up static_buffer +* multi_buffer implementation change + +Actions Required: + +* Call sites passing a number to multi_buffer's constructor + will need to be adjusted, see the corresponding commit message. + +-------------------------------------------------------------------------------- + +Version 50 + +* parser is constructible from other body types +* Add field enumeration +* Use allocator more in basic_fields +* Fix basic_fields allocator awareness +* Use field in basic_fields and call sites +* Use field in basic_parser +* Tidy up basic_fields, header, and field concepts +* Fields concept work +* Body documentation work +* Add missing handler_alloc nested types +* Fix chunk delimiter parsing +* Fix test::pipe read_size +* Fix chunk header parsing + +API Changes: + +* Remove header_parser +* Add verb to on_request for parsers +* Refactor prepare +* Protect basic_fields special members +* Remove message connection settings +* Remove message free functions +* Remove obsolete serializer allocator +* http read_some, async_read_some don't return bytes + +-------------------------------------------------------------------------------- + +Version 49 + +* Use <iosfwd> instead of <ostream> + +HTTP: + +* Add HEAD request example + +API Changes: + +* Refactor method and verb +* Canonicalize string_view parameter types +* Tidy up empty_body writer error +* Refactor header status, reason, and target + +-------------------------------------------------------------------------------- + +Version 48 + +* Make buffer_prefix_view public +* Remove detail::sync_ostream +* Tidy up core type traits + +API Changes: + +* Tidy up chunk decorator +* Rename to buffer_cat_view +* Consolidate parsers to parser.hpp +* Rename to parser + +-------------------------------------------------------------------------------- + +Version 47 + +* Disable operator<< for buffer_body +* buffer_size overload for basic_multi_buffer::const_buffers_type +* Fix undefined behavior in pausation +* Fix leak in basic_flat_buffer + +API Changes: + +* Refactor treatment of request-method +* Refactor treatment of status code and obsolete reason +* Refactor HTTP serialization and parsing + +-------------------------------------------------------------------------------- + +Version 46 + +* Add test::pipe +* Documentation work + +API Changes: + +* Remove HTTP header aliases +* Refactor HTTP serialization +* Refactor type traits + +-------------------------------------------------------------------------------- + +Version 45 + +* Workaround for boost::asio::basic_streambuf type check +* Fix message doc image +* Better test::enable_yield_to +* Fix header::reason +* Documentation work +* buffer_view skips empty buffer sequences +* Disable reverse_iterator buffer_view test + +-------------------------------------------------------------------------------- + +Version 44 + +* Use BOOST_THROW_EXCEPTION +* Tidy up read_size_helper and dynamic buffers +* Require Boost 1.58.0 or later +* Tidy up and make get_lowest_layer public +* Use BOOST_STATIC_ASSERT +* Fix async return values in docs +* Fix README websocket example +* Add buffers_adapter regression test +* Tidy up is_dynamic_buffer traits test +* Make buffers_adapter meet requirements + +-------------------------------------------------------------------------------- + +Version 43 + +* Require Boost 1.64.0 +* Fix strict aliasing warnings in buffers_view +* Tidy up buffer_prefix overloads and test +* Add write limit to test::string_ostream +* Additional constructors for consuming_buffers + +-------------------------------------------------------------------------------- + +Version 42 + +* Fix javadoc typo +* Add formal review notes +* Make buffers_view a public interface + +-------------------------------------------------------------------------------- + +Version 41 + +* Trim Appveyor matrix rows +* Concept revision and documentation +* Remove coveralls integration +* Tidy up formal parameter names + +WebSocket + +* Tidy up websocket::close_code enum and constructors + +API Changes + +* Return http::error::end_of_stream on HTTP read eof +* Remove placeholders +* Rename prepare_buffer(s) to buffer_prefix +* Remove handler helpers, tidy up hook invocations + +-------------------------------------------------------------------------------- + +Version 40 + +* Add to_static_string +* Consolidate get_lowest_layer in type_traits.hpp +* Fix basic_streambuf movable trait +* Tidy up .travis.yml + +-------------------------------------------------------------------------------- + +Version 39 + +Beast versions are now identified by a single integer which +is incremented on each merge. The macro BEAST_VERSION +identifies the version number, currently at 39. A version +setting commit will always be at the tip of the master +and develop branches. + +* Use beast::string_view alias +* Fixed braced-init error with older gcc + +HTTP + +* Tidy up basic_parser javadocs + +WebSocket: + +* Add websocket async echo ssl server test: +* Fix eof error on ssl::stream shutdown + +API Changes: + +* Refactor http::header contents +* New ostream() returns dynamic buffer output stream +* New buffers() replaces to_string() +* Rename to multi_buffer, basic_multi_buffer +* Rename to flat_buffer, basic_flat_buffer +* Rename to static_buffer, static_buffer_n +* Rename to buffered_read_stream +* Harmonize concepts and identifiers with net-ts +* Tidy up HTTP reason_string + +-------------------------------------------------------------------------------- + +1.0.0-b38 + +* Refactor static_string +* Refactor base64 +* Use static_string for WebSocket handshakes +* Simplify get_lowest_layer test +* Add test_allocator to extras/test +* More flat_streambuf tests +* WebSocket doc work +* Prevent basic_fields operator[] assignment + +API Changes: + +* Refactor WebSocket error codes +* Remove websocket::keep_alive option + +-------------------------------------------------------------------------------- + +1.0.0-b37 + +* CMake hide command lines in .vcxproj Output windows" +* Rename to detail::is_invocable +* Rename project to http-bench +* Fix flat_streambuf +* Add ub sanitizer blacklist +* Add -funsigned-char to asan build target +* Fix narrowing warning in table constants + +WebSocket: + +* Add is_upgrade() free function +* Document websocket::stream thread safety +* Rename to websocket::detail::pausation + +API Changes: + +* Provide websocket::stream accept() overloads +* Refactor websocket decorators +* Move everything in basic_fields.hpp to fields.hpp +* Rename to http::dynamic_body, consolidate header + +-------------------------------------------------------------------------------- + +1.0.0-b36 + +* Update README.md + +-------------------------------------------------------------------------------- + +1.0.0-b35 + +* Add Appveyor build scripts and badge +* Tidy up MSVC CMake configuration +* Make close_code a proper enum +* Add flat_streambuf +* Rename to BEAST_DOXYGEN +* Update .gitignore for VS2017 +* Fix README.md CMake instructions + +API Changes: + +* New HTTP interfaces +* Remove http::empty_body + +-------------------------------------------------------------------------------- + +1.0.0-b34 + +* Fix and tidy up CMake build scripts + +-------------------------------------------------------------------------------- + +1.0.0-b33 + +* Require Visual Studio 2015 Update 3 or later + +HTTP + +* Use fwrite return value in file_body + +WebSocket + +* Set internal state correctly when writing frames +* Add decorator unit test +* Add write_frames unit test + +-------------------------------------------------------------------------------- + +1.0.0-b32 + +* Add io_service completion invariants test +* Update CMake scripts for finding packages + +API Changes: + +* Remove http Writer suspend and resume feature + +-------------------------------------------------------------------------------- + +1.0.0-b31 + +* Tidy up build settings +* Add missing dynabuf_readstream member + +WebSocket + +* Move the handler, don't copy it + +-------------------------------------------------------------------------------- + +1.0.0-b30 + +WebSocket + +* Fix race in pings during reads +* Fix race in close frames during reads +* Fix race when write suspends +* Allow concurrent websocket async ping and writes + +-------------------------------------------------------------------------------- + +1.0.0-b29 + +* Fix compilation error in non-template class +* Document type-pun in buffer_cat +* Correctly check ostream modifier (/extras) + +HTTP + +* Fix Body requirements doc +* Fix illegal HTTP characters accepted as hex zero +* Fix Writer return value documentation + +WebSocket + +* Fix race in writes during reads +* Fix doc link typo + +-------------------------------------------------------------------------------- + +1.0.0-b28 + +* Split out and rename test stream classes +* Restyle async result constructions +* Fix HTTP split parse edge case + +-------------------------------------------------------------------------------- + +1.0.0-b27 + +* Tidy up tests and docs +* Add documentation building instructions + +API Changes: + +* Invoke callback on pings and pongs +* Move basic_streambuf to streambuf.hpp + +-------------------------------------------------------------------------------- + +1.0.0-b26 + +* Tidy up warnings and tests + +-------------------------------------------------------------------------------- + +1.0.0-b25 + +* Fixes for WebSocket echo server +* Fix 32-bit arm7 warnings +* Remove unnecessary include +* WebSocket server examples and test tidying +* Fix deflate setup bug + +API Changes: + +* Better handler_ptr + +-------------------------------------------------------------------------------- + +1.0.0-b24 + +* bjam use clang on MACOSX +* Simplify Travis package install specification +* Add optional yield_to arguments +* Make decorator copyable +* Add WebSocket permessage-deflate extension support + +-------------------------------------------------------------------------------- + +1.0.0-b23 + +* Tune websocket echo server for performance +* Add file and line number to thrown exceptions +* Better logging in async echo server +* Add copy special members +* Fix message constructor and special members +* Travis CI improvements + +-------------------------------------------------------------------------------- + +1.0.0-b22 + +* Fix broken Intellisense +* Implement the Asio deallocation-before-invocation guarantee +* Add handler helpers +* Avoid copies in handler_alloc +* Update README.md example programs +* Fix websocket stream read documentation +* Disable Boost.Coroutine deprecation warning +* Update documentation examples + +-------------------------------------------------------------------------------- + +1.0.0-b21 + +* Remove extraneous includes + +-------------------------------------------------------------------------------- + +1.0.0-b20 + +ZLib + +* Add ZLib module + +API Changes: + +* Rename HTTP identifiers + +-------------------------------------------------------------------------------- + +1.0.0-b19 + +* Boost library min/max guidance +* Improvements to code coverage +* Use boost::lexical_cast instead of std::to_string +* Fix prepare_buffers value_type +* Fix consuming_buffers value_type +* Better buffer_cat + +HTTP + +* Make chunk_encode public +* Add write, async_write, operator<< for message_headers +* Add read, async_read for message_headers +* Fix with_body example + +WebSocket + +* Optimize utf8 validation +* Optimize mask operations + +API Changes: + +* Refactor message and message_headers declarations +* prepared_buffers is private +* consume_buffers is removed + +-------------------------------------------------------------------------------- + +1.0.0-b18 + +* Increase optimization settings for MSVC builds + +HTTP + +* Check invariants in parse_op: +* Clean up message docs + +WebSocket + +* Write buffer option does not change capacity +* Close connection during async_read on close frame +* Add pong, async pong to stream + +Core + +* Meet DynamicBuffer requirements for static_streambuf +* Fix write_frame masking and auto-fragment handling + +Extras + +* unit_test::suite fixes: + - New overload of fail() specifies file and line + - BEAST_EXPECTS only evaluates the reason string on a failure +* Add zlib module + +-------------------------------------------------------------------------------- + +1.0.0-b17 + +* Change implicit to default value in example +* Tidy up some declarations +* Fix basic_streambuf::capacity +* Add basic_streambuf::alloc_size +* Parser callbacks may not throw +* Fix Reader concept doc typo +* Add is_Reader trait +* Tidy up basic_headers for documentation +* Tidy up documentation +* Add basic_parser_v1::reset +* Fix handling of body_what::pause in basic_parser_v1 +* Add headers_parser +* Engaged invokable is destructible +* Improve websocket example in README.md +* Refactor read_size_helper + +API Changes: + +* Added init() to Reader requirements +* Reader must be nothrow constructible +* Reader is now constructed right before reading the body + - The message passed on construction is filled in +* Rework HTTP concepts: + - Writer uses write instead of operator() + - Refactor traits to use void_t + - Remove is_ReadableBody, is_WritableBody + - Add has_reader, has_writer, is_Reader, is_Writer + - More friendly compile errors on failed concept checks +* basic_parser_v1 requires all callbacks present +* on_headers parser callback now returns void +* on_body_what is a new required parser callback returning body_what + +-------------------------------------------------------------------------------- + +1.0.0-b16 + +* Make value optional in param-list +* Frame processing routines are member functions +* Fix on_headers called twice from basic_parser_v1 +* Constrain parser_v1 constructor +* Improve first line serialization +* Add pause option to on_headers interface +* Refactor base_parser_v1 callback traits: +* Refine Parser concept +* Relax ForwardIterator requirements in FieldSequence +* Fix websocket failure testing +* Refine Writer concept and fix exemplar in documentation + +API Changes: + +* Rename mask_buffer_size to write_buffer_size +* Make auto_fragment a boolean option + +The message class hierarchy is refactored (breaking change): + +* One message class now models both HTTP/1 and HTTP/2 messages +* message_v1, request_v1, response_v1 removed +* New classes basic_request and basic_response model + messages without the body. + + Error resolution: Callers should use message, request, + and response instead of message_v1, request_v1, and + response_v1 respectively. + +-------------------------------------------------------------------------------- + +1.0.0-b15 + +* rfc7230 section 3.3.2 compliance +* Add HTTPS example +* Add Secure WebSocket example +* Fix message_v1 constructor +* Tidy up DynamicBuffer requirements +* Tidy up error types and headers +* Fix handling empty HTTP headers in parser_v1 + +-------------------------------------------------------------------------------- + +1.0.0-b14 + +* Add missing rebind to handler_alloc +* Fix error handling in http server examples +* Fix CMake scripts for MinGW +* Use BOOST_ASSERT +* Better WebSocket decorator +* Update and tidy documentation + +-------------------------------------------------------------------------------- + +1.0.0-b13 + +* dstream improvements +* Remove bin and bin64 directories +* Tidy up .vcxproj file groupings + +-------------------------------------------------------------------------------- + +1.0.0-b12 + +* Use -p to print suites from unit test main. +* BEAST_EXPECTS to add a reason string to test failures +* Fix unit test runner to output all case names +* Update README for build requirements +* Rename to CHANGELOG.md + +-------------------------------------------------------------------------------- + +1.0.0-b11 + +* Set URI in generated WebSocket Upgrade requests +* Rename echo server class and file names +* Rename to DynamicBuffer in some code and documentation +* Fix integer warnings in Windows builds +* Add 32 and 64 bit Windows build support +* Update README for build instructions and more +* Add repository and documention banners + +-------------------------------------------------------------------------------- + +1.0.0-b10 + +* Fix compilation warnings +* Add websocketpp comparison to HTML documentation + +-------------------------------------------------------------------------------- + +1.0.0-b9 + +* Fix CMakeLists.txt + +-------------------------------------------------------------------------------- + +1.0.0-b8 + +* Fix include in example code +* Fix basic_headers rfc2616 Section 4.2 compliance + +-------------------------------------------------------------------------------- + +1.0.0-b7 + +* Fix prepare by calling init. prepare() can throw depending on the + implementation of Writer. Publicly provided beast::http writers never throw. +* Fixes to example HTTP server +* Fully qualify ambiguous calls to read and parse +* Remove deprecated http::stream wrapper +* Example HTTP server now calculates the MIME-type +* Fixes and documentation for teardown and use with SSL: +* Add example code to rfc7230 javadocs +* Remove extraneous header file <beast/http/status.hpp> +* Add skip_body parser option + +-------------------------------------------------------------------------------- + +1.0.0-b6 + +* Use SFINAE on return values +* Use beast::error_code instead of nested types +* Tidy up use of GENERATING_DOCS +* Remove obsolete RFC2616 functions +* Add message swap members and free functions +* Add HTTP field value parser containers: ext_list, param_list, token_list +* Fixes for some corner cases in basic_parser_v1 +* Configurable limits on headers and body sizes in basic_parser_v1 + +API Changes: + +* ci_equal is moved to beast::http namespace, in rfc7230.hpp + +* "DynamicBuffer","dynabuf" renamed from "Streambuf", "streambuf". See: + http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4478.html#requirements.dynamic_buffers + +* basic_parser_v1 adheres to rfc7230 as strictly as possible + +-------------------------------------------------------------------------------- diff --git a/contrib/restricted/boost/beast/CODE_OF_CONDUCT.md b/contrib/restricted/boost/beast/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..f20c98a738 --- /dev/null +++ b/contrib/restricted/boost/beast/CODE_OF_CONDUCT.md @@ -0,0 +1,9 @@ +# Code of Conduct + +* Be respectful of others + +* Please use professional conduct + +* Treat others the way you want to be treated + +Thank you! diff --git a/contrib/restricted/boost/beast/CONTRIBUTING.md b/contrib/restricted/boost/beast/CONTRIBUTING.md new file mode 100644 index 0000000000..de3f11cf1a --- /dev/null +++ b/contrib/restricted/boost/beast/CONTRIBUTING.md @@ -0,0 +1,65 @@ +# Contributing to Beast + +Thank you for taking the time to read this document! + +:heart_eyes: **please star the Boost.Beast repository!** :heart_eyes: + +First make sure you're on the +[official repository page](https://github.com/boostorg/beast/blob/master/CONTRIBUTING.md), +then just press the button labeled "star" in the top right of the page +to give Beast a star! Your stars create generate additional visibility, +which leads to more users, more bug reports, more fixes, more testing, +more features, and a better product! + +<a href="https://github.com/boostorg/beast/blob/master/CONTRIBUTING.md"> +<img width="400" height = "150" alt = "Please Star the Repository" + src="https://raw.githubusercontent.com/vinniefalco/BeastAssets/master/StarTheRepo.png"> +</a> + +Click the image above to make sure you're on the official +Boost repository page so you can give Beast a star! + +# Ways to Contribute + +No contribution to Beast is too big or too small! We are +always happy to see user participation in all of its forms. +Here are some of the ways that you can contribute (this is +by no means an exhaustive list): + +* Submit a + [bug report](https://github.com/boostorg/beast/issues). + We love hearing about broken things, so + that we can fix them. Any problem is fair game, this includes + the documentation examples, tests, and repository as well as the + library itself. Bug reports should be opened on the + [Issues](https://github.com/boostorg/beast/issues) page. + +* Provide + [feedback](https://github.com/boostorg/beast/issues). + about the library. If you have used, are using, + or are thinking about using the library we want to hear about it! + The more information you provide, the better we will be able + to ensure that Beast meets your needs. You can provide feedback + as an issue, or email the author directly. + +* Test Beast. When changes are made, they are submitted as a + [Pull Request](https://github.com/boostorg/beast/pulls). + Everyone is welcome to examine these upcoming changes, test them, + and report on the results. This form of quality assurance is very + helpful so we can keep delivering a great product. Consider + subscribing to repository notifications to get alerted to new + pull requests. + +* Code Review on + [Pull Requests](https://github.com/boostorg/beast/pulls). + This is one of the most valuable ways to contribute, because it helps + to improve code and features, and helps to find bugs, before the code + gets merged. A little bit of time investment from just a few people on + each pull request goes a **long** way to increasing the quality of the + final product. For tips on how to participate in pull requests please + view the + [README.md](https://github.com/boostorg/beast#contributing-we-need-your-help). + +* Use Beast in your next application! At the end of the day, it is the + goal of the library to provide utility to users so the best way you + can contribute is simply to use the library! diff --git a/contrib/restricted/boost/beast/LICENSE_1_0.txt b/contrib/restricted/boost/beast/LICENSE_1_0.txt new file mode 100644 index 0000000000..36b7cd93cd --- /dev/null +++ b/contrib/restricted/boost/beast/LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/contrib/restricted/boost/beast/README.md b/contrib/restricted/boost/beast/README.md new file mode 100644 index 0000000000..62220de99f --- /dev/null +++ b/contrib/restricted/boost/beast/README.md @@ -0,0 +1,212 @@ +<img width="880" height = "80" alt = "Boost.Beast Title" + src="https://raw.githubusercontent.com/boostorg/beast/master/doc/images/readme2.png"> + +# HTTP and WebSocket built on Boost.Asio in C++11 + +Branch | Linux/OSX | Windows | Coverage | Documentation | Matrix +------------|-----------|---------|----------|---------------|-------- +[master](https://github.com/boostorg/beast/tree/master) | [![Build Status](https://travis-ci.org/boostorg/beast.svg?branch=master)](https://travis-ci.org/boostorg/beast) | [![Build status](https://ci.appveyor.com/api/projects/status/g0llpbvhpjuxjnlw/branch/master?svg=true)](https://ci.appveyor.com/project/vinniefalco/beast/branch/master) | [![codecov](https://codecov.io/gh/boostorg/Beast/branch/master/graph/badge.svg)](https://codecov.io/gh/boostorg/beast/branch/master) | [![Documentation](https://img.shields.io/badge/documentation-master-brightgreen.svg)](http://www.boost.org/doc/libs/master/libs/beast/doc/html/index.html) | [![Matrix](https://img.shields.io/badge/matrix-master-brightgreen.svg)](http://www.boost.org/development/tests/master/developer/beast.html) +[develop](https://github.com/boostorg/beast/tree/develop) | [![Build Status](https://travis-ci.org/boostorg/beast.svg?branch=develop)](https://travis-ci.org/boostorg/beast) | [![Build status](https://ci.appveyor.com/api/projects/status/g0llpbvhpjuxjnlw/branch/develop?svg=true)](https://ci.appveyor.com/project/vinniefalco/beast/branch/develop) | [![codecov](https://codecov.io/gh/boostorg/Beast/branch/develop/graph/badge.svg)](https://codecov.io/gh/boostorg/beast/branch/develop) | [![Documentation](https://img.shields.io/badge/documentation-develop-brightgreen.svg)](http://www.boost.org/doc/libs/develop/libs/beast/index.html) | [![Matrix](https://img.shields.io/badge/matrix-develop-brightgreen.svg)](http://www.boost.org/development/tests/develop/developer/beast.html) + +## Contents + +- [Introduction](#introduction) +- [Appearances](#appearances) +- [Description](#description) +- [Requirements](#requirements) +- [Git Branches](#branches) +- [Building](#building) +- [Usage](#usage) +- [License](#license) +- [Contact](#contact) +- [Contributing](#Contributing) + +## Introduction + +Beast is a C++ header-only library serving as a foundation for writing +interoperable networking libraries by providing **low-level HTTP/1, +WebSocket, and networking protocol** vocabulary types and algorithms +using the consistent asynchronous model of Boost.Asio. + +This library is designed for: + +* **Symmetry:** Algorithms are role-agnostic; build clients, servers, or both. + +* **Ease of Use:** Boost.Asio users will immediately understand Beast. + +* **Flexibility:** Users make the important decisions such as buffer or + thread management. + +* **Performance:** Build applications handling thousands of connections or more. + +* **Basis for Further Abstraction.** Components are well-suited for building upon. + +## Appearances + +| <a href="https://www.bishopfox.com/case_study/securing-beast/">Bishop Fox 2018</a> | +| ------------ | +| <a href="https://youtu.be/4TtyYbGDAj0"><img width="320" height = "180" alt="Beast Security Review" src="https://raw.githubusercontent.com/vinniefalco/BeastAssets/master/BishopFox2018.png"></a> | + +| <a href="https://raw.githubusercontent.com/vinniefalco/CppCon2017/master/Make%20Classes%20Great%20Again%20-%20Vinnie%20Falco%20-%20CppCon%202017.pdf">CppCon 2017</a> | <a href="http://cppcast.com/2017/01/vinnie-falco/">CppCast 2017</a> | <a href="https://raw.githubusercontent.com/vinniefalco/BeastAssets/master/CppCon2016.pdf">CppCon 2016</a> | +| ------------ | ------------ | ----------- | +| <a href="https://www.youtube.com/watch?v=WsUnnYEKPnI"><img width="320" height = "180" alt="Beast" src="https://raw.githubusercontent.com/vinniefalco/CppCon2017/master/CppCon2017.png"></a> | <a href="http://cppcast.com/2017/01/vinnie-falco/"><img width="180" height="180" alt="Vinnie Falco" src="https://avatars1.githubusercontent.com/u/1503976?v=3&u=76c56d989ef4c09625256662eca2775df78a16ad&s=180"></a> | <a href="https://www.youtube.com/watch?v=uJZgRcvPFwI"><img width="320" height = "180" alt="Beast" src="https://raw.githubusercontent.com/vinniefalco/BeastAssets/master/CppCon2016.png"></a> | + +## Description + +This software is in its first official release. Interfaces +may change in response to user feedback. For recent changes +see the [CHANGELOG](CHANGELOG.md). + +* [Official Site](https://github.com/boostorg/beast) +* [Documentation](http://www.boost.org/doc/libs/master/libs/beast/) (master branch) +* [Autobahn|Testsuite WebSocket Results](https://vinniefalco.github.io/boost/beast/reports/autobahn/index.html) + +## Requirements + +This library is for programmers familiar with Boost.Asio. Users +who wish to use asynchronous interfaces should already know how to +create concurrent network programs using callbacks or coroutines. + +* **C++11:** Robust support for most language features. +* **Boost:** Boost.Asio and some other parts of Boost. +* **OpenSSL:** Optional, for using TLS/Secure sockets. + +When using Microsoft Visual C++, Visual Studio 2015 Update 3 or later is required. + +One of these components is required in order to build the tests and examples: + +* Properly configured bjam/b2 +* CMake 3.5.1 or later (Windows only) + +## Branches + +The official repository contains the following branches: + +* [**master**](https://github.com/boostorg/beast/tree/master) This + holds the most recent snapshot with code that is known to be stable. + +* [**develop**](https://github.com/boostorg/beast/tree/develop) This + holds the most recent snapshot. It may contain unstable code. + +Each of these branches requires a corresponding Boost branch and +all of its subprojects. For example, if you wish to use the **master** +branch version of Beast, you should clone the Boost superproject, +switch to the **master** branch in the superproject and acquire +all the Boost libraries corresponding to that branch including Beast. + +Or, to use the latest shipping version of Beast, simply use it +from the corresponding distribution of Boost. + +## Building + +Beast is header-only. To use it just add the necessary `#include` line +to your source files, like this: +```C++ +#include <boost/beast.hpp> +``` + +To build your program successfully, you'll need to add the Boost.System +library to link with. If you use coroutines you'll also need to link +with the Boost.Coroutine library. Please visit the Boost documentation +for instructions on how to do this for your particular build system. + +To build the documentation, examples, tests, and benchmarks it is +necessary to first obtain the Boost "superproject" along with sources of +all of the Boost libraries, then run the `b2` command to build the Boost +libraries. +Instructions for doing so may be found on +the [Boost Wiki](https://github.com/boostorg/boost/wiki/Getting-Started). +These commamnds will build the programs and documentation that come +with Beast (omit the cxxflags parameter when building using MSVC): + +``` +cd boost # The directory containing the Boost superproject and libraries +b2 libs/beast/test cxxflags="-std=c++11" # bjam must be in your $PATH +b2 libs/beast/example cxxflags="-std=c++11" +b2 libs/beast/doc +``` + +On Windows platforms only, CMake may be used to generate a Visual Studio +solution and a set of Visual Studio project files using these commands: + +``` +cd boost # The directory containing the Boost superproject and libraries +cd libs/beast +mkdir bin +cd bin +cmake .. # for 32-bit Windows builds, or +cmake -G"Visual Studio 14 2015 Win64" .. # for 64-bit Windows builds (VS2015), or +cmake -G"Visual Studio 15 2017 Win64" .. # for 64-bit Windows builds (VS2017) +``` + +The files in the repository are laid out thusly: + +``` +./ + bin/ Create this to hold executables and project files + bin64/ Create this to hold 64-bit Windows executables and project files + doc/ Source code and scripts for the documentation + include/ Where the header files live + extras/ Additional APIs, may change + example/ Self contained example programs + meta/ Metadata for Boost integration + scripts/ Small scripts used with CI systems + test/ Unit tests +``` + +## Usage + +These examples are complete, self-contained programs that you can build +and run yourself (they are in the `example` directory). + +http://www.boost.org/doc/libs/develop/libs/beast/doc/html/beast/quick_start.html + +## License + +Distributed under the Boost Software License, Version 1.0. +(See accompanying file [LICENSE_1_0.txt](LICENSE_1_0.txt) or copy at +http://www.boost.org/LICENSE_1_0.txt) + +## Contact + +Please report issues or questions here: +https://github.com/boostorg/beast/issues + +--- + +## Contributing (We Need Your Help!) + +If you would like to contribute to Beast and help us maintain high +quality, consider performing code reviews on active pull requests. +Any feedback from users and stakeholders, even simple questions about +how things work or why they were done a certain way, carries value +and can be used to improve the library. Code review provides these +benefits: + +* Identify bugs +* Documentation proof-reading +* Adjust interfaces to suit use-cases +* Simplify code + +You can look through the Closed pull requests to get an idea of how +reviews are performed. To give a code review just sign in with your +GitHub account and then add comments to any open pull requests below, +don't be shy! +<p>https://github.com/boostorg/beast/pulls</p> + +Here are some resources to learn more about +code reviews: + +* <a href="https://blog.scottnonnenberg.com/top-ten-pull-request-review-mistakes/">Top 10 Pull Request Review Mistakes</a> +* <a href="https://smartbear.com/SmartBear/media/pdfs/best-kept-secrets-of-peer-code-review.pdf">Best Kept Secrets of Peer Code Review (pdf)</a> +* <a href="http://support.smartbear.com/support/media/resources/cc/11_Best_Practices_for_Peer_Code_Review.pdf">11 Best Practices for Peer Code Review (pdf)</a> +* <a href="http://www.evoketechnologies.com/blog/code-review-checklist-perform-effective-code-reviews/">Code Review Checklist – To Perform Effective Code Reviews</a> +* <a href="https://www.codeproject.com/Articles/524235/Codeplusreviewplusguidelines">Code review guidelines</a> +* <a href="https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md">C++ Core Guidelines</a> +* <a href="https://doc.lagout.org/programmation/C/CPP101.pdf">C++ Coding Standards (Sutter & Andrescu)</a> + +Beast thrives on code reviews and any sort of feedback from users and +stakeholders about its interfaces. Even if you just have questions, +asking them in the code review or in issues provides valuable information +that can be used to improve the library - do not hesitate, no question +is insignificant or unimportant! diff --git a/contrib/restricted/boost/boost/beast.hpp b/contrib/restricted/boost/boost/beast.hpp deleted file mode 100644 index f2d74ed84b..0000000000 --- a/contrib/restricted/boost/boost/beast.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright (c) 2013-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_HPP -#define BOOST_BEAST_HPP - -#include <boost/beast/core/detail/config.hpp> // must come first - -#include <boost/beast/core.hpp> -#include <boost/beast/http.hpp> -#include <boost/beast/version.hpp> -#include <boost/beast/websocket.hpp> -#include <boost/beast/zlib.hpp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core.hpp b/contrib/restricted/boost/boost/beast/core.hpp deleted file mode 100644 index 620d42ada6..0000000000 --- a/contrib/restricted/boost/boost/beast/core.hpp +++ /dev/null @@ -1,41 +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_HPP -#define BOOST_BEAST_CORE_HPP - -#include <boost/beast/core/detail/config.hpp> - -#include <boost/beast/core/bind_handler.hpp> -#include <boost/beast/core/buffered_read_stream.hpp> -#include <boost/beast/core/buffers_adapter.hpp> -#include <boost/beast/core/buffers_cat.hpp> -#include <boost/beast/core/buffers_prefix.hpp> -#include <boost/beast/core/buffers_suffix.hpp> -#include <boost/beast/core/buffers_to_string.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/file.hpp> -#include <boost/beast/core/file_base.hpp> -#include <boost/beast/core/file_posix.hpp> -#include <boost/beast/core/file_stdio.hpp> -#include <boost/beast/core/file_win32.hpp> -#include <boost/beast/core/flat_buffer.hpp> -#include <boost/beast/core/flat_static_buffer.hpp> -#include <boost/beast/core/handler_ptr.hpp> -#include <boost/beast/core/multi_buffer.hpp> -#include <boost/beast/core/ostream.hpp> -#include <boost/beast/core/read_size.hpp> -#include <boost/beast/core/span.hpp> -#include <boost/beast/core/static_buffer.hpp> -#include <boost/beast/core/static_string.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/string_param.hpp> -#include <boost/beast/core/type_traits.hpp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/bind_handler.hpp b/contrib/restricted/boost/boost/beast/core/bind_handler.hpp deleted file mode 100644 index 0fb7b8233b..0000000000 --- a/contrib/restricted/boost/boost/beast/core/bind_handler.hpp +++ /dev/null @@ -1,78 +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_BIND_HANDLER_HPP -#define BOOST_BEAST_BIND_HANDLER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/bind_handler.hpp> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { - -/** Bind parameters to a completion handler, creating a new handler. - - This function creates a new handler which, when invoked, calls - the original handler with the list of bound arguments. Any - parameters passed in the invocation will be substituted for - placeholders present in the list of bound arguments. Parameters - which are not matched to placeholders are silently discarded. - - The passed handler and arguments are forwarded into the returned - handler, whose associated allocator and associated executor will - will be the same as those of the original handler. - - Example: - - @code - template<class AsyncReadStream, class ReadHandler> - void - signal_aborted(AsyncReadStream& stream, ReadHandler&& handler) - { - boost::asio::post( - stream.get_executor(), - bind_handler(std::forward<ReadHandler>(handler), - boost::asio::error::operation_aborted, 0)); - } - @endcode - - @param handler The handler to wrap. - - @param args A list of arguments to bind to the handler. - The arguments are forwarded into the returned object. These - arguments may include placeholders, which will operate in - a fashion identical to a call to `std::bind`. -*/ -template<class Handler, class... Args> -#if BOOST_BEAST_DOXYGEN -implementation_defined -#else -detail::bound_handler< - typename std::decay<Handler>::type, Args...> -#endif -bind_handler(Handler&& handler, Args&&... args) -{ -#if 0 - // Can't do this because of placeholders - static_assert(is_completion_handler< - Handler, void(Args...)>::value, - "Handler requirements not met"); -#endif - return detail::bound_handler<typename std::decay< - Handler>::type, Args...>(std::forward< - Handler>(handler), std::forward<Args>(args)...); -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/buffered_read_stream.hpp b/contrib/restricted/boost/boost/beast/core/buffered_read_stream.hpp deleted file mode 100644 index 974062309f..0000000000 --- a/contrib/restricted/boost/boost/beast/core/buffered_read_stream.hpp +++ /dev/null @@ -1,372 +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_BUFFERED_READ_STREAM_HPP -#define BOOST_BEAST_BUFFERED_READ_STREAM_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/multi_buffer.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/asio/async_result.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/asio/io_context.hpp> -#include <cstdint> -#include <utility> - -namespace boost { -namespace beast { - -/** A @b Stream with attached @b DynamicBuffer to buffer reads. - - This wraps a @b Stream implementation so that calls to write are - passed through to the underlying stream, while calls to read will - first consume the input sequence stored in a @b DynamicBuffer which - is part of the object. - - The use-case for this class is different than that of the - `boost::asio::buffered_readstream`. It is designed to facilitate - the use of `boost::asio::read_until`, and to allow buffers - acquired during detection of handshakes to be made transparently - available to callers. A hypothetical implementation of the - buffered version of `boost::asio::ssl::stream::async_handshake` - could make use of this wrapper. - - Uses: - - @li Transparently leave untouched input acquired in calls - to `boost::asio::read_until` behind for subsequent callers. - - @li "Preload" a stream with handshake input data acquired - from other sources. - - Example: - @code - // Process the next HTTP header on the stream, - // leaving excess bytes behind for the next call. - // - template<class DynamicBuffer> - void process_http_message( - buffered_read_stream<DynamicBuffer>& stream) - { - // Read up to and including the end of the HTTP - // header, leaving the sequence in the stream's - // buffer. read_until may read past the end of the - // headers; the return value will include only the - // part up to the end of the delimiter. - // - std::size_t bytes_transferred = - boost::asio::read_until( - stream.next_layer(), stream.buffer(), "\r\n\r\n"); - - // Use buffers_prefix() to limit the input - // sequence to only the data up to and including - // the trailing "\r\n\r\n". - // - auto header_buffers = buffers_prefix( - bytes_transferred, stream.buffer().data()); - - ... - - // Discard the portion of the input corresponding - // to the HTTP headers. - // - stream.buffer().consume(bytes_transferred); - - // Everything we read from the stream - // is part of the content-body. - } - @endcode - - @tparam Stream The type of stream to wrap. - - @tparam DynamicBuffer The type of stream buffer to use. -*/ -template<class Stream, class DynamicBuffer> -class buffered_read_stream -{ - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - - template<class Buffers, class Handler> - class read_some_op; - - DynamicBuffer buffer_; - std::size_t capacity_ = 0; - Stream next_layer_; - -public: - /// The type of the internal buffer - using buffer_type = DynamicBuffer; - - /// The type of the next layer. - using next_layer_type = - typename std::remove_reference<Stream>::type; - - /// The type of the lowest layer. - using lowest_layer_type = get_lowest_layer<next_layer_type>; - - /** Move constructor. - - @note The behavior of move assignment on or from streams - with active or pending operations is undefined. - */ - buffered_read_stream(buffered_read_stream&&) = default; - - /** Move assignment. - - @note The behavior of move assignment on or from streams - with active or pending operations is undefined. - */ - buffered_read_stream& operator=(buffered_read_stream&&) = default; - - /** Construct the wrapping stream. - - @param args Parameters forwarded to the `Stream` constructor. - */ - template<class... Args> - explicit - buffered_read_stream(Args&&... args); - - /// Get a reference to the next layer. - next_layer_type& - next_layer() - { - return next_layer_; - } - - /// Get a const reference to the next layer. - next_layer_type const& - next_layer() const - { - return next_layer_; - } - - /// Get a reference to the lowest layer. - lowest_layer_type& - lowest_layer() - { - return next_layer_.lowest_layer(); - } - - /// Get a const reference to the lowest layer. - lowest_layer_type const& - lowest_layer() const - { - return next_layer_.lowest_layer(); - } - - /** 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. - - @note This function participates in overload resolution only if - `NextLayer` has a member function named `get_executor`. - */ -#if BOOST_BEAST_DOXYGEN - implementation_defined -#else - template< - class T = next_layer_type, - class = typename std::enable_if< - has_get_executor<next_layer_type>::value>::type> - auto -#endif - get_executor() noexcept -> - decltype(std::declval<T&>().get_executor()) - { - return next_layer_.get_executor(); - } - - /** Access the internal buffer. - - The internal buffer is returned. It is possible for the - caller to break invariants with this function. For example, - by causing the internal buffer size to increase beyond - the caller defined maximum. - */ - DynamicBuffer& - buffer() - { - return buffer_; - } - - /// Access the internal buffer - DynamicBuffer const& - buffer() const - { - return buffer_; - } - - /** Set the maximum buffer size. - - This changes the maximum size of the internal buffer used - to hold read data. No bytes are discarded by this call. If - the buffer size is set to zero, no more data will be buffered. - - Thread safety: - The caller is responsible for making sure the call is - made from the same implicit or explicit strand. - - @param size The number of bytes in the read buffer. - - @note This is a soft limit. If the new maximum size is smaller - than the amount of data in the buffer, no bytes are discarded. - */ - void - capacity(std::size_t size) - { - capacity_ = size; - } - - /** 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 One or more buffers into which the data will be read. - - @return The number of bytes read. - - @throws system_error Thrown on failure. - */ - 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 One or more buffers into which the data will be read. - - @param ec Set to the error, if any occurred. - - @return The number of bytes read, or 0 on error. - */ - 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 data from - the stream. 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 Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation - std::size_t bytes_transferred // number of bytes transferred - ); @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(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 to the stream. - The function call will block until one or more bytes of the - data has been written successfully, or until an error occurs. - - @param buffers One or more data buffers to be written to the stream. - - @return The number of bytes written. - - @throws system_error Thrown on failure. - */ - template<class ConstBufferSequence> - std::size_t - write_some(ConstBufferSequence const& buffers) - { - static_assert(is_sync_write_stream<next_layer_type>::value, - "SyncWriteStream requirements not met"); - return next_layer_.write_some(buffers); - } - - /** Write some data to the stream. - - This function is used to write data to the stream. - The function call will block until one or more bytes of the - data has been written successfully, or until an error occurs. - - @param buffers One or more data buffers to be written to the stream. - - @param ec Set to the error, if any occurred. - - @return The number of bytes written. - */ - template<class ConstBufferSequence> - std::size_t - write_some(ConstBufferSequence const& buffers, - error_code& ec) - { - static_assert(is_sync_write_stream<next_layer_type>::value, - "SyncWriteStream requirements not met"); - return next_layer_.write_some(buffers, ec); - } - - /** Start an asynchronous write. - - This function is used to asynchronously write data from - the stream. The function call always returns immediately. - - @param buffers One or more data buffers to be written to - the stream. 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 Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation - std::size_t bytes_transferred // number of bytes transferred - ); @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(error_code, std::size_t)) - async_write_some(ConstBufferSequence const& buffers, - WriteHandler&& handler); -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/buffered_read_stream.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/buffers_adapter.hpp b/contrib/restricted/boost/boost/beast/core/buffers_adapter.hpp deleted file mode 100644 index 826183ed06..0000000000 --- a/contrib/restricted/boost/boost/beast/core/buffers_adapter.hpp +++ /dev/null @@ -1,164 +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_BUFFERS_ADAPTER_HPP -#define BOOST_BEAST_BUFFERS_ADAPTER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <type_traits> - -namespace boost { -namespace beast { - -/** Adapts a @b MutableBufferSequence into a @b DynamicBuffer. - - This class wraps a @b MutableBufferSequence to meet the requirements - of @b DynamicBuffer. Upon construction the input and output sequences are - empty. A copy of the mutable buffer sequence object is stored; however, - ownership of the underlying memory is not transferred. The caller is - responsible for making sure that referenced memory remains valid - for the duration of any operations. - - The size of the mutable buffer sequence determines the maximum - number of bytes which may be prepared and committed. - - @tparam MutableBufferSequence The type of mutable buffer sequence to wrap. -*/ -template<class MutableBufferSequence> -class buffers_adapter -{ - static_assert(boost::asio::is_mutable_buffer_sequence<MutableBufferSequence>::value, - "MutableBufferSequence requirements not met"); - - using iter_type = typename - detail::buffer_sequence_iterator< - MutableBufferSequence>::type; - - MutableBufferSequence bs_; - iter_type begin_; - iter_type out_; - iter_type end_; - std::size_t max_size_; - std::size_t in_pos_ = 0; // offset in *begin_ - std::size_t in_size_ = 0; // size of input sequence - std::size_t out_pos_ = 0; // offset in *out_ - std::size_t out_end_ = 0; // output end offset - - template<class Deduced> - buffers_adapter(Deduced&& other, - std::size_t nbegin, std::size_t nout, - std::size_t nend) - : bs_(std::forward<Deduced>(other).bs_) - , begin_(std::next(bs_.begin(), nbegin)) - , out_(std::next(bs_.begin(), nout)) - , end_(std::next(bs_.begin(), nend)) - , max_size_(other.max_size_) - , in_pos_(other.in_pos_) - , in_size_(other.in_size_) - , out_pos_(other.out_pos_) - , out_end_(other.out_end_) - { - } - -public: -#if BOOST_BEAST_DOXYGEN - /// The type used to represent the input sequence as a list of buffers. - using const_buffers_type = implementation_defined; - - /// The type used to represent the output sequence as a list of buffers. - using mutable_buffers_type = implementation_defined; - -#else - class const_buffers_type; - - class mutable_buffers_type; - -#endif - - /// Move constructor. - buffers_adapter(buffers_adapter&& other); - - /// Copy constructor. - buffers_adapter(buffers_adapter const& other); - - /// Move assignment. - buffers_adapter& operator=(buffers_adapter&& other); - - /// Copy assignment. - buffers_adapter& operator=(buffers_adapter const&); - - /** Construct a buffers adapter. - - @param buffers The mutable buffer sequence to wrap. A copy of - the object will be made, but ownership of the memory is not - transferred. - */ - explicit - buffers_adapter(MutableBufferSequence const& buffers); - - /// Returns the largest size output sequence possible. - std::size_t - max_size() const - { - return max_size_; - } - - /// Get the size of the input sequence. - std::size_t - size() const - { - return in_size_; - } - - /// Returns the maximum sum of the sizes of the input sequence and output sequence the buffer can hold without requiring reallocation. - std::size_t - capacity() const - { - return max_size_; - } - - /** Get a list of buffers that represents the output sequence, with the given size. - - @throws std::length_error if the size would exceed the limit - imposed by the underlying mutable buffer sequence. - - @note Buffers representing the input sequence acquired prior to - this call remain valid. - */ - mutable_buffers_type - prepare(std::size_t n); - - /** Move bytes from the output sequence to the input sequence. - - @note Buffers representing the input sequence acquired prior to - this call remain valid. - */ - void - commit(std::size_t n); - - /** Get a list of buffers that represents the input sequence. - - @note These buffers remain valid across subsequent calls to `prepare`. - */ - const_buffers_type - data() const; - - /// Remove bytes from the input sequence. - void - consume(std::size_t n); -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/buffers_adapter.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/buffers_cat.hpp b/contrib/restricted/boost/boost/beast/core/buffers_cat.hpp deleted file mode 100644 index 1d711b3b30..0000000000 --- a/contrib/restricted/boost/boost/beast/core/buffers_cat.hpp +++ /dev/null @@ -1,119 +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_BUFFERS_CAT_HPP -#define BOOST_BEAST_BUFFERS_CAT_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <tuple> - -namespace boost { -namespace beast { - -/** A buffer sequence representing a concatenation of buffer sequences. - - @see @ref buffers_cat -*/ -template<class... Buffers> -class buffers_cat_view -{ - std::tuple<Buffers...> bn_; - -public: - /** The type of buffer returned when dereferencing an iterator. - - If every buffer sequence in the view is a @b MutableBufferSequence, - then `value_type` will be `boost::asio::mutable_buffer`. - Otherwise, `value_type` will be `boost::asio::const_buffer`. - */ -#if BOOST_BEAST_DOXYGEN - using value_type = implementation_defined; -#else - using value_type = typename - detail::common_buffers_type<Buffers...>::type; -#endif - - /// The type of iterator used by the concatenated sequence - class const_iterator; - - /// Constructor - buffers_cat_view(buffers_cat_view&&) = default; - - /// Assignment - buffers_cat_view& operator=(buffers_cat_view&&) = default; - - /// Assignment - buffers_cat_view& operator=(buffers_cat_view const&) = default; - - /** Constructor - - @param buffers The list of buffer sequences to concatenate. - Copies of the arguments will be made; however, the ownership - of memory is not transferred. - */ - explicit - buffers_cat_view(Buffers const&... buffers); - - //----- - - /// Required for @b BufferSequence - buffers_cat_view(buffers_cat_view const&) = default; - - /// Required for @b BufferSequence - const_iterator - begin() const; - - /// Required for @b BufferSequence - const_iterator - end() const; -}; - -/** Concatenate 2 or more buffer sequences. - - This function returns a constant or mutable buffer sequence which, - when iterated, efficiently concatenates the input buffer sequences. - Copies of the arguments passed will be made; however, the returned - object does not take ownership of the underlying memory. The - application is still responsible for managing the lifetime of the - referenced memory. - - @param buffers The list of buffer sequences to concatenate. - - @return A new buffer sequence that represents the concatenation of - the input buffer sequences. This buffer sequence will be a - @b MutableBufferSequence if each of the passed buffer sequences is - also a @b MutableBufferSequence; otherwise the returned buffer - sequence will be a @b ConstBufferSequence. - - @see @ref buffers_cat_view -*/ -#if BOOST_BEAST_DOXYGEN -template<class... BufferSequence> -buffers_cat_view<BufferSequence...> -buffers_cat(BufferSequence const&... buffers) -#else -template<class B1, class B2, class... Bn> -inline -buffers_cat_view<B1, B2, Bn...> -buffers_cat(B1 const& b1, B2 const& b2, Bn const&... bn) -#endif -{ - static_assert( - detail::is_all_const_buffer_sequence<B1, B2, Bn...>::value, - "BufferSequence requirements not met"); - return buffers_cat_view<B1, B2, Bn...>{b1, b2, bn...}; -} - -} // beast -} // boost - -#include <boost/beast/core/impl/buffers_cat.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/buffers_prefix.hpp b/contrib/restricted/boost/boost/beast/core/buffers_prefix.hpp deleted file mode 100644 index 858723fe7d..0000000000 --- a/contrib/restricted/boost/boost/beast/core/buffers_prefix.hpp +++ /dev/null @@ -1,237 +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_BUFFERS_PREFIX_HPP -#define BOOST_BEAST_BUFFERS_PREFIX_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/optional/optional.hpp> -#include <cstdint> -#include <type_traits> - -namespace boost { -namespace beast { - -/** A buffer sequence adapter that shortens the sequence size. - - The class adapts a buffer sequence to efficiently represent - a shorter subset of the original list of buffers starting - with the first byte of the original sequence. - - @tparam BufferSequence The buffer sequence to adapt. -*/ -template<class BufferSequence> -class buffers_prefix_view -{ - using buffers_type = typename - std::decay<BufferSequence>::type; - - using iter_type = typename - detail::buffer_sequence_iterator<buffers_type>::type; - - BufferSequence bs_; - std::size_t size_; - iter_type end_; - - template<class Deduced> - buffers_prefix_view( - Deduced&& other, std::size_t dist) - : bs_(std::forward<Deduced>(other).bs_) - , size_(other.size_) - , end_(std::next(bs_.begin(), dist)) - { - } - - void - setup(std::size_t size); - -public: - /// The type for each element in the list of buffers. - using value_type = typename std::conditional< - std::is_convertible<typename - std::iterator_traits<iter_type>::value_type, - boost::asio::mutable_buffer>::value, - boost::asio::mutable_buffer, - boost::asio::const_buffer>::type; - -#if BOOST_BEAST_DOXYGEN - /// A bidirectional iterator type that may be used to read elements. - using const_iterator = implementation_defined; - -#else - class const_iterator; - -#endif - - /// Move constructor. - buffers_prefix_view(buffers_prefix_view&&); - - /// Copy constructor. - buffers_prefix_view(buffers_prefix_view const&); - - /// Move assignment. - buffers_prefix_view& operator=(buffers_prefix_view&&); - - /// Copy assignment. - buffers_prefix_view& operator=(buffers_prefix_view const&); - - /** Construct a buffer sequence prefix. - - @param size The maximum number of bytes in the prefix. - If this is larger than the size of passed, buffers, - the resulting sequence will represent the entire - input sequence. - - @param buffers The buffer sequence to adapt. A copy of - the sequence will be made, but ownership of the underlying - memory is not transferred. - */ - buffers_prefix_view( - std::size_t size, - BufferSequence const& buffers); - - /** Construct a buffer sequence prefix in-place. - - @param size The maximum number of bytes in the prefix. - If this is larger than the size of passed, buffers, - the resulting sequence will represent the entire - input sequence. - - @param args Arguments forwarded to the contained buffers constructor. - */ - template<class... Args> - buffers_prefix_view( - std::size_t size, - boost::in_place_init_t, - Args&&... args); - - /// Get a bidirectional iterator to the first element. - const_iterator - begin() const; - - /// Get a bidirectional iterator to one past the last element. - const_iterator - end() const; -}; - -/** Returns a prefix of a constant buffer. - - The returned buffer points to the same memory as the - passed buffer, but with a size that is equal to or less - than the size of the original buffer. - - @param size The size of the returned buffer. - - @param buffer The buffer to shorten. The underlying - memory is not modified. - - @return A new buffer that points to the first `size` - bytes of the original buffer. -*/ -inline -boost::asio::const_buffer -buffers_prefix(std::size_t size, - boost::asio::const_buffer buffer) -{ - return {buffer.data(), - (std::min)(size, buffer.size())}; -} - -/** Returns a prefix of a mutable buffer. - - The returned buffer points to the same memory as the - passed buffer, but with a size that is equal to or less - than the size of the original buffer. - - @param size The size of the returned buffer. - - @param buffer The buffer to shorten. The underlying - memory is not modified. - - @return A new buffer that points to the first `size` bytes - of the original buffer. -*/ -inline -boost::asio::mutable_buffer -buffers_prefix(std::size_t size, - boost::asio::mutable_buffer buffer) -{ - return {buffer.data(), - (std::min)(size, buffer.size())}; -} - -/** Returns a prefix of a buffer sequence. - - This function returns a new buffer sequence which when iterated, - presents a shorter subset of the original list of buffers starting - with the first byte of the original sequence. - - @param size The maximum number of bytes in the wrapped - sequence. If this is larger than the size of passed, - buffers, the resulting sequence will represent the - entire input sequence. - - @param buffers An instance of @b ConstBufferSequence or - @b MutableBufferSequence to adapt. A copy of the sequence - will be made, but ownership of the underlying memory is - not transferred. -*/ -template<class BufferSequence> -#if BOOST_BEAST_DOXYGEN -buffers_prefix_view<BufferSequence> -#else -inline -typename std::enable_if< - ! std::is_same<BufferSequence, - boost::asio::const_buffer>::value && - ! std::is_same<BufferSequence, - boost::asio::mutable_buffer>::value, - buffers_prefix_view<BufferSequence>>::type -#endif -buffers_prefix(std::size_t size, BufferSequence const& buffers) -{ - static_assert( - boost::asio::is_const_buffer_sequence<BufferSequence>::value || - boost::asio::is_mutable_buffer_sequence<BufferSequence>::value, - "BufferSequence requirements not met"); - return buffers_prefix_view<BufferSequence>(size, buffers); -} - -/** Returns the first buffer in a buffer sequence - - This returns the first buffer in the buffer sequence. - If the buffer sequence is an empty range, the returned - buffer will have a zero buffer size. - - @param buffers The buffer sequence. If the sequence is - mutable, the returned buffer sequence will also be mutable. - Otherwise, the returned buffer sequence will be constant. -*/ -template<class BufferSequence> -typename std::conditional< - boost::asio::is_mutable_buffer_sequence<BufferSequence>::value, - boost::asio::mutable_buffer, - boost::asio::const_buffer>::type -buffers_front(BufferSequence const& buffers) -{ - auto const first = - boost::asio::buffer_sequence_begin(buffers); - if(first == boost::asio::buffer_sequence_end(buffers)) - return {}; - return *first; -} - -} // beast -} // boost - -#include <boost/beast/core/impl/buffers_prefix.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/buffers_suffix.hpp b/contrib/restricted/boost/boost/beast/core/buffers_suffix.hpp deleted file mode 100644 index 3959694577..0000000000 --- a/contrib/restricted/boost/boost/beast/core/buffers_suffix.hpp +++ /dev/null @@ -1,160 +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_BUFFERS_SUFFIX_HPP -#define BOOST_BEAST_BUFFERS_SUFFIX_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/optional.hpp> -#include <cstdint> -#include <iterator> -#include <utility> - -namespace boost { -namespace beast { - -/** Adapter to trim the front of a `BufferSequence`. - - This adapter wraps a buffer sequence to create a new sequence - which may be incrementally consumed. Bytes consumed are removed - from the front of the buffer. The underlying memory is not changed, - instead the adapter efficiently iterates through a subset of - the buffers wrapped. - - The wrapped buffer is not modified, a copy is made instead. - Ownership of the underlying memory is not transferred, the application - is still responsible for managing its lifetime. - - @tparam BufferSequence The buffer sequence to wrap. - - @par Example - - This function writes the entire contents of a buffer sequence - to the specified stream. - - @code - template<class SyncWriteStream, class ConstBufferSequence> - void send(SyncWriteStream& stream, ConstBufferSequence const& buffers) - { - buffers_suffix<ConstBufferSequence> bs{buffers}; - while(boost::asio::buffer_size(bs) > 0) - bs.consume(stream.write_some(bs)); - } - @endcode -*/ -template<class BufferSequence> -class buffers_suffix -{ - using buffers_type = - typename std::decay<BufferSequence>::type; - - using iter_type = typename - detail::buffer_sequence_iterator<buffers_type>::type; - - BufferSequence bs_; - iter_type begin_; - std::size_t skip_ = 0; - - template<class Deduced> - buffers_suffix(Deduced&& other, std::size_t dist) - : bs_(std::forward<Deduced>(other).bs_) - , begin_(std::next( - boost::asio::buffer_sequence_begin(bs_), - dist)) - , skip_(other.skip_) - { - } - -public: - /** The type for each element in the list of buffers. - - If the buffers in the underlying sequence are convertible to - `boost::asio::mutable_buffer`, then this type will be - `boost::asio::mutable_buffer`, else this type will be - `boost::asio::const_buffer`. - */ -#if BOOST_BEAST_DOXYGEN - using value_type = implementation_defined; -#else - using value_type = typename std::conditional< - std::is_convertible<typename - std::iterator_traits<iter_type>::value_type, - boost::asio::mutable_buffer>::value, - boost::asio::mutable_buffer, - boost::asio::const_buffer>::type; -#endif - -#if BOOST_BEAST_DOXYGEN - /// A bidirectional iterator type that may be used to read elements. - using const_iterator = implementation_defined; - -#else - class const_iterator; - -#endif - - /// Constructor - buffers_suffix(); - - /// Constructor - buffers_suffix(buffers_suffix&&); - - /// Constructor - buffers_suffix(buffers_suffix const&); - - /** Constructor - - A copy of the buffer sequence is made. Ownership of the - underlying memory is not transferred or copied. - */ - explicit - buffers_suffix(BufferSequence const& buffers); - - /** Constructor - - This constructs the buffer sequence in-place from - a list of arguments. - - @param args Arguments forwarded to the buffers constructor. - */ - template<class... Args> - buffers_suffix(boost::in_place_init_t, Args&&... args); - - /// Assignment - buffers_suffix& operator=(buffers_suffix&&); - - /// Assignment - buffers_suffix& operator=(buffers_suffix const&); - - /// Get a bidirectional iterator to the first element. - const_iterator - begin() const; - - /// Get a bidirectional iterator to one past the last element. - const_iterator - end() const; - - /** Remove bytes from the beginning of the sequence. - - @param amount The number of bytes to remove. If this is - larger than the number of bytes remaining, all the - bytes remaining are removed. - */ - void - consume(std::size_t amount); -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/buffers_suffix.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/buffers_to_string.hpp b/contrib/restricted/boost/boost/beast/core/buffers_to_string.hpp deleted file mode 100644 index aae3d3aa57..0000000000 --- a/contrib/restricted/boost/boost/beast/core/buffers_to_string.hpp +++ /dev/null @@ -1,59 +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_BUFFERS_TO_STRING_HPP -#define BOOST_BEAST_BUFFERS_TO_STRING_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <string> - -namespace boost { -namespace beast { - -/** Return a string representing the contents of a buffer sequence. - - This function returns a string representing an entire buffer - sequence. Nulls and unprintable characters in the buffer - sequence are inserted to the resulting string as-is. No - character conversions are performed. - - @param buffers The buffer sequence to convert - - @par Example - - This function writes a buffer sequence converted to a string - to `std::cout`. - - @code - template<class ConstBufferSequence> - void print(ConstBufferSequence const& buffers) - { - std::cout << buffers_to_string(buffers) << std::endl; - } - @endcode -*/ -template<class ConstBufferSequence> -std::string -buffers_to_string(ConstBufferSequence const& buffers) -{ - std::string result; - result.reserve(boost::asio::buffer_size(buffers)); - for(boost::asio::const_buffer buffer : - detail::buffers_range(buffers)) - result.append(reinterpret_cast< - char const*>(buffer.data()), buffer.size()); - return result; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/allocator.hpp b/contrib/restricted/boost/boost/beast/core/detail/allocator.hpp deleted file mode 100644 index e893f5c274..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/allocator.hpp +++ /dev/null @@ -1,42 +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_DETAIL_ALLOCATOR_HPP -#define BOOST_BEAST_DETAIL_ALLOCATOR_HPP - -#include <boost/config.hpp> -#ifdef BOOST_NO_CXX11_ALLOCATOR -#include <boost/container/allocator_traits.hpp> -#else -#include <memory> -#endif - -namespace boost { -namespace beast { -namespace detail { - -// This is a workaround for allocator_traits -// implementations which falsely claim C++11 -// compatibility. - -#ifdef BOOST_NO_CXX11_ALLOCATOR -template<class Alloc> -using allocator_traits = boost::container::allocator_traits<Alloc>; - -#else -template<class Alloc> -using allocator_traits = std::allocator_traits<Alloc>; - -#endif - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/base64.hpp b/contrib/restricted/boost/boost/beast/core/detail/base64.hpp deleted file mode 100644 index 6cb3f67a77..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/base64.hpp +++ /dev/null @@ -1,251 +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 -// - -/* - Portions from http://www.adp-gmbh.ch/cpp/common/base64.html - Copyright notice: - - base64.cpp and base64.h - - Copyright (C) 2004-2008 Rene Nyffenegger - - This source code is provided 'as-is', without any express or implied - warranty. In no event will the author be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this source code must not be misrepresented; you must not - claim that you wrote the original source code. If you use this source code - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original source code. - - 3. This notice may not be removed or altered from any source distribution. - - Rene Nyffenegger rene.nyffenegger@adp-gmbh.ch - -*/ - -#ifndef BOOST_BEAST_DETAIL_BASE64_HPP -#define BOOST_BEAST_DETAIL_BASE64_HPP - -#include <cctype> -#include <string> -#include <utility> - -namespace boost { -namespace beast { -namespace detail { - -namespace base64 { - -inline -char const* -get_alphabet() -{ - static char constexpr tab[] = { - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" - }; - return &tab[0]; -} - -inline -signed char const* -get_inverse() -{ - static signed char constexpr tab[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0-15 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16-31 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, // 32-47 - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, // 48-63 - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64-79 - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, // 80-95 - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111 - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, // 112-127 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128-143 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 144-159 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 160-175 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 176-191 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 192-207 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 208-223 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 224-239 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // 240-255 - }; - return &tab[0]; -} - - -/// Returns max chars needed to encode a base64 string -inline -std::size_t constexpr -encoded_size(std::size_t n) -{ - return 4 * ((n + 2) / 3); -} - -/// Returns max bytes needed to decode a base64 string -inline -std::size_t constexpr -decoded_size(std::size_t n) -{ - return n / 4 * 3; // requires n&3==0, smaller - //return 3 * n / 4; -} - -/** Encode a series of octets as a padded, base64 string. - - The resulting string will not be null terminated. - - @par Requires - - The memory pointed to by `out` points to valid memory - of at least `encoded_size(len)` bytes. - - @return The number of characters written to `out`. This - will exclude any null termination. -*/ -template<class = void> -std::size_t -encode(void* dest, void const* src, std::size_t len) -{ - char* out = static_cast<char*>(dest); - char const* in = static_cast<char const*>(src); - auto const tab = base64::get_alphabet(); - - for(auto n = len / 3; n--;) - { - *out++ = tab[ (in[0] & 0xfc) >> 2]; - *out++ = tab[((in[0] & 0x03) << 4) + ((in[1] & 0xf0) >> 4)]; - *out++ = tab[((in[2] & 0xc0) >> 6) + ((in[1] & 0x0f) << 2)]; - *out++ = tab[ in[2] & 0x3f]; - in += 3; - } - - switch(len % 3) - { - case 2: - *out++ = tab[ (in[0] & 0xfc) >> 2]; - *out++ = tab[((in[0] & 0x03) << 4) + ((in[1] & 0xf0) >> 4)]; - *out++ = tab[ (in[1] & 0x0f) << 2]; - *out++ = '='; - break; - - case 1: - *out++ = tab[ (in[0] & 0xfc) >> 2]; - *out++ = tab[((in[0] & 0x03) << 4)]; - *out++ = '='; - *out++ = '='; - break; - - case 0: - break; - } - - return out - static_cast<char*>(dest); -} - -/** Decode a padded base64 string into a series of octets. - - @par Requires - - The memory pointed to by `out` points to valid memory - of at least `decoded_size(len)` bytes. - - @return The number of octets written to `out`, and - the number of characters read from the input string, - expressed as a pair. -*/ -template<class = void> -std::pair<std::size_t, std::size_t> -decode(void* dest, char const* src, std::size_t len) -{ - char* out = static_cast<char*>(dest); - auto in = reinterpret_cast<unsigned char const*>(src); - unsigned char c3[3], c4[4]; - int i = 0; - int j = 0; - - auto const inverse = base64::get_inverse(); - - while(len-- && *in != '=') - { - auto const v = inverse[*in]; - if(v == -1) - break; - ++in; - c4[i] = v; - if(++i == 4) - { - c3[0] = (c4[0] << 2) + ((c4[1] & 0x30) >> 4); - c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2); - c3[2] = ((c4[2] & 0x3) << 6) + c4[3]; - - for(i = 0; i < 3; i++) - *out++ = c3[i]; - i = 0; - } - } - - if(i) - { - c3[0] = ( c4[0] << 2) + ((c4[1] & 0x30) >> 4); - c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2); - c3[2] = ((c4[2] & 0x3) << 6) + c4[3]; - - for(j = 0; j < i - 1; j++) - *out++ = c3[j]; - } - - return {out - static_cast<char*>(dest), - in - reinterpret_cast<unsigned char const*>(src)}; -} - -} // base64 - -template<class = void> -std::string -base64_encode (std::uint8_t const* data, - std::size_t len) -{ - std::string dest; - dest.resize(base64::encoded_size(len)); - dest.resize(base64::encode(&dest[0], data, len)); - return dest; -} - -inline -std::string -base64_encode(std::string const& s) -{ - return base64_encode (reinterpret_cast < - std::uint8_t const*> (s.data()), s.size()); -} - -template<class = void> -std::string -base64_decode(std::string const& data) -{ - std::string dest; - dest.resize(base64::decoded_size(data.size())); - auto const result = base64::decode( - &dest[0], data.data(), data.size()); - dest.resize(result.first); - return dest; -} - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/bind_handler.hpp b/contrib/restricted/boost/boost/beast/core/detail/bind_handler.hpp deleted file mode 100644 index 48046df923..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/bind_handler.hpp +++ /dev/null @@ -1,217 +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_DETAIL_BIND_HANDLER_HPP -#define BOOST_BEAST_DETAIL_BIND_HANDLER_HPP - -#include <boost/beast/core/detail/integer_sequence.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/core/ignore_unused.hpp> -#include <boost/is_placeholder.hpp> -#include <functional> -#include <utility> - -namespace boost { -namespace beast { -namespace detail { - -/* Nullary handler that calls Handler with bound arguments. - - The bound handler provides the same io_context execution - guarantees as the original handler. -*/ -template<class Handler, class... Args> -class bound_handler -{ - // Can't friend partial specializations, - // so we just friend the whole thing. - template<class T, class Executor> - friend struct boost::asio::associated_executor; - - using args_type = std::tuple< - typename std::decay<Args>::type...>; - - Handler h_; - args_type args_; - - template<class Arg, class Vals> - static - typename std::enable_if< - std::is_placeholder<typename - std::decay<Arg>::type>::value == 0 && - boost::is_placeholder<typename - std::decay<Arg>::type>::value == 0, - Arg&&>::type - extract(Arg&& arg, Vals& vals) - { - boost::ignore_unused(vals); - return arg; - } - - template<class Arg, class Vals> - static - typename std::enable_if< - std::is_placeholder<typename - std::decay<Arg>::type>::value != 0, - typename std::tuple_element< - std::is_placeholder< - typename std::decay<Arg>::type>::value - 1, - Vals>>::type::type&& - extract(Arg&&, Vals&& vals) - { - return std::get<std::is_placeholder< - typename std::decay<Arg>::type>::value - 1>( - std::forward<Vals>(vals)); - } - - template<class Arg, class Vals> - static - typename std::enable_if< - boost::is_placeholder<typename - std::decay<Arg>::type>::value != 0, - typename std::tuple_element< - boost::is_placeholder< - typename std::decay<Arg>::type>::value - 1, - Vals>>::type::type&& - extract(Arg&&, Vals&& vals) - { - return std::get<boost::is_placeholder< - typename std::decay<Arg>::type>::value - 1>( - std::forward<Vals>(vals)); - } - - template< - class ArgsTuple, - std::size_t... S> - static - void - invoke( - Handler& h, - ArgsTuple& args, - std::tuple<>&&, - index_sequence<S...>) - { - boost::ignore_unused(args); - h(std::get<S>(args)...); - } - - template< - class ArgsTuple, - class ValsTuple, - std::size_t... S> - static - void - invoke( - Handler& h, - ArgsTuple& args, - ValsTuple&& vals, - index_sequence<S...>) - { - boost::ignore_unused(args); - boost::ignore_unused(vals); - h(extract(std::get<S>(args), - std::forward<ValsTuple>(vals))...); - } - -public: - using result_type = void; - - using allocator_type = - boost::asio::associated_allocator_t<Handler>; - - bound_handler(bound_handler&&) = default; - bound_handler(bound_handler const&) = delete; - - template<class DeducedHandler> - explicit - bound_handler( - DeducedHandler&& handler, Args&&... args) - : h_(std::forward<DeducedHandler>(handler)) - , args_(std::forward<Args>(args)...) - { - } - - allocator_type - get_allocator() const noexcept - { - return (boost::asio::get_associated_allocator)(h_); - } - - friend - bool - asio_handler_is_continuation(bound_handler* h) - { - using boost::asio::asio_handler_is_continuation; - return asio_handler_is_continuation(std::addressof(h->h_)); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, bound_handler* h) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(h->h_)); - } - - template<class... Values> - void - operator()(Values&&... values) - { - invoke(h_, args_, - std::forward_as_tuple( - std::forward<Values>(values)...), - index_sequence_for<Args...>()); - } - - template<class... Values> - void - operator()(Values&&... values) const - { - invoke(h_, args_, - std::forward_as_tuple( - std::forward<Values>(values)...), - index_sequence_for<Args...>()); - } -}; - -} // detail -} // beast - -namespace asio { -template<class Handler, class... Args, class Executor> -struct associated_executor< - beast::detail::bound_handler<Handler, Args...>, Executor> -{ - using type = typename - associated_executor<Handler, Executor>::type; - - static - type - get(beast::detail::bound_handler<Handler, Args...> const& h, - Executor const& ex = Executor()) noexcept - { - return associated_executor< - Handler, Executor>::get(h.h_, ex); - } -}; -} // asio - -} // boost - -namespace std { -template<class Handler, class... Args> -void -bind(boost::beast::detail::bound_handler< - Handler, Args...>, ...) = delete; -} // std - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/buffers_ref.hpp b/contrib/restricted/boost/boost/beast/core/detail/buffers_ref.hpp deleted file mode 100644 index e56a9764fd..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/buffers_ref.hpp +++ /dev/null @@ -1,67 +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_DETAIL_BUFFERS_REF_HPP -#define BOOST_BEAST_DETAIL_BUFFERS_REF_HPP - -#include <boost/beast/core/type_traits.hpp> -#include <iterator> - -namespace boost { -namespace beast { -namespace detail { - -// A very lightweight reference to a buffer sequence -template<class BufferSequence> -class buffers_ref -{ - BufferSequence const* buffers_; - -public: - using const_iterator = typename - buffer_sequence_iterator<BufferSequence>::type; - - using value_type = typename std::iterator_traits< - const_iterator>::value_type; - - buffers_ref(buffers_ref const&) = default; - buffers_ref& operator=(buffers_ref const&) = default; - - explicit - buffers_ref(BufferSequence const& buffers) - : buffers_(std::addressof(buffers)) - { - } - - const_iterator - begin() const - { - return boost::asio::buffer_sequence_begin(*buffers_); - } - - const_iterator - end() const - { - return boost::asio::buffer_sequence_end(*buffers_); - } -}; - -// Return a reference to a buffer sequence -template<class BufferSequence> -buffers_ref<BufferSequence> -make_buffers_ref(BufferSequence const& buffers) -{ - return buffers_ref<BufferSequence>(buffers); -} - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/clamp.hpp b/contrib/restricted/boost/boost/beast/core/detail/clamp.hpp deleted file mode 100644 index 95a8fab425..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/clamp.hpp +++ /dev/null @@ -1,59 +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_CLAMP_HPP -#define BOOST_BEAST_CORE_DETAIL_CLAMP_HPP - -#include <cstdlib> -#include <limits> -#include <type_traits> - -namespace boost { -namespace beast { -namespace detail { - -template<class UInt> -static -std::size_t -clamp(UInt x) -{ - if(x >= (std::numeric_limits<std::size_t>::max)()) - return (std::numeric_limits<std::size_t>::max)(); - return static_cast<std::size_t>(x); -} - -template<class UInt> -static -std::size_t -clamp(UInt x, std::size_t limit) -{ - if(x >= limit) - return limit; - return static_cast<std::size_t>(x); -} - -// return `true` if x + y > z, which are unsigned -template< - class U1, class U2, class U3> -constexpr -bool -sum_exceeds(U1 x, U2 y, U3 z) -{ - static_assert( - std::is_unsigned<U1>::value && - std::is_unsigned<U2>::value && - std::is_unsigned<U3>::value, ""); - return y > z || x > z - y; -} - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/config.hpp b/contrib/restricted/boost/boost/beast/core/detail/config.hpp deleted file mode 100644 index 68e3dda8ee..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/config.hpp +++ /dev/null @@ -1,54 +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_CONFIG_HPP -#define BOOST_BEAST_CORE_DETAIL_CONFIG_HPP - -#include <boost/config.hpp> -#include <boost/version.hpp> - -// Available to every header -#include <boost/config.hpp> -#include <boost/core/ignore_unused.hpp> -#include <boost/static_assert.hpp> - -/* - _MSC_VER and _MSC_FULL_VER by version: - - 14.0 (2015) 1900 190023026 - 14.0 (2015 Update 1) 1900 190023506 - 14.0 (2015 Update 2) 1900 190023918 - 14.0 (2015 Update 3) 1900 190024210 -*/ - -#if defined(BOOST_MSVC) -# if BOOST_MSVC_FULL_VER < 190024210 -# error Beast requires C++11: Visual Studio 2015 Update 3 or later needed -# endif - -#elif defined(BOOST_GCC) -# if(BOOST_GCC < 40801) -# error Beast requires C++11: gcc version 4.8 or later needed -# endif - -#else -# if \ - defined(BOOST_NO_CXX11_DECLTYPE) || \ - defined(BOOST_NO_CXX11_HDR_TUPLE) || \ - defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) || \ - defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) -# error Beast requires C++11: a conforming compiler is needed -# endif - -#endif - -#define BOOST_BEAST_DEPRECATION_STRING \ - "This is a deprecated interface, #define BOOST_BEAST_ALLOW_DEPRECATED to allow it" - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/cpu_info.hpp b/contrib/restricted/boost/boost/beast/core/detail/cpu_info.hpp deleted file mode 100644 index 579589fa8e..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/cpu_info.hpp +++ /dev/null @@ -1,99 +0,0 @@ -// -// Copyright (c) 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_DETAIL_CPU_INFO_HPP -#define BOOST_BEAST_DETAIL_CPU_INFO_HPP - -#include <boost/config.hpp> - -#ifndef BOOST_BEAST_NO_INTRINSICS -# if defined(BOOST_MSVC) || ((defined(BOOST_GCC) || defined(BOOST_CLANG)) && defined(__SSE4_2__)) -# define BOOST_BEAST_NO_INTRINSICS 0 -# else -# define BOOST_BEAST_NO_INTRINSICS 1 -# endif -#endif - -#if ! BOOST_BEAST_NO_INTRINSICS - -#ifdef BOOST_MSVC -#include <intrin.h> // __cpuid -#else -#include <cpuid.h> // __get_cpuid -#endif - -namespace boost { -namespace beast { -namespace detail { - -/* Portions from Boost, - Copyright Andrey Semashev 2007 - 2015. -*/ -template<class = void> -void -cpuid( - std::uint32_t id, - std::uint32_t& eax, - std::uint32_t& ebx, - std::uint32_t& ecx, - std::uint32_t& edx) -{ -#ifdef BOOST_MSVC - int regs[4]; - __cpuid(regs, id); - eax = regs[0]; - ebx = regs[1]; - ecx = regs[2]; - edx = regs[3]; -#else - __get_cpuid(id, &eax, &ebx, &ecx, &edx); -#endif -} - -struct cpu_info -{ - bool sse42 = false; - - cpu_info(); -}; - -inline -cpu_info:: -cpu_info() -{ - constexpr std::uint32_t SSE42 = 1 << 20; - - std::uint32_t eax = 0; - std::uint32_t ebx = 0; - std::uint32_t ecx = 0; - std::uint32_t edx = 0; - - cpuid(0, eax, ebx, ecx, edx); - if(eax >= 1) - { - cpuid(1, eax, ebx, ecx, edx); - sse42 = (ecx & SSE42) != 0; - } -} - -template<class = void> -cpu_info const& -get_cpu_info() -{ - static cpu_info const ci; - return ci; -} - -} // detail -} // beast -} // boost - -#endif - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/empty_base_optimization.hpp b/contrib/restricted/boost/boost/beast/core/detail/empty_base_optimization.hpp deleted file mode 100644 index b1e728b674..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/empty_base_optimization.hpp +++ /dev/null @@ -1,100 +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_DETAIL_EMPTY_BASE_OPTIMIZATION_HPP -#define BOOST_BEAST_DETAIL_EMPTY_BASE_OPTIMIZATION_HPP - -#include <boost/type_traits/is_final.hpp> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace detail { - -template<class T> -struct is_empty_base_optimization_derived - : std::integral_constant<bool, - std::is_empty<T>::value && - ! boost::is_final<T>::value> -{ -}; - -template<class T, int UniqueID = 0, - bool isDerived = - is_empty_base_optimization_derived<T>::value> -class empty_base_optimization : private T -{ -public: - empty_base_optimization() = default; - empty_base_optimization(empty_base_optimization&&) = default; - empty_base_optimization(empty_base_optimization const&) = default; - empty_base_optimization& operator=(empty_base_optimization&&) = default; - empty_base_optimization& operator=(empty_base_optimization const&) = default; - - template<class Arg1, class... ArgN> - explicit - empty_base_optimization(Arg1&& arg1, ArgN&&... argn) - : T(std::forward<Arg1>(arg1), - std::forward<ArgN>(argn)...) - { - } - - T& member() noexcept - { - return *this; - } - - T const& member() const noexcept - { - return *this; - } -}; - -//------------------------------------------------------------------------------ - -template< - class T, - int UniqueID -> -class empty_base_optimization <T, UniqueID, false> -{ - T t_; - -public: - empty_base_optimization() = default; - empty_base_optimization(empty_base_optimization&&) = default; - empty_base_optimization(empty_base_optimization const&) = default; - empty_base_optimization& operator=(empty_base_optimization&&) = default; - empty_base_optimization& operator=(empty_base_optimization const&) = default; - - template<class Arg1, class... ArgN> - explicit - empty_base_optimization(Arg1&& arg1, ArgN&&... argn) - : t_(std::forward<Arg1>(arg1), - std::forward<ArgN>(argn)...) - { - } - - T& member() noexcept - { - return t_; - } - - T const& member() const noexcept - { - return t_; - } -}; - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/integer_sequence.hpp b/contrib/restricted/boost/boost/beast/core/detail/integer_sequence.hpp deleted file mode 100644 index 71664229af..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/integer_sequence.hpp +++ /dev/null @@ -1,143 +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_DETAIL_INTEGER_SEQUENCE_HPP -#define BOOST_BEAST_DETAIL_INTEGER_SEQUENCE_HPP - -#include <boost/config.hpp> -#include <cstddef> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace detail { - -template<class T, T... Ints> -struct integer_sequence -{ - using value_type = T; - BOOST_STATIC_ASSERT(std::is_integral<T>::value); - - static std::size_t constexpr static_size = sizeof...(Ints); - - static std::size_t constexpr size() - { - return sizeof...(Ints); - } -}; - -template<std::size_t... Ints> -using index_sequence = integer_sequence<std::size_t, Ints...>; - -// This workaround is needed for broken sizeof... -template<class... Args> -struct sizeof_workaround -{ - static std::size_t constexpr size = sizeof... (Args); -}; - -#ifdef BOOST_MSVC - -// This implementation compiles on real MSVC and clang but not gcc - -template<class T, unsigned long long N, class Seq> -struct make_integer_sequence_unchecked; - -template<class T, unsigned long long N, unsigned long long ...Indices> -struct make_integer_sequence_unchecked< - T, N, integer_sequence<T, Indices...>> -{ - using type = typename make_integer_sequence_unchecked< - T, N-1, integer_sequence<T, N-1, Indices...>>::type; -}; - -template<class T, unsigned long long ...Indices> -struct make_integer_sequence_unchecked< - T, 0, integer_sequence<T, Indices...>> -{ - using type = integer_sequence<T, Indices...>; -}; - -template<class T, T N> -struct make_integer_sequence_checked -{ - BOOST_STATIC_ASSERT(std::is_integral<T>::value); - BOOST_STATIC_ASSERT(N >= 0); - - using type = typename make_integer_sequence_unchecked< - T, N, integer_sequence<T>>::type; -}; - -template<class T, T N> -using make_integer_sequence = - typename make_integer_sequence_checked<T, N>::type; - -template<std::size_t N> -using make_index_sequence = make_integer_sequence<std::size_t, N>; - -template<class... Args> -using index_sequence_for = - make_index_sequence<sizeof_workaround<Args...>::size>; - -#else - -// This implementation compiles on gcc but not MSVC - -template<std::size_t... Ints> -struct index_tuple -{ - using next = index_tuple<Ints..., sizeof... (Ints)>; - -}; - -template<std::size_t N> -struct build_index_tuple -{ - using type = typename build_index_tuple<N-1>::type::next; -}; - -template<> -struct build_index_tuple<0> -{ - using type = index_tuple<>; -}; - -template<class T, T N, - class Seq = typename build_index_tuple<N>::type -> -struct integer_sequence_helper; - -template<class T, T N, std::size_t... Ints> -struct integer_sequence_helper<T, N, index_tuple<Ints...>> -{ - BOOST_STATIC_ASSERT(std::is_integral<T>::value); - BOOST_STATIC_ASSERT(N >= 0); - - using type = integer_sequence<T, static_cast<T> (Ints)...>; -}; - -template<class T, T N> -using make_integer_sequence = - typename integer_sequence_helper<T, N>::type; - -template<std::size_t N> -using make_index_sequence = make_integer_sequence<std::size_t, N>; - -template<class... Args> -using index_sequence_for = - make_index_sequence<sizeof_workaround<Args...>::size>; - -#endif - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/ostream.hpp b/contrib/restricted/boost/boost/beast/core/detail/ostream.hpp deleted file mode 100644 index 8d6eb94f51..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/ostream.hpp +++ /dev/null @@ -1,319 +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_DETAIL_OSTREAM_HPP -#define BOOST_BEAST_DETAIL_OSTREAM_HPP - -#include <boost/beast/core/buffers_prefix.hpp> -#include <boost/beast/core/read_size.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <memory> -#include <iosfwd> -#include <streambuf> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace detail { - -template<class Buffers> -class buffers_helper -{ - Buffers b_; - -public: - explicit - buffers_helper(Buffers const& b) - : b_(b) - { - } - - template<class B> - friend - std::ostream& - operator<<(std::ostream& os, - buffers_helper<B> const& v); -}; - -template<class Buffers> -std::ostream& -operator<<(std::ostream& os, - buffers_helper<Buffers> const& v) -{ - for(auto b : buffers_range(v.b_)) - os.write( - reinterpret_cast<char const*>(b.data()), - b.size()); - return os; -} - -//------------------------------------------------------------------------------ - -struct basic_streambuf_movable_helper : - std::basic_streambuf<char, std::char_traits<char>> -{ - basic_streambuf_movable_helper( - basic_streambuf_movable_helper&&) = default; -}; - -using basic_streambuf_movable = - std::is_move_constructible<basic_streambuf_movable_helper>; - -//------------------------------------------------------------------------------ - -template<class DynamicBuffer, - class CharT, class Traits, bool isMovable> -class ostream_buffer; - -template<class DynamicBuffer, class CharT, class Traits> -class ostream_buffer - <DynamicBuffer, CharT, Traits, true> - : public std::basic_streambuf<CharT, Traits> -{ - using int_type = typename - std::basic_streambuf<CharT, Traits>::int_type; - - using traits_type = typename - std::basic_streambuf<CharT, Traits>::traits_type; - - static std::size_t constexpr max_size = 512; - - DynamicBuffer& buf_; - -public: - ostream_buffer(ostream_buffer&&) = default; - ostream_buffer(ostream_buffer const&) = delete; - - ~ostream_buffer() noexcept - { - sync(); - } - - explicit - ostream_buffer(DynamicBuffer& buf) - : buf_(buf) - { - prepare(); - } - - int_type - overflow(int_type ch) override - { - if(! Traits::eq_int_type(ch, Traits::eof())) - { - Traits::assign(*this->pptr(), - static_cast<CharT>(ch)); - flush(1); - prepare(); - return ch; - } - flush(); - return traits_type::eof(); - } - - int - sync() override - { - flush(); - prepare(); - return 0; - } - -private: - void - prepare() - { - auto bs = buf_.prepare( - read_size_or_throw(buf_, max_size)); - auto const b = buffers_front(bs); - auto const p = reinterpret_cast<CharT*>(b.data()); - this->setp(p, - p + b.size() / sizeof(CharT) - 1); - } - - void - flush(int extra = 0) - { - buf_.commit( - (this->pptr() - this->pbase() + extra) * - sizeof(CharT)); - } -}; - -// This nonsense is all to work around a glitch in libstdc++ -// where std::basic_streambuf copy constructor is private: -// https://github.com/gcc-mirror/gcc/blob/gcc-4_8-branch/libstdc%2B%2B-v3/include/std/streambuf#L799 - -template<class DynamicBuffer, class CharT, class Traits> -class ostream_buffer - <DynamicBuffer, CharT, Traits, false> - : public std::basic_streambuf<CharT, Traits> -{ - using int_type = typename - std::basic_streambuf<CharT, Traits>::int_type; - - using traits_type = typename - std::basic_streambuf<CharT, Traits>::traits_type; - - static std::size_t constexpr max_size = 512; - - DynamicBuffer& buf_; - -public: - ostream_buffer(ostream_buffer&&) = delete; - ostream_buffer(ostream_buffer const&) = delete; - - ~ostream_buffer() noexcept - { - sync(); - } - - explicit - ostream_buffer(DynamicBuffer& buf) - : buf_(buf) - { - prepare(); - } - - int_type - overflow(int_type ch) override - { - if(! Traits::eq_int_type(ch, Traits::eof())) - { - Traits::assign(*this->pptr(), - static_cast<CharT>(ch)); - flush(1); - prepare(); - return ch; - } - flush(); - return traits_type::eof(); - } - - int - sync() override - { - flush(); - prepare(); - return 0; - } - -private: - void - prepare() - { - auto bs = buf_.prepare( - read_size_or_throw(buf_, max_size)); - auto const b = buffers_front(bs); - auto const p = reinterpret_cast<CharT*>(b.data()); - this->setp(p, - p + b.size() / sizeof(CharT) - 1); - } - - void - flush(int extra = 0) - { - buf_.commit( - (this->pptr() - this->pbase() + extra) * - sizeof(CharT)); - } -}; - -//------------------------------------------------------------------------------ - -template<class DynamicBuffer, - class CharT, class Traits, bool isMovable> -class ostream_helper; - -template<class DynamicBuffer, class CharT, class Traits> -class ostream_helper< - DynamicBuffer, CharT, Traits, true> - : public std::basic_ostream<CharT, Traits> -{ - ostream_buffer< - DynamicBuffer, CharT, Traits, true> osb_; - -public: - explicit - ostream_helper(DynamicBuffer& buf); - - ostream_helper(ostream_helper&& other); -}; - -template<class DynamicBuffer, class CharT, class Traits> -ostream_helper<DynamicBuffer, CharT, Traits, true>:: -ostream_helper(DynamicBuffer& buf) - : std::basic_ostream<CharT, Traits>( - &this->osb_) - , osb_(buf) -{ -} - -template<class DynamicBuffer, class CharT, class Traits> -ostream_helper<DynamicBuffer, CharT, Traits, true>:: -ostream_helper( - ostream_helper&& other) - : std::basic_ostream<CharT, Traits>(&osb_) - , osb_(std::move(other.osb_)) -{ -} - -// This work-around is for libstdc++ versions that -// don't have a movable std::basic_streambuf - -template<class T> -class ostream_helper_base -{ -protected: - std::unique_ptr<T> member; - - ostream_helper_base( - ostream_helper_base&&) = default; - - explicit - ostream_helper_base(T* t) - : member(t) - { - } -}; - -template<class DynamicBuffer, class CharT, class Traits> -class ostream_helper< - DynamicBuffer, CharT, Traits, false> - : private ostream_helper_base<ostream_buffer< - DynamicBuffer, CharT, Traits, false>> - , public std::basic_ostream<CharT, Traits> -{ -public: - explicit - ostream_helper(DynamicBuffer& buf) - : ostream_helper_base<ostream_buffer< - DynamicBuffer, CharT, Traits, false>>( - new ostream_buffer<DynamicBuffer, - CharT, Traits, false>(buf)) - , std::basic_ostream<CharT, Traits>(this->member.get()) - { - } - - ostream_helper(ostream_helper&& other) - : ostream_helper_base<ostream_buffer< - DynamicBuffer, CharT, Traits, false>>( - std::move(other)) - , std::basic_ostream<CharT, Traits>(this->member.get()) - { - } -}; - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/sha1.hpp b/contrib/restricted/boost/boost/beast/core/detail/sha1.hpp deleted file mode 100644 index 336da2a0f2..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/sha1.hpp +++ /dev/null @@ -1,313 +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_DETAIL_SHA1_HPP -#define BOOST_BEAST_DETAIL_SHA1_HPP - -#include <algorithm> -#include <cstdint> -#include <cstring> - -// Based on https://github.com/vog/sha1 -/* - Original authors: - Steve Reid (Original C Code) - Bruce Guenter (Small changes to fit into bglibs) - Volker Grabsch (Translation to simpler C++ Code) - Eugene Hopkinson (Safety improvements) - Vincent Falco (beast adaptation) -*/ - -namespace boost { -namespace beast { -namespace detail { - -namespace sha1 { - -static std::size_t constexpr BLOCK_INTS = 16; -static std::size_t constexpr BLOCK_BYTES = 64; -static std::size_t constexpr DIGEST_BYTES = 20; - -inline -std::uint32_t -rol(std::uint32_t value, std::size_t bits) -{ - return (value << bits) | (value >> (32 - bits)); -} - -inline -std::uint32_t -blk(std::uint32_t block[BLOCK_INTS], std::size_t i) -{ - return rol( - block[(i+13)&15] ^ block[(i+8)&15] ^ - block[(i+2)&15] ^ block[i], 1); -} - -inline -void -R0(std::uint32_t block[BLOCK_INTS], std::uint32_t v, - std::uint32_t &w, std::uint32_t x, std::uint32_t y, - std::uint32_t &z, std::size_t i) -{ - z += ((w&(x^y))^y) + block[i] + 0x5a827999 + rol(v, 5); - w = rol(w, 30); -} - - -inline -void -R1(std::uint32_t block[BLOCK_INTS], std::uint32_t v, - std::uint32_t &w, std::uint32_t x, std::uint32_t y, - std::uint32_t &z, std::size_t i) -{ - block[i] = blk(block, i); - z += ((w&(x^y))^y) + block[i] + 0x5a827999 + rol(v, 5); - w = rol(w, 30); -} - -inline -void -R2(std::uint32_t block[BLOCK_INTS], std::uint32_t v, - std::uint32_t &w, std::uint32_t x, std::uint32_t y, - std::uint32_t &z, std::size_t i) -{ - block[i] = blk(block, i); - z += (w^x^y) + block[i] + 0x6ed9eba1 + rol(v, 5); - w = rol(w, 30); -} - -inline -void -R3(std::uint32_t block[BLOCK_INTS], std::uint32_t v, - std::uint32_t &w, std::uint32_t x, std::uint32_t y, - std::uint32_t &z, std::size_t i) -{ - block[i] = blk(block, i); - z += (((w|x)&y)|(w&x)) + block[i] + 0x8f1bbcdc + rol(v, 5); - w = rol(w, 30); -} - -inline -void -R4(std::uint32_t block[BLOCK_INTS], std::uint32_t v, - std::uint32_t &w, std::uint32_t x, std::uint32_t y, - std::uint32_t &z, std::size_t i) -{ - block[i] = blk(block, i); - z += (w^x^y) + block[i] + 0xca62c1d6 + rol(v, 5); - w = rol(w, 30); -} - -inline -void -make_block(std::uint8_t const* p, - std::uint32_t block[BLOCK_INTS]) -{ - for(std::size_t i = 0; i < BLOCK_INTS; i++) - block[i] = - (static_cast<std::uint32_t>(p[4*i+3])) | - (static_cast<std::uint32_t>(p[4*i+2]))<< 8 | - (static_cast<std::uint32_t>(p[4*i+1]))<<16 | - (static_cast<std::uint32_t>(p[4*i+0]))<<24; -} - -template<class = void> -void -transform( - std::uint32_t digest[], std::uint32_t block[BLOCK_INTS]) -{ - std::uint32_t a = digest[0]; - std::uint32_t b = digest[1]; - std::uint32_t c = digest[2]; - std::uint32_t d = digest[3]; - std::uint32_t e = digest[4]; - - R0(block, a, b, c, d, e, 0); - R0(block, e, a, b, c, d, 1); - R0(block, d, e, a, b, c, 2); - R0(block, c, d, e, a, b, 3); - R0(block, b, c, d, e, a, 4); - R0(block, a, b, c, d, e, 5); - R0(block, e, a, b, c, d, 6); - R0(block, d, e, a, b, c, 7); - R0(block, c, d, e, a, b, 8); - R0(block, b, c, d, e, a, 9); - R0(block, a, b, c, d, e, 10); - R0(block, e, a, b, c, d, 11); - R0(block, d, e, a, b, c, 12); - R0(block, c, d, e, a, b, 13); - R0(block, b, c, d, e, a, 14); - R0(block, a, b, c, d, e, 15); - R1(block, e, a, b, c, d, 0); - R1(block, d, e, a, b, c, 1); - R1(block, c, d, e, a, b, 2); - R1(block, b, c, d, e, a, 3); - R2(block, a, b, c, d, e, 4); - R2(block, e, a, b, c, d, 5); - R2(block, d, e, a, b, c, 6); - R2(block, c, d, e, a, b, 7); - R2(block, b, c, d, e, a, 8); - R2(block, a, b, c, d, e, 9); - R2(block, e, a, b, c, d, 10); - R2(block, d, e, a, b, c, 11); - R2(block, c, d, e, a, b, 12); - R2(block, b, c, d, e, a, 13); - R2(block, a, b, c, d, e, 14); - R2(block, e, a, b, c, d, 15); - R2(block, d, e, a, b, c, 0); - R2(block, c, d, e, a, b, 1); - R2(block, b, c, d, e, a, 2); - R2(block, a, b, c, d, e, 3); - R2(block, e, a, b, c, d, 4); - R2(block, d, e, a, b, c, 5); - R2(block, c, d, e, a, b, 6); - R2(block, b, c, d, e, a, 7); - R3(block, a, b, c, d, e, 8); - R3(block, e, a, b, c, d, 9); - R3(block, d, e, a, b, c, 10); - R3(block, c, d, e, a, b, 11); - R3(block, b, c, d, e, a, 12); - R3(block, a, b, c, d, e, 13); - R3(block, e, a, b, c, d, 14); - R3(block, d, e, a, b, c, 15); - R3(block, c, d, e, a, b, 0); - R3(block, b, c, d, e, a, 1); - R3(block, a, b, c, d, e, 2); - R3(block, e, a, b, c, d, 3); - R3(block, d, e, a, b, c, 4); - R3(block, c, d, e, a, b, 5); - R3(block, b, c, d, e, a, 6); - R3(block, a, b, c, d, e, 7); - R3(block, e, a, b, c, d, 8); - R3(block, d, e, a, b, c, 9); - R3(block, c, d, e, a, b, 10); - R3(block, b, c, d, e, a, 11); - R4(block, a, b, c, d, e, 12); - R4(block, e, a, b, c, d, 13); - R4(block, d, e, a, b, c, 14); - R4(block, c, d, e, a, b, 15); - R4(block, b, c, d, e, a, 0); - R4(block, a, b, c, d, e, 1); - R4(block, e, a, b, c, d, 2); - R4(block, d, e, a, b, c, 3); - R4(block, c, d, e, a, b, 4); - R4(block, b, c, d, e, a, 5); - R4(block, a, b, c, d, e, 6); - R4(block, e, a, b, c, d, 7); - R4(block, d, e, a, b, c, 8); - R4(block, c, d, e, a, b, 9); - R4(block, b, c, d, e, a, 10); - R4(block, a, b, c, d, e, 11); - R4(block, e, a, b, c, d, 12); - R4(block, d, e, a, b, c, 13); - R4(block, c, d, e, a, b, 14); - R4(block, b, c, d, e, a, 15); - - digest[0] += a; - digest[1] += b; - digest[2] += c; - digest[3] += d; - digest[4] += e; -} - -} // sha1 - -struct sha1_context -{ - static unsigned int constexpr block_size = sha1::BLOCK_BYTES; - static unsigned int constexpr digest_size = 20; - - std::size_t buflen; - std::size_t blocks; - std::uint32_t digest[5]; - std::uint8_t buf[block_size]; -}; - -template<class = void> -void -init(sha1_context& ctx) noexcept -{ - ctx.buflen = 0; - ctx.blocks = 0; - ctx.digest[0] = 0x67452301; - ctx.digest[1] = 0xefcdab89; - ctx.digest[2] = 0x98badcfe; - ctx.digest[3] = 0x10325476; - ctx.digest[4] = 0xc3d2e1f0; -} - -template<class = void> -void -update(sha1_context& ctx, - void const* message, std::size_t size) noexcept -{ - auto p = reinterpret_cast< - std::uint8_t const*>(message); - for(;;) - { - auto const n = (std::min)( - size, sizeof(ctx.buf) - ctx.buflen); - std::memcpy(ctx.buf + ctx.buflen, p, n); - ctx.buflen += n; - if(ctx.buflen != 64) - return; - p += n; - size -= n; - ctx.buflen = 0; - std::uint32_t block[sha1::BLOCK_INTS]; - sha1::make_block(ctx.buf, block); - sha1::transform(ctx.digest, block); - ++ctx.blocks; - } -} - -template<class = void> -void -finish(sha1_context& ctx, void* digest) noexcept -{ - using sha1::BLOCK_INTS; - using sha1::BLOCK_BYTES; - - std::uint64_t total_bits = - (ctx.blocks*64 + ctx.buflen) * 8; - // pad - ctx.buf[ctx.buflen++] = 0x80; - auto const buflen = ctx.buflen; - while(ctx.buflen < 64) - ctx.buf[ctx.buflen++] = 0x00; - std::uint32_t block[BLOCK_INTS]; - sha1::make_block(ctx.buf, block); - if(buflen > BLOCK_BYTES - 8) - { - sha1::transform(ctx.digest, block); - for(size_t i = 0; i < BLOCK_INTS - 2; i++) - block[i] = 0; - } - - /* Append total_bits, split this uint64_t into two uint32_t */ - block[BLOCK_INTS - 1] = total_bits & 0xffffffff; - block[BLOCK_INTS - 2] = (total_bits >> 32); - sha1::transform(ctx.digest, block); - for(std::size_t i = 0; i < sha1::DIGEST_BYTES/4; i++) - { - std::uint8_t* d = - reinterpret_cast<std::uint8_t*>(digest) + 4 * i; - d[3] = ctx.digest[i] & 0xff; - d[2] = (ctx.digest[i] >> 8) & 0xff; - d[1] = (ctx.digest[i] >> 16) & 0xff; - d[0] = (ctx.digest[i] >> 24) & 0xff; - } -} - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/static_ostream.hpp b/contrib/restricted/boost/boost/beast/core/detail/static_ostream.hpp deleted file mode 100644 index cb5a00b3da..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/static_ostream.hpp +++ /dev/null @@ -1,142 +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_DETAIL_STATIC_OSTREAM_HPP -#define BOOST_BEAST_DETAIL_STATIC_OSTREAM_HPP - -#include <locale> -#include <ostream> -#include <streambuf> - -namespace boost { -namespace beast { -namespace detail { - -// http://www.mr-edd.co.uk/blog/beginners_guide_streambuf - -class static_ostream_buffer - : public std::basic_streambuf<char> -{ - using CharT = char; - using Traits = std::char_traits<CharT>; - using int_type = typename - std::basic_streambuf<CharT, Traits>::int_type; - using traits_type = typename - std::basic_streambuf<CharT, Traits>::traits_type; - - char* data_; - std::size_t size_; - std::size_t len_ = 0; - std::string s_; - -public: - static_ostream_buffer(static_ostream_buffer&&) = delete; - static_ostream_buffer(static_ostream_buffer const&) = delete; - - static_ostream_buffer(char* data, std::size_t size) - : data_(data) - , size_(size) - { - this->setp(data_, data_ + size - 1); - } - - ~static_ostream_buffer() noexcept - { - } - - string_view - str() const - { - if(! s_.empty()) - return {s_.data(), len_}; - return {data_, len_}; - } - - int_type - overflow(int_type ch) override - { - if(! Traits::eq_int_type(ch, Traits::eof())) - { - Traits::assign(*this->pptr(), - static_cast<CharT>(ch)); - flush(1); - prepare(); - return ch; - } - flush(); - return traits_type::eof(); - } - - int - sync() override - { - flush(); - prepare(); - return 0; - } - -private: - void - prepare() - { - static auto const growth_factor = 1.5; - - if(len_ < size_ - 1) - { - this->setp( - data_ + len_, data_ + size_ - 2); - return; - } - if(s_.empty()) - { - s_.resize(static_cast<std::size_t>( - growth_factor * len_)); - Traits::copy(&s_[0], data_, len_); - } - else - { - s_.resize(static_cast<std::size_t>( - growth_factor * len_)); - } - this->setp(&s_[len_], &s_[len_] + - s_.size() - len_ - 1); - } - - void - flush(int extra = 0) - { - len_ += static_cast<std::size_t>( - this->pptr() - this->pbase() + extra); - } -}; - -class static_ostream : public std::basic_ostream<char> -{ - static_ostream_buffer osb_; - -public: - static_ostream(char* data, std::size_t size) - : std::basic_ostream<char>(&this->osb_) - , osb_(data, size) - { - imbue(std::locale::classic()); - } - - string_view - str() const - { - return osb_.str(); - } -}; - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/static_string.hpp b/contrib/restricted/boost/boost/beast/core/detail/static_string.hpp deleted file mode 100644 index a5384591ff..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/static_string.hpp +++ /dev/null @@ -1,135 +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_DETAIL_STATIC_STRING_HPP -#define BOOST_BEAST_DETAIL_STATIC_STRING_HPP - -#include <boost/beast/core/string.hpp> -#include <boost/assert.hpp> -#include <iterator> -#include <type_traits> - -namespace boost { -namespace beast { -namespace detail { - -// Because k-ballo said so -template<class T> -using is_input_iterator = - std::integral_constant<bool, - ! std::is_integral<T>::value>; - -template<class CharT, class Traits> -int -lexicographical_compare( - CharT const* s1, std::size_t n1, - CharT const* s2, std::size_t n2) -{ - if(n1 < n2) - return Traits::compare( - s1, s2, n1) <= 0 ? -1 : 1; - if(n1 > n2) - return Traits::compare( - s1, s2, n2) >= 0 ? 1 : -1; - return Traits::compare(s1, s2, n1); -} - -template<class CharT, class Traits> -inline -int -lexicographical_compare( - basic_string_view<CharT, Traits> s1, - CharT const* s2, std::size_t n2) -{ - return lexicographical_compare<CharT, Traits>( - s1.data(), s1.size(), s2, n2); -} - -template<class CharT, class Traits> -inline -int -lexicographical_compare( - basic_string_view<CharT, Traits> s1, - basic_string_view<CharT, Traits> s2) -{ - return lexicographical_compare<CharT, Traits>( - s1.data(), s1.size(), s2.data(), s2.size()); -} - -// Maximum number of characters in the decimal -// representation of a binary number. This includes -// the potential minus sign. -// -inline -std::size_t constexpr -max_digits(std::size_t bytes) -{ - return static_cast<std::size_t>( - bytes * 2.41) + 1 + 1; -} - -template<class CharT, class Integer, class Traits> -CharT* -raw_to_string( - CharT* buf, Integer x, std::true_type) -{ - if(x == 0) - { - Traits::assign(*--buf, '0'); - return buf; - } - if(x < 0) - { - x = -x; - for(;x > 0; x /= 10) - Traits::assign(*--buf , - "0123456789"[x % 10]); - Traits::assign(*--buf, '-'); - return buf; - } - for(;x > 0; x /= 10) - Traits::assign(*--buf , - "0123456789"[x % 10]); - return buf; -} - -template<class CharT, class Integer, class Traits> -CharT* -raw_to_string( - CharT* buf, Integer x, std::false_type) -{ - if(x == 0) - { - *--buf = '0'; - return buf; - } - for(;x > 0; x /= 10) - Traits::assign(*--buf , - "0123456789"[x % 10]); - return buf; -} - -template< - class CharT, - class Integer, - class Traits = std::char_traits<CharT>> -CharT* -raw_to_string(CharT* last, std::size_t size, Integer i) -{ - boost::ignore_unused(size); - BOOST_ASSERT(size >= max_digits(sizeof(Integer))); - return raw_to_string<CharT, Integer, Traits>( - last, i, std::is_signed<Integer>{}); -} - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/type_traits.hpp b/contrib/restricted/boost/boost/beast/core/detail/type_traits.hpp deleted file mode 100644 index 3692b6222b..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/type_traits.hpp +++ /dev/null @@ -1,472 +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_DETAIL_TYPE_TRAITS_HPP -#define BOOST_BEAST_DETAIL_TYPE_TRAITS_HPP - -#include <boost/beast/core/error.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/type_traits.hpp> -#include <iterator> -#include <tuple> -#include <type_traits> -#include <string> -#include <utility> - -namespace boost { -namespace beast { -namespace detail { - -template<class U> -inline -std::size_t constexpr -max_sizeof() -{ - return sizeof(U); -} - -template<class U0, class U1, class... Us> -inline -std::size_t constexpr -max_sizeof() -{ - return - max_sizeof<U0>() > max_sizeof<U1, Us...>() ? - max_sizeof<U0>() : max_sizeof<U1, Us...>(); -} - -template<class U> -inline -std::size_t constexpr -max_alignof() -{ - return alignof(U); -} - -template<class U0, class U1, class... Us> -std::size_t constexpr -max_alignof() -{ - return - max_alignof<U0>() > max_alignof<U1, Us...>() ? - max_alignof<U0>() : max_alignof<U1, Us...>(); -} - -// (since C++17) -template<class... Ts> struct make_void { using type = void; }; -template<class... Ts> using void_t = typename make_void<Ts...>::type; - -// (since C++11) missing from g++4.8 -template<std::size_t Len, class... Ts> -struct aligned_union -{ - static - std::size_t constexpr alignment_value = - max_alignof<Ts...>(); - - using type = typename std::aligned_storage< - (Len > max_sizeof<Ts...>()) ? Len : (max_sizeof<Ts...>()), - alignment_value>::type; -}; - -template<std::size_t Len, class... Ts> -using aligned_union_t = - typename aligned_union<Len, Ts...>::type; - -//------------------------------------------------------------------------------ - -template<class T> -inline -void -accept_rv(T){} - -//------------------------------------------------------------------------------ - -template<unsigned N, class T, class... Tn> -struct repeat_tuple_impl -{ - using type = typename repeat_tuple_impl< - N - 1, T, T, Tn...>::type; -}; - -template<class T, class... Tn> -struct repeat_tuple_impl<0, T, Tn...> -{ - using type = std::tuple<T, Tn...>; -}; - -template<unsigned N, class T> -struct repeat_tuple -{ - using type = - typename repeat_tuple_impl<N-1, T>::type; -}; - -template<class T> -struct repeat_tuple<0, T> -{ - using type = std::tuple<>; -}; - -//------------------------------------------------------------------------------ - -template<class R, class C, class ...A> -auto -is_invocable_test(C&& c, int, A&& ...a) - -> decltype(std::is_convertible< - decltype(c(std::forward<A>(a)...)), R>::value || - std::is_same<R, void>::value, - std::true_type()); - -template<class R, class C, class ...A> -std::false_type -is_invocable_test(C&& c, long, A&& ...a); - -/** Metafunction returns `true` if F callable as R(A...) - - Example: - - @code - is_invocable<T, void(std::string)> - @endcode -*/ -/** @{ */ -template<class C, class F> -struct is_invocable : std::false_type -{ -}; - -template<class C, class R, class ...A> -struct is_invocable<C, R(A...)> - : decltype(is_invocable_test<R>( - std::declval<C>(), 1, std::declval<A>()...)) -{ -}; -/** @} */ - -//------------------------------------------------------------------------------ - -// for span -template<class T, class E, class = void> -struct is_contiguous_container: std::false_type {}; - -template<class T, class E> -struct is_contiguous_container<T, E, void_t< - decltype( - std::declval<std::size_t&>() = std::declval<T const&>().size(), - std::declval<E*&>() = std::declval<T&>().data(), - (void)0), - typename std::enable_if< - std::is_same< - typename std::remove_cv<E>::type, - typename std::remove_cv< - typename std::remove_pointer< - decltype(std::declval<T&>().data()) - >::type - >::type - >::value - >::type>>: std::true_type -{}; - -//------------------------------------------------------------------------------ - -template<class...> -struct unwidest_unsigned; - -template<class U0> -struct unwidest_unsigned<U0> -{ - using type = U0; -}; - -template<class U0, class... UN> -struct unwidest_unsigned<U0, UN...> -{ - BOOST_STATIC_ASSERT(std::is_unsigned<U0>::value); - using type = typename std::conditional< - (sizeof(U0) < sizeof(typename unwidest_unsigned<UN...>::type)), - U0, typename unwidest_unsigned<UN...>::type>::type; -}; - -template<class...> -struct widest_unsigned; - -template<class U0> -struct widest_unsigned<U0> -{ - using type = U0; -}; - -template<class U0, class... UN> -struct widest_unsigned<U0, UN...> -{ - BOOST_STATIC_ASSERT(std::is_unsigned<U0>::value); - using type = typename std::conditional< - (sizeof(U0) > sizeof(typename widest_unsigned<UN...>::type)), - U0, typename widest_unsigned<UN...>::type>::type; -}; - -template<class U> -inline -constexpr -U -min_all(U u) -{ - BOOST_STATIC_ASSERT(std::is_unsigned<U>::value); - return u; -} - -template<class U0, class U1, class... UN> -inline -constexpr -typename unwidest_unsigned<U0, U1, UN...>::type -min_all(U0 u0, U1 u1, UN... un) -{ - using type = - typename unwidest_unsigned<U0, U1, UN...>::type; - return u0 < u1 ? - static_cast<type>(min_all(u0, un...)) : - static_cast<type>(min_all(u1, un...)); -} - -template<class U> -inline -constexpr -U -max_all(U u) -{ - BOOST_STATIC_ASSERT(std::is_unsigned<U>::value); - return u; -} - -template<class U0, class U1, class... UN> -inline -constexpr -typename widest_unsigned<U0, U1, UN...>::type -max_all(U0 u0, U1 u1, UN... un) -{ - return u0 > u1? max_all(u0, un...) : max_all(u1, un...); -} - -//------------------------------------------------------------------------------ - -template<class T, class = void> -struct get_lowest_layer_helper -{ - using type = T; -}; - -template<class T> -struct get_lowest_layer_helper<T, - void_t<typename T::lowest_layer_type>> -{ - using type = typename T::lowest_layer_type; -}; - -//------------------------------------------------------------------------------ - -// -// buffer concepts -// - -// Types that meet the requirements, -// for use with std::declval only. -template<class BufferType> -struct BufferSequence -{ - using value_type = BufferType; - using const_iterator = BufferType const*; - ~BufferSequence(); - BufferSequence(BufferSequence const&) = default; - const_iterator begin() const noexcept; - const_iterator end() const noexcept; -}; -using ConstBufferSequence = - BufferSequence<boost::asio::const_buffer>; -using MutableBufferSequence = - BufferSequence<boost::asio::mutable_buffer>; - -template<class B1, class... Bn> -struct is_all_const_buffer_sequence - : std::integral_constant<bool, - boost::asio::is_const_buffer_sequence<B1>::value && - is_all_const_buffer_sequence<Bn...>::value> -{ -}; - -template<class B> -struct is_all_const_buffer_sequence<B> - : boost::asio::is_const_buffer_sequence<B> -{ -}; - -template<class... Bn> -struct common_buffers_type -{ - using type = typename std::conditional< - boost::is_convertible<std::tuple<Bn...>, - typename repeat_tuple<sizeof...(Bn), - boost::asio::mutable_buffer>::type>::value, - boost::asio::mutable_buffer, - boost::asio::const_buffer>::type; -}; - -template<class B> -struct buffer_sequence_iterator -{ - using type = decltype( - boost::asio::buffer_sequence_begin( - std::declval<B const&>())); -}; - -// Types that meet the requirements, -// for use with std::declval only. -struct StreamHandler -{ - StreamHandler(StreamHandler const&) = default; - void operator()(error_code ec, std::size_t); -}; -using ReadHandler = StreamHandler; -using WriteHandler = StreamHandler; - -template<class Buffers> -class buffers_range_adaptor -{ - Buffers const& b_; - -public: - using value_type = typename std::conditional< - boost::is_convertible< - typename std::iterator_traits< - typename buffer_sequence_iterator< - Buffers>::type>::value_type, - boost::asio::mutable_buffer>::value, - boost::asio::mutable_buffer, - boost::asio::const_buffer>::type; - - class const_iterator - { - friend class buffers_range_adaptor; - - using iter_type = typename - buffer_sequence_iterator<Buffers>::type; - - iter_type it_; - - const_iterator(iter_type const& it) - : it_(it) - { - } - - public: - using value_type = typename - buffers_range_adaptor::value_type; - using pointer = value_type const*; - using reference = value_type; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::bidirectional_iterator_tag; - - bool - operator==(const_iterator const& other) const - { - return it_ == other.it_; - } - - bool - operator!=(const_iterator const& other) const - { - return ! (*this == other); - } - - reference - operator*() const - { - return *it_; - } - - pointer - operator->() const = delete; - - const_iterator& - operator++() - { - ++it_; - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - - // deprecated - const_iterator& - operator--() - { - --it_; - return *this; - } - - // deprecated - const_iterator - operator--(int) - { - auto temp = *this; - --(*this); - return temp; - } - }; - - explicit - buffers_range_adaptor(Buffers const& b) - : b_(b) - { - } - - const_iterator - begin() const noexcept - { - return boost::asio::buffer_sequence_begin(b_); - } - - const_iterator - end() const noexcept - { - return boost::asio::buffer_sequence_end(b_); - } -}; - -template<class Buffers> -buffers_range_adaptor<Buffers> -buffers_range(Buffers const& buffers) -{ - return buffers_range_adaptor<Buffers>{buffers}; -} - -/* If this static assert goes off, it means that the completion - handler you provided to an asynchronous initiating function did - not have the right signature. Check the parameter types for your - completion handler and make sure they match the list of types - expected by the initiating function, -*/ -#define BOOST_BEAST_HANDLER_INIT(type, sig) \ - static_assert(is_completion_handler< \ - BOOST_ASIO_HANDLER_TYPE(type, sig), sig>::value, \ - "CompletionHandler signature requirements not met"); \ - boost::asio::async_completion<type, sig> init{handler} - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/variant.hpp b/contrib/restricted/boost/boost/beast/core/detail/variant.hpp deleted file mode 100644 index 536cb7593f..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/variant.hpp +++ /dev/null @@ -1,267 +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_DETAIL_VARIANT_HPP -#define BOOST_BEAST_DETAIL_VARIANT_HPP - -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/assert.hpp> -#include <cstddef> -#include <tuple> -#include <type_traits> - -namespace boost { -namespace beast { -namespace detail { - -// This simple variant gets the job done without -// causing too much trouble with template depth: -// -// * Always allows an empty state I==0 -// * emplace() and get() support 1-based indexes only -// * Basic exception guarantee -// * Max 255 types -// -template<class... TN> -class variant -{ - detail::aligned_union_t<1, TN...> buf_; - unsigned char i_ = 0; - - template<std::size_t I> - using type = typename std::tuple_element< - I, std::tuple<TN...>>::type; - - template<std::size_t I> - using C = std::integral_constant<std::size_t, I>; - -public: - variant() = default; - - ~variant() - { - destroy(C<0>{}); - } - - bool - operator==(variant const& other) const - { - if(i_ != other.i_) - return false; - return equal(other, C<0>{}); - } - - // 0 = empty - unsigned char - index() const - { - return i_; - } - - // moved-from object becomes empty - variant(variant&& other) - { - i_ = other.move(&buf_, C<0>{}); - other.i_ = 0; - } - - variant(variant const& other) - { - i_ = other.copy(&buf_, C<0>{}); - } - - // moved-from object becomes empty - variant& operator=(variant&& other) - { - if(this != &other) - { - destroy(C<0>{}); - i_ = other.move(&buf_, C<0>{}); - other.i_ = 0; - } - return *this; - } - - variant& operator=(variant const& other) - { - if(this != &other) - { - destroy(C<0>{}); - i_ = other.copy(&buf_, C<0>{}); - } - return *this; - } - - template<std::size_t I, class... Args> - void - emplace(Args&&... args) - { - destroy(C<0>{}); - new(&buf_) type<I-1>( - std::forward<Args>(args)...); - i_ = I; - } - - template<std::size_t I> - type<I-1>& - get() - { - BOOST_ASSERT(i_ == I); - return *reinterpret_cast< - type<I-1>*>(&buf_); - } - - template<std::size_t I> - type<I-1> const& - get() const - { - BOOST_ASSERT(i_ == I); - return *reinterpret_cast< - type<I-1> const*>(&buf_); - } - - void - reset() - { - destroy(C<0>{}); - } - -private: - void - destroy(C<0>) - { - auto const I = 0; - if(i_ == I) - return; - destroy(C<I+1>{}); - i_ = 0; - } - - template<std::size_t I> - void - destroy(C<I>) - { - if(i_ == I) - { - using T = type<I-1>; - get<I>().~T(); - return; - } - destroy(C<I+1>{}); - } - - void - destroy(C<sizeof...(TN)>) - { - auto const I = sizeof...(TN); - BOOST_ASSERT(i_ == I); - using T = type<I-1>; - get<I>().~T(); - } - - unsigned char - move(void* dest, C<0>) - { - auto const I = 0; - if(i_ == I) - return I; - return move(dest, C<I+1>{}); - } - - template<std::size_t I> - unsigned char - move(void* dest, C<I>) - { - if(i_ == I) - { - using T = type<I-1>; - new(dest) T(std::move(get<I>())); - get<I>().~T(); - return I; - } - return move(dest, C<I+1>{}); - } - - unsigned char - move(void* dest, C<sizeof...(TN)>) - { - auto const I = sizeof...(TN); - BOOST_ASSERT(i_ == I); - using T = type<I-1>; - new(dest) T(std::move(get<I>())); - get<I>().~T(); - return I; - } - - unsigned char - copy(void* dest, C<0>) const - { - auto const I = 0; - if(i_ == I) - return I; - return copy(dest, C<I+1>{}); - } - - template<std::size_t I> - unsigned char - copy(void* dest, C<I>) const - { - if(i_ == I) - { - using T = type<I-1>; - auto const& t = get<I>(); - new(dest) T(t); - return I; - } - return copy(dest, C<I+1>{}); - } - - unsigned char - copy(void* dest, C<sizeof...(TN)>) const - { - auto const I = sizeof...(TN); - BOOST_ASSERT(i_ == I); - using T = type<I-1>; - auto const& t = get<I>(); - new(dest) T(t); - return I; - } - - bool - equal(variant const& other, C<0>) const - { - auto constexpr I = 0; - if(i_ == I) - return true; - return equal(other, C<I+1>{}); - } - - template<std::size_t I> - bool - equal(variant const& other, C<I>) const - { - if(i_ == I) - return get<I>() == other.get<I>(); - return equal(other, C<I+1>{}); - } - - bool - equal(variant const& other, C<sizeof...(TN)>) const - { - auto constexpr I = sizeof...(TN); - BOOST_ASSERT(i_ == I); - return get<I>() == other.get<I>(); - } -}; - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/detail/varint.hpp b/contrib/restricted/boost/boost/beast/core/detail/varint.hpp deleted file mode 100644 index 37f0b9d1c1..0000000000 --- a/contrib/restricted/boost/boost/beast/core/detail/varint.hpp +++ /dev/null @@ -1,79 +0,0 @@ -// -// Copyright (c) 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_DETAIL_VARINT_HPP -#define BOOST_BEAST_DETAIL_VARINT_HPP - -#include <boost/static_assert.hpp> -#include <cstdlib> -#include <iterator> -#include <type_traits> - -namespace boost { -namespace beast { -namespace detail { - -// https://developers.google.com/protocol-buffers/docs/encoding#varints - -inline -std::size_t -varint_size(std::size_t value) -{ - std::size_t n = 1; - while(value > 127) - { - ++n; - value /= 128; - } - return n; -} - -template<class FwdIt> -std::size_t -varint_read(FwdIt& first) -{ - using value_type = typename - std::iterator_traits<FwdIt>::value_type; - BOOST_STATIC_ASSERT( - std::is_integral<value_type>::value && - sizeof(value_type) == 1); - std::size_t value = 0; - std::size_t factor = 1; - while((*first & 0x80) != 0) - { - value += (*first++ & 0x7f) * factor; - factor *= 128; - } - value += *first++ * factor; - return value; -} - -template<class FwdIt> -void -varint_write(FwdIt& first, std::size_t value) -{ - using value_type = typename - std::iterator_traits<FwdIt>::value_type; - BOOST_STATIC_ASSERT( - std::is_integral<value_type>::value && - sizeof(value_type) == 1); - while(value > 127) - { - *first++ = static_cast<value_type>( - 0x80 | value); - value /= 128; - } - *first++ = static_cast<value_type>(value); -} - -} // detail -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/error.hpp b/contrib/restricted/boost/boost/beast/core/error.hpp deleted file mode 100644 index f034f7a404..0000000000 --- a/contrib/restricted/boost/boost/beast/core/error.hpp +++ /dev/null @@ -1,58 +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_ERROR_HPP -#define BOOST_BEAST_ERROR_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/system/error_code.hpp> -#include <boost/system/system_error.hpp> - -namespace boost { -namespace beast { - -/// The type of error code used by the library -using error_code = boost::system::error_code; - -/// The type of system error thrown by the library -using system_error = boost::system::system_error; - -/// The type of error category used by the library -using error_category = boost::system::error_category; - -/// A function to return the generic error category used by the library -#if BOOST_BEAST_DOXYGEN -error_category const& -generic_category(); -#else -using boost::system::generic_category; -#endif - -/// A function to return the system error category used by the library -#if BOOST_BEAST_DOXYGEN -error_category const& -system_category(); -#else -using boost::system::system_category; -#endif - -/// The type of error condition used by the library -using error_condition = boost::system::error_condition; - -/// The set of constants used for cross-platform error codes -#if BOOST_BEAST_DOXYGEN -enum errc{}; -#else -namespace errc = boost::system::errc; -#endif - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/file.hpp b/contrib/restricted/boost/boost/beast/core/file.hpp deleted file mode 100644 index 09c8e82081..0000000000 --- a/contrib/restricted/boost/boost/beast/core/file.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// -// Copyright (c) 2015-2016 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_FILE_HPP -#define BOOST_BEAST_CORE_FILE_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/file_base.hpp> -#include <boost/beast/core/file_posix.hpp> -#include <boost/beast/core/file_stdio.hpp> -#include <boost/beast/core/file_win32.hpp> -#include <boost/config.hpp> - -namespace boost { -namespace beast { - -/** An implementation of File. - - This alias is set to the best available implementation - of @b File given the platform and build settings. -*/ -#if BOOST_BEAST_DOXYGEN -struct file : file_stdio -{ -}; -#else -#if BOOST_BEAST_USE_WIN32_FILE -using file = file_win32; -#elif BOOST_BEAST_USE_POSIX_FILE -using file = file_posix; -#else -using file = file_stdio; -#endif -#endif - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/file_base.hpp b/contrib/restricted/boost/boost/beast/core/file_base.hpp deleted file mode 100644 index c2b3c53a53..0000000000 --- a/contrib/restricted/boost/boost/beast/core/file_base.hpp +++ /dev/null @@ -1,89 +0,0 @@ -// -// Copyright (c) 2015-2016 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_FILE_BASE_HPP -#define BOOST_BEAST_CORE_FILE_BASE_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/string.hpp> - -namespace boost { -namespace beast { - -/** File open modes - - These modes are used when opening files using - instances of the @b File concept. - - @see file_stdio -*/ -enum class file_mode -{ - /// Random reading - read, - - /// Sequential reading - scan, - - /** Random writing to a new or truncated file - - @li If the file does not exist, it is created. - - @li If the file exists, it is truncated to - zero size upon opening. - */ - write, - - /** Random writing to new file only - - If the file exists, an error is generated. - */ - write_new, - - /** Random writing to existing file - - If the file does not exist, an error is generated. - */ - write_existing, - - /** Appending to a new or truncated file - - The current file position shall be set to the end of - the file prior to each write. - - @li If the file does not exist, it is created. - - @li If the file exists, it is truncated to - zero size upon opening. - */ - append, - - /** Appending to a new file only - - The current file position shall be set to the end of - the file prior to each write. - - If the file exists, an error is generated. - */ - append_new, - - /** Appending to an existing file - - The current file position shall be set to the end of - the file prior to each write. - - If the file does not exist, an error is generated. - */ - append_existing -}; - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/file_posix.hpp b/contrib/restricted/boost/boost/beast/core/file_posix.hpp deleted file mode 100644 index 65bac2065d..0000000000 --- a/contrib/restricted/boost/boost/beast/core/file_posix.hpp +++ /dev/null @@ -1,175 +0,0 @@ -// -// Copyright (c) 2015-2016 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_FILE_POSIX_HPP -#define BOOST_BEAST_CORE_FILE_POSIX_HPP - -#include <boost/config.hpp> - -#if ! defined(BOOST_BEAST_NO_POSIX_FILE) -# if ! defined(__APPLE__) && ! defined(__linux__) -# define BOOST_BEAST_NO_POSIX_FILE -# endif -#endif - -#if ! defined(BOOST_BEAST_USE_POSIX_FILE) -# if ! defined(BOOST_BEAST_NO_POSIX_FILE) -# define BOOST_BEAST_USE_POSIX_FILE 1 -# else -# define BOOST_BEAST_USE_POSIX_FILE 0 -# endif -#endif - -#if BOOST_BEAST_USE_POSIX_FILE - -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/file_base.hpp> -#include <cstdint> - -namespace boost { -namespace beast { - -/** An implementation of File for POSIX systems. - - This class implements a @b File using POSIX interfaces. -*/ -class file_posix -{ - int fd_ = -1; - -public: - /** The type of the underlying file handle. - - This is platform-specific. - */ - using native_handle_type = int; - - /** Destructor - - If the file is open it is first closed. - */ - ~file_posix(); - - /** Constructor - - There is no open file initially. - */ - file_posix() = default; - - /** Constructor - - The moved-from object behaves as if default constructed. - */ - file_posix(file_posix&& other); - - /** Assignment - - The moved-from object behaves as if default constructed. - */ - file_posix& operator=(file_posix&& other); - - /// Returns the native handle associated with the file. - native_handle_type - native_handle() const - { - return fd_; - } - - /** Set the native handle associated with the file. - - If the file is open it is first closed. - - @param fd The native file handle to assign. - */ - void - native_handle(native_handle_type fd); - - /// Returns `true` if the file is open - bool - is_open() const - { - return fd_ != -1; - } - - /** Close the file if open - - @param ec Set to the error, if any occurred. - */ - void - close(error_code& ec); - - /** Open a file at the given path with the specified mode - - @param path The utf-8 encoded path to the file - - @param mode The file mode to use - - @param ec Set to the error, if any occurred - */ - void - open(char const* path, file_mode mode, error_code& ec); - - /** Return the size of the open file - - @param ec Set to the error, if any occurred - - @return The size in bytes - */ - std::uint64_t - size(error_code& ec) const; - - /** Return the current position in the open file - - @param ec Set to the error, if any occurred - - @return The offset in bytes from the beginning of the file - */ - std::uint64_t - pos(error_code& ec) const; - - /** Adjust the current position in the open file - - @param offset The offset in bytes from the beginning of the file - - @param ec Set to the error, if any occurred - */ - void - seek(std::uint64_t offset, error_code& ec); - - /** Read from the open file - - @param buffer The buffer for storing the result of the read - - @param n The number of bytes to read - - @param ec Set to the error, if any occurred - */ - std::size_t - read(void* buffer, std::size_t n, error_code& ec) const; - - /** Write to the open file - - @param buffer The buffer holding the data to write - - @param n The number of bytes to write - - @param ec Set to the error, if any occurred - */ - std::size_t - write(void const* buffer, std::size_t n, error_code& ec); -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/file_posix.ipp> - -#endif - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/file_stdio.hpp b/contrib/restricted/boost/boost/beast/core/file_stdio.hpp deleted file mode 100644 index 09ca0c42de..0000000000 --- a/contrib/restricted/boost/boost/beast/core/file_stdio.hpp +++ /dev/null @@ -1,158 +0,0 @@ -// -// Copyright (c) 2015-2016 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_FILE_STDIO_HPP -#define BOOST_BEAST_CORE_FILE_STDIO_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/file_base.hpp> -#include <cstdio> -#include <cstdint> - -namespace boost { -namespace beast { - -/** An implementation of File which uses cstdio. - - This class implements a file using the interfaces present - in the C++ Standard Library, in `<stdio>`. -*/ -class file_stdio -{ - FILE* f_ = nullptr; - -public: - /** The type of the underlying file handle. - - This is platform-specific. - */ - using native_handle_type = FILE*; - - /** Destructor - - If the file is open it is first closed. - */ - ~file_stdio(); - - /** Constructor - - There is no open file initially. - */ - file_stdio() = default; - - /** Constructor - - The moved-from object behaves as if default constructed. - */ - file_stdio(file_stdio&& other); - - /** Assignment - - The moved-from object behaves as if default constructed. - */ - file_stdio& operator=(file_stdio&& other); - - /// Returns the native handle associated with the file. - FILE* - native_handle() const - { - return f_; - } - - /** Set the native handle associated with the file. - - If the file is open it is first closed. - - @param f The native file handle to assign. - */ - void - native_handle(FILE* f); - - /// Returns `true` if the file is open - bool - is_open() const - { - return f_ != nullptr; - } - - /** Close the file if open - - @param ec Set to the error, if any occurred. - */ - void - close(error_code& ec); - - /** Open a file at the given path with the specified mode - - @param path The utf-8 encoded path to the file - - @param mode The file mode to use - - @param ec Set to the error, if any occurred - */ - void - open(char const* path, file_mode mode, error_code& ec); - - /** Return the size of the open file - - @param ec Set to the error, if any occurred - - @return The size in bytes - */ - std::uint64_t - size(error_code& ec) const; - - /** Return the current position in the open file - - @param ec Set to the error, if any occurred - - @return The offset in bytes from the beginning of the file - */ - std::uint64_t - pos(error_code& ec) const; - - /** Adjust the current position in the open file - - @param offset The offset in bytes from the beginning of the file - - @param ec Set to the error, if any occurred - */ - void - seek(std::uint64_t offset, error_code& ec); - - /** Read from the open file - - @param buffer The buffer for storing the result of the read - - @param n The number of bytes to read - - @param ec Set to the error, if any occurred - */ - std::size_t - read(void* buffer, std::size_t n, error_code& ec) const; - - /** Write to the open file - - @param buffer The buffer holding the data to write - - @param n The number of bytes to write - - @param ec Set to the error, if any occurred - */ - std::size_t - write(void const* buffer, std::size_t n, error_code& ec); -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/file_stdio.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/file_win32.hpp b/contrib/restricted/boost/boost/beast/core/file_win32.hpp deleted file mode 100644 index 3e9a18abaa..0000000000 --- a/contrib/restricted/boost/boost/beast/core/file_win32.hpp +++ /dev/null @@ -1,177 +0,0 @@ -// -// Copyright (c) 2015-2016 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_FILE_WIN32_HPP -#define BOOST_BEAST_CORE_FILE_WIN32_HPP - -#include <boost/config.hpp> - -#if ! defined(BOOST_BEAST_USE_WIN32_FILE) -# ifdef BOOST_MSVC -# define BOOST_BEAST_USE_WIN32_FILE 1 -# else -# define BOOST_BEAST_USE_WIN32_FILE 0 -# endif -#endif - -#if BOOST_BEAST_USE_WIN32_FILE - -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/file_base.hpp> -#include <boost/winapi/basic_types.hpp> -#include <boost/winapi/handles.hpp> -#include <cstdio> -#include <cstdint> - -namespace boost { -namespace beast { - -/** An implementation of File for Win32. - - This class implements a @b File using Win32 native interfaces. -*/ -class file_win32 -{ - boost::winapi::HANDLE_ h_ = - boost::winapi::INVALID_HANDLE_VALUE_; - -public: - /** The type of the underlying file handle. - - This is platform-specific. - */ -#if BOOST_BEAST_DOXYGEN - using native_handle_type = HANDLE; -#else - using native_handle_type = boost::winapi::HANDLE_; -#endif - - /** Destructor - - If the file is open it is first closed. - */ - ~file_win32(); - - /** Constructor - - There is no open file initially. - */ - file_win32() = default; - - /** Constructor - - The moved-from object behaves as if default constructed. - */ - file_win32(file_win32&& other); - - /** Assignment - - The moved-from object behaves as if default constructed. - */ - file_win32& operator=(file_win32&& other); - - /// Returns the native handle associated with the file. - native_handle_type - native_handle() - { - return h_; - } - - /** Set the native handle associated with the file. - - If the file is open it is first closed. - - @param h The native file handle to assign. - */ - void - native_handle(native_handle_type h); - - /// Returns `true` if the file is open - bool - is_open() const - { - return h_ != boost::winapi::INVALID_HANDLE_VALUE_; - } - - /** Close the file if open - - @param ec Set to the error, if any occurred. - */ - void - close(error_code& ec); - - /** Open a file at the given path with the specified mode - - @param path The utf-8 encoded path to the file - - @param mode The file mode to use - - @param ec Set to the error, if any occurred - */ - void - open(char const* path, file_mode mode, error_code& ec); - - /** Return the size of the open file - - @param ec Set to the error, if any occurred - - @return The size in bytes - */ - std::uint64_t - size(error_code& ec) const; - - /** Return the current position in the open file - - @param ec Set to the error, if any occurred - - @return The offset in bytes from the beginning of the file - */ - std::uint64_t - pos(error_code& ec); - - /** Adjust the current position in the open file - - @param offset The offset in bytes from the beginning of the file - - @param ec Set to the error, if any occurred - */ - void - seek(std::uint64_t offset, error_code& ec); - - /** Read from the open file - - @param buffer The buffer for storing the result of the read - - @param n The number of bytes to read - - @param ec Set to the error, if any occurred - */ - std::size_t - read(void* buffer, std::size_t n, error_code& ec); - - /** Write to the open file - - @param buffer The buffer holding the data to write - - @param n The number of bytes to write - - @param ec Set to the error, if any occurred - */ - std::size_t - write(void const* buffer, std::size_t n, error_code& ec); -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/file_win32.ipp> - -#endif - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/flat_buffer.hpp b/contrib/restricted/boost/boost/beast/core/flat_buffer.hpp deleted file mode 100644 index 11a18fdcb4..0000000000 --- a/contrib/restricted/boost/boost/beast/core/flat_buffer.hpp +++ /dev/null @@ -1,342 +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_FLAT_BUFFER_HPP -#define BOOST_BEAST_FLAT_BUFFER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/detail/allocator.hpp> -#include <boost/beast/core/detail/empty_base_optimization.hpp> -#include <boost/asio/buffer.hpp> -#include <limits> -#include <memory> - -namespace boost { -namespace beast { - -/** A linear dynamic buffer. - - Objects of this type meet the requirements of @b DynamicBuffer - and offer additional invariants: - - @li Buffer sequences returned by @ref data and @ref prepare - will always be of length one. - - @li A configurable maximum buffer size may be set upon - construction. Attempts to exceed the buffer size will throw - `std::length_error`. - - Upon construction, a maximum size for the buffer may be - specified. If this limit is exceeded, the `std::length_error` - exception will be thrown. - - @note This class is designed for use with algorithms that - take dynamic buffers as parameters, and are optimized - for the case where the input sequence or output sequence - is stored in a single contiguous buffer. -*/ -template<class Allocator> -class basic_flat_buffer -#if ! BOOST_BEAST_DOXYGEN - : private detail::empty_base_optimization< - typename detail::allocator_traits<Allocator>:: - template rebind_alloc<char>> -#endif -{ - enum - { - min_size = 512 - }; - - template<class OtherAlloc> - friend class basic_flat_buffer; - - using base_alloc_type = typename - detail::allocator_traits<Allocator>:: - template rebind_alloc<char>; - - using alloc_traits = - detail::allocator_traits<base_alloc_type>; - - static - inline - std::size_t - dist(char const* first, char const* last) - { - return static_cast<std::size_t>(last - first); - } - - char* begin_; - char* in_; - char* out_; - char* last_; - char* end_; - std::size_t max_; - -public: - /// The type of allocator used. - using allocator_type = Allocator; - - /// The type used to represent the input sequence as a list of buffers. - using const_buffers_type = boost::asio::const_buffer; - - /// The type used to represent the output sequence as a list of buffers. - using mutable_buffers_type = boost::asio::mutable_buffer; - - /// Destructor - ~basic_flat_buffer(); - - /** Constructor - - Upon construction, capacity will be zero. - */ - basic_flat_buffer(); - - /** Constructor - - Upon construction, capacity will be zero. - - @param limit The setting for @ref max_size. - */ - explicit - basic_flat_buffer(std::size_t limit); - - /** Constructor - - Upon construction, capacity will be zero. - - @param alloc The allocator to construct with. - */ - explicit - basic_flat_buffer(Allocator const& alloc); - - /** Constructor - - Upon construction, capacity will be zero. - - @param limit The setting for @ref max_size. - - @param alloc The allocator to use. - */ - basic_flat_buffer( - std::size_t limit, Allocator const& alloc); - - /** Constructor - - After the move, `*this` will have an empty output sequence. - - @param other The object to move from. After the move, - The object's state will be as if constructed using - its current allocator and limit. - */ - basic_flat_buffer(basic_flat_buffer&& other); - - /** Constructor - - After the move, `*this` will have an empty output sequence. - - @param other The object to move from. After the move, - The object's state will be as if constructed using - its current allocator and limit. - - @param alloc The allocator to use. - */ - basic_flat_buffer( - basic_flat_buffer&& other, Allocator const& alloc); - - /** Constructor - - @param other The object to copy from. - */ - basic_flat_buffer(basic_flat_buffer const& other); - - /** Constructor - - @param other The object to copy from. - - @param alloc The allocator to use. - */ - basic_flat_buffer(basic_flat_buffer const& other, - Allocator const& alloc); - - /** Constructor - - @param other The object to copy from. - */ - template<class OtherAlloc> - basic_flat_buffer( - basic_flat_buffer<OtherAlloc> const& other); - - /** Constructor - - @param other The object to copy from. - - @param alloc The allocator to use. - */ - template<class OtherAlloc> - basic_flat_buffer( - basic_flat_buffer<OtherAlloc> const& other, - Allocator const& alloc); - - /** Assignment - - After the move, `*this` will have an empty output sequence. - - @param other The object to move from. After the move, - the object's state will be as if constructed using - its current allocator and limit. - */ - basic_flat_buffer& - operator=(basic_flat_buffer&& other); - - /** Assignment - - After the copy, `*this` will have an empty output sequence. - - @param other The object to copy from. - */ - basic_flat_buffer& - operator=(basic_flat_buffer const& other); - - /** Copy assignment - - After the copy, `*this` will have an empty output sequence. - - @param other The object to copy from. - */ - template<class OtherAlloc> - basic_flat_buffer& - operator=(basic_flat_buffer<OtherAlloc> const& other); - - /// Returns a copy of the associated allocator. - allocator_type - get_allocator() const - { - return this->member(); - } - - /// Returns the size of the input sequence. - std::size_t - size() const - { - return dist(in_, out_); - } - - /// Return the maximum sum of the input and output sequence sizes. - std::size_t - max_size() const - { - return max_; - } - - /// Return the maximum sum of input and output sizes that can be held without an allocation. - std::size_t - capacity() const - { - return dist(begin_, end_); - } - - /// Get a list of buffers that represent the input sequence. - const_buffers_type - data() const - { - return {in_, dist(in_, out_)}; - } - - /** Get a list of buffers that represent the output sequence, with the given size. - - @throws std::length_error if `size() + n` exceeds `max_size()`. - - @note All previous buffers sequences obtained from - calls to @ref data or @ref prepare are invalidated. - */ - mutable_buffers_type - prepare(std::size_t n); - - /** Move bytes from the output sequence to the input sequence. - - @param n The number of bytes to move. If this is larger than - the number of bytes in the output sequences, then the entire - output sequences is moved. - - @note All previous buffers sequences obtained from - calls to @ref data or @ref prepare are invalidated. - */ - void - commit(std::size_t n) - { - out_ += (std::min)(n, dist(out_, last_)); - } - - /** Remove bytes from the input sequence. - - If `n` is greater than the number of bytes in the input - sequence, all bytes in the input sequence are removed. - - @note All previous buffers sequences obtained from - calls to @ref data or @ref prepare are invalidated. - */ - void - consume(std::size_t n); - - /** Reallocate the buffer to fit the input sequence. - - @note All previous buffers sequences obtained from - calls to @ref data or @ref prepare are invalidated. - */ - void - shrink_to_fit(); - - /// Exchange two flat buffers - template<class Alloc> - friend - void - swap( - basic_flat_buffer<Alloc>& lhs, - basic_flat_buffer<Alloc>& rhs); - -private: - void - reset(); - - template<class DynamicBuffer> - void - copy_from(DynamicBuffer const& other); - - void - move_assign(basic_flat_buffer&, std::true_type); - - void - move_assign(basic_flat_buffer&, std::false_type); - - void - copy_assign(basic_flat_buffer const&, std::true_type); - - void - copy_assign(basic_flat_buffer const&, std::false_type); - - void - swap(basic_flat_buffer&); - - void - swap(basic_flat_buffer&, std::true_type); - - void - swap(basic_flat_buffer&, std::false_type); -}; - -using flat_buffer = - basic_flat_buffer<std::allocator<char>>; - -} // beast -} // boost - -#include <boost/beast/core/impl/flat_buffer.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/flat_static_buffer.hpp b/contrib/restricted/boost/boost/beast/core/flat_static_buffer.hpp deleted file mode 100644 index c8eae90945..0000000000 --- a/contrib/restricted/boost/boost/beast/core/flat_static_buffer.hpp +++ /dev/null @@ -1,254 +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_FLAT_STATIC_BUFFER_HPP -#define BOOST_BEAST_FLAT_STATIC_BUFFER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/asio/buffer.hpp> -#include <algorithm> -#include <cstddef> -#include <cstring> - -namespace boost { -namespace beast { - -/** A flat @b DynamicBuffer with a fixed size internal buffer. - - Buffer sequences returned by @ref data and @ref prepare - will always be of length one. - Ownership of the underlying storage belongs to the derived class. - - @note Variables are usually declared using the template class - @ref flat_static_buffer; however, to reduce the number of instantiations - of template functions receiving static stream buffer arguments in a - deduced context, the signature of the receiving function should use - @ref flat_static_buffer_base. - - When used with @ref flat_static_buffer this implements a dynamic - buffer using no memory allocations. - - @see @ref flat_static_buffer -*/ -class flat_static_buffer_base -{ - char* begin_; - char* in_; - char* out_; - char* last_; - char* end_; - - flat_static_buffer_base(flat_static_buffer_base const& other) = delete; - flat_static_buffer_base& operator=(flat_static_buffer_base const&) = delete; - -public: - /** The type used to represent the input sequence as a list of buffers. - - This buffer sequence is guaranteed to have length 1. - */ - using const_buffers_type = boost::asio::const_buffer; - - /** The type used to represent the output sequence as a list of buffers. - - This buffer sequence is guaranteed to have length 1. - */ - using mutable_buffers_type = boost::asio::mutable_buffer; - - /** Constructor - - This creates a dynamic buffer using the provided storage area. - - @param p A pointer to valid storage of at least `n` bytes. - - @param n The number of valid bytes pointed to by `p`. - */ - flat_static_buffer_base(void* p, std::size_t n) - { - reset_impl(p, n); - } - - /// Return the size of the input sequence. - std::size_t - size() const - { - return out_ - in_; - } - - /// Return the maximum sum of the input and output sequence sizes. - std::size_t - max_size() const - { - return dist(begin_, end_); - } - - /// Return the maximum sum of input and output sizes that can be held without an allocation. - std::size_t - capacity() const - { - return max_size(); - } - - /** Get a list of buffers that represent the input sequence. - - @note These buffers remain valid across subsequent calls to `prepare`. - */ - const_buffers_type - data() const; - - /// Set the input and output sequences to size 0 - void - reset(); - - /** Get a list of buffers that represent the output sequence, with the given size. - - @throws std::length_error if the size would exceed the limit - imposed by the underlying mutable buffer sequence. - - @note Buffers representing the input sequence acquired prior to - this call remain valid. - */ - mutable_buffers_type - prepare(std::size_t n); - - /** Move bytes from the output sequence to the input sequence. - - @note Buffers representing the input sequence acquired prior to - this call remain valid. - */ - void - commit(std::size_t n) - { - out_ += (std::min<std::size_t>)(n, last_ - out_); - } - - /// Remove bytes from the input sequence. - void - consume(std::size_t n) - { - consume_impl(n); - } - -protected: - /** Constructor - - The buffer will be in an undefined state. It is necessary - for the derived class to call @ref reset with a pointer - and size in order to initialize the object. - */ - flat_static_buffer_base() = default; - - /** Reset the pointed-to buffer. - - This function resets the internal state to the buffer provided. - All input and output sequences are invalidated. This function - allows the derived class to construct its members before - initializing the static buffer. - - @param p A pointer to valid storage of at least `n` bytes. - - @param n The number of valid bytes pointed to by `p`. - */ - void - reset(void* p, std::size_t n); - -private: - static - inline - std::size_t - dist(char const* first, char const* last) - { - return static_cast<std::size_t>(last - first); - } - - template<class = void> - void - reset_impl(); - - template<class = void> - void - reset_impl(void* p, std::size_t n); - - template<class = void> - mutable_buffers_type - prepare_impl(std::size_t n); - - template<class = void> - void - consume_impl(std::size_t n); -}; - -//------------------------------------------------------------------------------ - -/** A @b DynamicBuffer with a fixed size internal buffer. - - Buffer sequences returned by @ref data and @ref prepare - will always be of length one. - This implements a dynamic buffer using no memory allocations. - - @tparam N The number of bytes in the internal buffer. - - @note To reduce the number of template instantiations when passing - objects of this type in a deduced context, the signature of the - receiving function should use @ref flat_static_buffer_base instead. - - @see @ref flat_static_buffer_base -*/ -template<std::size_t N> -class flat_static_buffer : public flat_static_buffer_base -{ - char buf_[N]; - -public: - /// Constructor - flat_static_buffer(flat_static_buffer const&); - - /// Constructor - flat_static_buffer() - : flat_static_buffer_base(buf_, N) - { - } - - /// Assignment - flat_static_buffer& operator=(flat_static_buffer const&); - - /// Returns the @ref flat_static_buffer_base portion of this object - flat_static_buffer_base& - base() - { - return *this; - } - - /// Returns the @ref flat_static_buffer_base portion of this object - flat_static_buffer_base const& - base() const - { - return *this; - } - - /// Return the maximum sum of the input and output sequence sizes. - std::size_t constexpr - max_size() const - { - return N; - } - - /// Return the maximum sum of input and output sizes that can be held without an allocation. - std::size_t constexpr - capacity() const - { - return N; - } -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/flat_static_buffer.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/handler_ptr.hpp b/contrib/restricted/boost/boost/beast/core/handler_ptr.hpp deleted file mode 100644 index 559c0c1559..0000000000 --- a/contrib/restricted/boost/boost/beast/core/handler_ptr.hpp +++ /dev/null @@ -1,191 +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_HANDLER_PTR_HPP -#define BOOST_BEAST_HANDLER_PTR_HPP - -#include <boost/beast/core/detail/allocator.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { - -/** A smart pointer container with associated completion handler. - - This is a smart pointer that retains unique ownership of an - object through a pointer. Memory is managed using the allocator - associated with a completion handler stored in the object. The - managed object is destroyed and its memory deallocated when one - of the following occurs: - - @li The function @ref invoke is called. - - @li The function @ref release_handler is called. - - @li The container is destroyed. - - Objects of this type are used in the implementation of composed - operations with states that are expensive or impossible to move. - This container manages that non-trivial state on behalf of the - composed operation. - - @par Thread Safety - @e Distinct @e objects: Safe.@n - @e Shared @e objects: Unsafe. - - @tparam T The type of the owned object. Must be noexcept destructible. - - @tparam Handler The type of the completion handler. -*/ -template<class T, class Handler> -class handler_ptr -{ - using handler_storage_t = typename detail::aligned_union<1, Handler>::type; - - T* t_ = nullptr; - handler_storage_t h_; - - void clear(); - -public: - static_assert(std::is_nothrow_destructible<T>::value, - "T must be nothrow destructible"); - - /// The type of element stored - using element_type = T; - - /// The type of handler stored - using handler_type = Handler; - - /// Default constructor (deleted). - handler_ptr() = delete; - - /// Copy assignment (deleted). - handler_ptr& operator=(handler_ptr const&) = delete; - - /// Move assignment (deleted). - handler_ptr& operator=(handler_ptr &&) = delete; - - /** Destructor - - If `*this` owns an object the object is destroyed and - the memory deallocated using the allocator associated - with the handler. - */ - ~handler_ptr(); - - /** Move constructor. - - When this call returns, the moved-from container - will have no owned object. - */ - handler_ptr(handler_ptr&& other); - - /// Copy constructor (deleted). - handler_ptr(handler_ptr const& other) = delete; - - /** Constructor - - This creates a new container with an owned object of - type `T`. The allocator associated with the handler will - be used to allocate memory for the owned object. The - constructor for the owned object will be called with the - following equivalent signature: - - @code - T::T(Handler const&, Args&&...) - @endcode - - @par Exception Safety - Strong guarantee. - - @param handler The handler to associate with the owned - object. The argument will be moved if it is an xvalue. - - @param args Optional arguments forwarded to - the owned object's constructor. - */ - template<class DeducedHandler, class... Args> - explicit handler_ptr(DeducedHandler&& handler, Args&&... args); - - /// Returns a const reference to the handler - handler_type const& - handler() const - { - return *reinterpret_cast<Handler const*>(&h_); - } - - /// Returns a reference to the handler - handler_type& - handler() - { - return *reinterpret_cast<Handler*>(&h_); - } - - /** Returns a pointer to the owned object. - */ - T* - get() const - { - return t_; - } - - /// Return a reference to the owned object. - T& - operator*() const - { - return *t_; - } - - /// Return a pointer to the owned object. - T* - operator->() const - { - return t_; - } - - /** Release ownership of the handler - - Requires: `*this` owns an object - - Before this function returns, the owned object is - destroyed, satisfying the deallocation-before-invocation - Asio guarantee. - - @return The released handler. - */ - handler_type - release_handler(); - - /** Invoke the handler in the owned object. - - This function invokes the handler in the owned object - with a forwarded argument list. Before the invocation, - the owned object is destroyed, satisfying the - deallocation-before-invocation Asio guarantee. - - @note Care must be taken when the arguments are themselves - stored in the owned object. Such arguments must first be - moved to the stack or elsewhere, and then passed, or else - undefined behavior will result. - */ - template<class... Args> - void - invoke(Args&&... args); -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/handler_ptr.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/buffered_read_stream.ipp b/contrib/restricted/boost/boost/beast/core/impl/buffered_read_stream.ipp deleted file mode 100644 index 1ae76b4d34..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/buffered_read_stream.ipp +++ /dev/null @@ -1,257 +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_IMPL_BUFFERED_READ_STREAM_IPP -#define BOOST_BEAST_IMPL_BUFFERED_READ_STREAM_IPP - -#include <boost/beast/core/bind_handler.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/handler_ptr.hpp> -#include <boost/beast/core/read_size.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/asio/post.hpp> -#include <boost/throw_exception.hpp> - -namespace boost { -namespace beast { - -template<class Stream, class DynamicBuffer> -template<class MutableBufferSequence, class Handler> -class buffered_read_stream< - Stream, DynamicBuffer>::read_some_op -{ - int step_ = 0; - buffered_read_stream& s_; - MutableBufferSequence b_; - Handler h_; - -public: - read_some_op(read_some_op&&) = default; - read_some_op(read_some_op const&) = delete; - - template<class DeducedHandler, class... Args> - read_some_op(DeducedHandler&& h, - buffered_read_stream& s, - MutableBufferSequence const& b) - : s_(s) - , b_(b) - , 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<buffered_read_stream&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, s_.get_executor()); - } - - void - operator()(error_code const& ec, - std::size_t bytes_transferred); - - friend - bool asio_handler_is_continuation(read_some_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, read_some_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->h_)); - } -}; - -template<class Stream, class DynamicBuffer> -template<class MutableBufferSequence, class Handler> -void -buffered_read_stream<Stream, DynamicBuffer>:: -read_some_op<MutableBufferSequence, Handler>::operator()( - error_code const& ec, std::size_t bytes_transferred) -{ - switch(step_) - { - case 0: - if(s_.buffer_.size() == 0) - { - if(s_.capacity_ == 0) - { - // read (unbuffered) - step_ = 1; - return s_.next_layer_.async_read_some( - b_, std::move(*this)); - } - - // read - step_ = 2; - return s_.next_layer_.async_read_some( - s_.buffer_.prepare(read_size( - s_.buffer_, s_.capacity_)), - std::move(*this)); - - } - step_ = 3; - return boost::asio::post( - s_.get_executor(), - bind_handler(std::move(*this), ec, 0)); - - case 1: - // upcall - break; - - case 2: - s_.buffer_.commit(bytes_transferred); - BOOST_FALLTHROUGH; - - case 3: - bytes_transferred = - boost::asio::buffer_copy(b_, s_.buffer_.data()); - s_.buffer_.consume(bytes_transferred); - break; - } - h_(ec, bytes_transferred); -} - -//------------------------------------------------------------------------------ - -template<class Stream, class DynamicBuffer> -template<class... Args> -buffered_read_stream<Stream, DynamicBuffer>:: -buffered_read_stream(Args&&... args) - : next_layer_(std::forward<Args>(args)...) -{ -} - -template<class Stream, class DynamicBuffer> -template<class ConstBufferSequence, class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -buffered_read_stream<Stream, DynamicBuffer>:: -async_write_some( - ConstBufferSequence const& buffers, - WriteHandler&& handler) -{ - static_assert(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"); - static_assert(is_completion_handler<WriteHandler, - void(error_code, std::size_t)>::value, - "WriteHandler requirements not met"); - return next_layer_.async_write_some(buffers, - std::forward<WriteHandler>(handler)); -} - -template<class Stream, class DynamicBuffer> -template<class MutableBufferSequence> -std::size_t -buffered_read_stream<Stream, DynamicBuffer>:: -read_some( - MutableBufferSequence const& buffers) -{ - static_assert(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(system_error{ec}); - return n; -} - -template<class Stream, class DynamicBuffer> -template<class MutableBufferSequence> -std::size_t -buffered_read_stream<Stream, DynamicBuffer>:: -read_some(MutableBufferSequence const& buffers, - error_code& ec) -{ - static_assert(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"); - using boost::asio::buffer_size; - using boost::asio::buffer_copy; - if(buffer_.size() == 0) - { - if(capacity_ == 0) - return next_layer_.read_some(buffers, ec); - buffer_.commit(next_layer_.read_some( - buffer_.prepare(read_size(buffer_, - capacity_)), ec)); - if(ec) - return 0; - } - else - { - ec.assign(0, ec.category()); - } - auto bytes_transferred = - buffer_copy(buffers, buffer_.data()); - buffer_.consume(bytes_transferred); - return bytes_transferred; -} - -template<class Stream, class DynamicBuffer> -template<class MutableBufferSequence, class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -buffered_read_stream<Stream, DynamicBuffer>:: -async_read_some( - MutableBufferSequence const& buffers, - ReadHandler&& handler) -{ - static_assert(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"); - if(buffer_.size() == 0 && capacity_ == 0) - return next_layer_.async_read_some(buffers, - std::forward<ReadHandler>(handler)); - BOOST_BEAST_HANDLER_INIT( - ReadHandler, void(error_code, std::size_t)); - read_some_op<MutableBufferSequence, BOOST_ASIO_HANDLER_TYPE( - ReadHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), *this, buffers}( - error_code{}, 0); - return init.result.get(); -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/buffers_adapter.ipp b/contrib/restricted/boost/boost/beast/core/impl/buffers_adapter.ipp deleted file mode 100644 index e16d2a9b32..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/buffers_adapter.ipp +++ /dev/null @@ -1,517 +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_IMPL_BUFFERS_ADAPTER_IPP -#define BOOST_BEAST_IMPL_BUFFERS_ADAPTER_IPP - -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/throw_exception.hpp> -#include <algorithm> -#include <cstring> -#include <iterator> -#include <stdexcept> - -namespace boost { -namespace beast { - -template<class MutableBufferSequence> -class buffers_adapter<MutableBufferSequence>:: - const_buffers_type -{ - buffers_adapter const* ba_; - -public: - using value_type = boost::asio::mutable_buffer; - - class const_iterator; - - const_buffers_type() = delete; - const_buffers_type( - const_buffers_type const&) = default; - const_buffers_type& operator=( - const_buffers_type const&) = default; - - const_iterator - begin() const; - - const_iterator - end() const; - -private: - friend class buffers_adapter; - - const_buffers_type(buffers_adapter const& ba) - : ba_(&ba) - { - } -}; - -template<class MutableBufferSequence> -class buffers_adapter<MutableBufferSequence>:: - const_buffers_type::const_iterator -{ - iter_type it_; - buffers_adapter const* ba_ = nullptr; - -public: - using value_type = boost::asio::const_buffer; - using pointer = value_type const*; - using reference = value_type; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::bidirectional_iterator_tag; - - const_iterator() = default; - const_iterator(const_iterator&& other) = default; - const_iterator(const_iterator const& other) = default; - const_iterator& operator=(const_iterator&& other) = default; - const_iterator& operator=(const_iterator const& other) = default; - - bool - operator==(const_iterator const& other) const - { - return ba_ == other.ba_ && - it_ == other.it_; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - value_type const b = *it_; - return value_type{b.data(), - (ba_->out_ == boost::asio::buffer_sequence_end(ba_->bs_) || - it_ != ba_->out_) ? b.size() : ba_->out_pos_} + - (it_ == ba_->begin_ ? ba_->in_pos_ : 0); - } - - pointer - operator->() const = delete; - - const_iterator& - operator++() - { - ++it_; - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - - const_iterator& - operator--() - { - --it_; - return *this; - } - - const_iterator - operator--(int) - { - auto temp = *this; - --(*this); - return temp; - } - -private: - friend class const_buffers_type; - - const_iterator(buffers_adapter const& ba, - iter_type iter) - : it_(iter) - , ba_(&ba) - { - } -}; - -template<class MutableBufferSequence> -inline -auto -buffers_adapter<MutableBufferSequence>::const_buffers_type::begin() const -> - const_iterator -{ - return const_iterator{*ba_, ba_->begin_}; -} - -template<class MutableBufferSequence> -inline -auto -buffers_adapter<MutableBufferSequence>::const_buffers_type::end() const -> - const_iterator -{ - return const_iterator{*ba_, ba_->out_ == - ba_->end_ ? ba_->end_ : std::next(ba_->out_)}; -} - -//------------------------------------------------------------------------------ - -template<class MutableBufferSequence> -class buffers_adapter<MutableBufferSequence>:: -mutable_buffers_type -{ - buffers_adapter const* ba_; - -public: - using value_type = boost::asio::mutable_buffer; - - class const_iterator; - - mutable_buffers_type() = delete; - mutable_buffers_type( - mutable_buffers_type const&) = default; - mutable_buffers_type& operator=( - mutable_buffers_type const&) = default; - - const_iterator - begin() const; - - const_iterator - end() const; - -private: - friend class buffers_adapter; - - mutable_buffers_type( - buffers_adapter const& ba) - : ba_(&ba) - { - } -}; - -template<class MutableBufferSequence> -class buffers_adapter<MutableBufferSequence>:: -mutable_buffers_type::const_iterator -{ - iter_type it_; - buffers_adapter const* ba_ = nullptr; - -public: - using value_type = boost::asio::mutable_buffer; - using pointer = value_type const*; - using reference = value_type; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::bidirectional_iterator_tag; - - const_iterator() = default; - const_iterator(const_iterator&& other) = default; - const_iterator(const_iterator const& other) = default; - const_iterator& operator=(const_iterator&& other) = default; - const_iterator& operator=(const_iterator const& other) = default; - - bool - operator==(const_iterator const& other) const - { - return ba_ == other.ba_ && - it_ == other.it_; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - value_type const b = *it_; - return value_type{b.data(), - it_ == std::prev(ba_->end_) ? - ba_->out_end_ : b.size()} + - (it_ == ba_->out_ ? ba_->out_pos_ : 0); - } - - pointer - operator->() const = delete; - - const_iterator& - operator++() - { - ++it_; - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - - const_iterator& - operator--() - { - --it_; - return *this; - } - - const_iterator - operator--(int) - { - auto temp = *this; - --(*this); - return temp; - } - -private: - friend class mutable_buffers_type; - - const_iterator(buffers_adapter const& ba, - iter_type iter) - : it_(iter) - , ba_(&ba) - { - } -}; - -template<class MutableBufferSequence> -inline -auto -buffers_adapter<MutableBufferSequence>:: -mutable_buffers_type:: -begin() const -> - const_iterator -{ - return const_iterator{*ba_, ba_->out_}; -} - -template<class MutableBufferSequence> -inline -auto -buffers_adapter<MutableBufferSequence>:: -mutable_buffers_type:: -end() const -> - const_iterator -{ - return const_iterator{*ba_, ba_->end_}; -} - -//------------------------------------------------------------------------------ - -template<class MutableBufferSequence> -buffers_adapter<MutableBufferSequence>::buffers_adapter( - buffers_adapter&& other) - : buffers_adapter(std::move(other), - std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.begin_), - std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.out_), - std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.end_)) -{ -} - -template<class MutableBufferSequence> -buffers_adapter<MutableBufferSequence>::buffers_adapter( - buffers_adapter const& other) - : buffers_adapter(other, - std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.begin_), - std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.out_), - std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.end_)) -{ -} - -template<class MutableBufferSequence> -auto -buffers_adapter<MutableBufferSequence>::operator=( - buffers_adapter&& other) -> buffers_adapter& -{ - auto const nbegin = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.begin_); - auto const nout = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.out_); - auto const nend = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.end_); - bs_ = std::move(other.bs_); - begin_ = std::next(boost::asio::buffer_sequence_begin(bs_), nbegin); - out_ = std::next(boost::asio::buffer_sequence_begin(bs_), nout); - end_ = std::next(boost::asio::buffer_sequence_begin(bs_), nend); - max_size_ = other.max_size_; - in_pos_ = other.in_pos_; - in_size_ = other.in_size_; - out_pos_ = other.out_pos_; - out_end_ = other.out_end_; - return *this; -} - -template<class MutableBufferSequence> -auto -buffers_adapter<MutableBufferSequence>::operator=( - buffers_adapter const& other) -> buffers_adapter& -{ - auto const nbegin = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.begin_); - auto const nout = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.out_); - auto const nend = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.end_); - bs_ = other.bs_; - begin_ = std::next(boost::asio::buffer_sequence_begin(bs_), nbegin); - out_ = std::next(boost::asio::buffer_sequence_begin(bs_), nout); - end_ = std::next(boost::asio::buffer_sequence_begin(bs_), nend); - max_size_ = other.max_size_; - in_pos_ = other.in_pos_; - in_size_ = other.in_size_; - out_pos_ = other.out_pos_; - out_end_ = other.out_end_; - return *this; -} - -template<class MutableBufferSequence> -buffers_adapter<MutableBufferSequence>::buffers_adapter( - MutableBufferSequence const& bs) - : bs_(bs) - , begin_(boost::asio::buffer_sequence_begin(bs_)) - , out_ (boost::asio::buffer_sequence_begin(bs_)) - , end_ (boost::asio::buffer_sequence_begin(bs_)) - , max_size_(boost::asio::buffer_size(bs_)) -{ -} - -template<class MutableBufferSequence> -auto -buffers_adapter<MutableBufferSequence>::prepare(std::size_t n) -> - mutable_buffers_type -{ - using boost::asio::buffer_size; - end_ = out_; - if(end_ != boost::asio::buffer_sequence_end(bs_)) - { - auto size = buffer_size(*end_) - out_pos_; - if(n > size) - { - n -= size; - while(++end_ != - boost::asio::buffer_sequence_end(bs_)) - { - size = buffer_size(*end_); - if(n < size) - { - out_end_ = n; - n = 0; - ++end_; - break; - } - n -= size; - out_end_ = size; - } - } - else - { - ++end_; - out_end_ = out_pos_ + n; - n = 0; - } - } - if(n > 0) - BOOST_THROW_EXCEPTION(std::length_error{ - "buffer overflow"}); - return mutable_buffers_type{*this}; -} - -template<class MutableBufferSequence> -void -buffers_adapter<MutableBufferSequence>::commit(std::size_t n) -{ - using boost::asio::buffer_size; - if(out_ == end_) - return; - auto const last = std::prev(end_); - while(out_ != last) - { - auto const avail = - buffer_size(*out_) - out_pos_; - if(n < avail) - { - out_pos_ += n; - in_size_ += n; - max_size_ -= n; - return; - } - ++out_; - n -= avail; - out_pos_ = 0; - in_size_ += avail; - max_size_ -= avail; - } - - n = (std::min)(n, out_end_ - out_pos_); - out_pos_ += n; - in_size_ += n; - max_size_ -= n; - if(out_pos_ == buffer_size(*out_)) - { - ++out_; - out_pos_ = 0; - out_end_ = 0; - } -} - -template<class MutableBufferSequence> -inline -auto -buffers_adapter<MutableBufferSequence>::data() const -> - const_buffers_type -{ - return const_buffers_type{*this}; -} - -template<class MutableBufferSequence> -void -buffers_adapter<MutableBufferSequence>::consume(std::size_t n) -{ - using boost::asio::buffer_size; - while(begin_ != out_) - { - auto const avail = - buffer_size(*begin_) - in_pos_; - if(n < avail) - { - in_size_ -= n; - in_pos_ += n; - return; - } - n -= avail; - in_size_ -= avail; - in_pos_ = 0; - ++begin_; - } - auto const avail = out_pos_ - in_pos_; - if(n < avail) - { - in_size_ -= n; - in_pos_ += n; - } - else - { - in_size_ -= avail; - in_pos_ = out_pos_; - } -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/buffers_cat.ipp b/contrib/restricted/boost/boost/beast/core/impl/buffers_cat.ipp deleted file mode 100644 index 2e82e887fc..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/buffers_cat.ipp +++ /dev/null @@ -1,376 +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_IMPL_BUFFERS_CAT_IPP -#define BOOST_BEAST_IMPL_BUFFERS_CAT_IPP - -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/beast/core/detail/variant.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/throw_exception.hpp> -#include <cstdint> -#include <iterator> -#include <new> -#include <stdexcept> -#include <tuple> -#include <utility> - -namespace boost { -namespace beast { - -template<class... Bn> -class buffers_cat_view<Bn...>::const_iterator -{ - // VFALCO The logic to skip empty sequences fails - // if there is just one buffer in the list. - static_assert(sizeof...(Bn) >= 2, - "A minimum of two sequences are required"); - - struct past_end - { - operator bool() const noexcept - { - return true; - } - }; - - std::tuple<Bn...> const* bn_ = nullptr; - detail::variant<typename - detail::buffer_sequence_iterator<Bn>::type..., - past_end> it_; - - friend class buffers_cat_view<Bn...>; - - template<std::size_t I> - using C = std::integral_constant<std::size_t, I>; - -public: - using value_type = typename - detail::common_buffers_type<Bn...>::type; - using pointer = value_type const*; - using reference = value_type; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::bidirectional_iterator_tag; - - const_iterator() = default; - const_iterator(const_iterator&& other) = default; - const_iterator(const_iterator const& other) = default; - const_iterator& operator=(const_iterator&& other) = default; - const_iterator& operator=(const_iterator const& other) = default; - - bool - operator==(const_iterator const& other) const; - - bool - operator!=(const_iterator const& other) const - { - return ! (*this == other); - } - - reference - operator*() const; - - pointer - operator->() const = delete; - - const_iterator& - operator++(); - - const_iterator - operator++(int); - - // deprecated - const_iterator& - operator--(); - - // deprecated - const_iterator - operator--(int); - -private: - const_iterator( - std::tuple<Bn...> const& bn, bool at_end); - - template<std::size_t I> - void - construct(C<I> const&) - { - if(boost::asio::buffer_size( - std::get<I>(*bn_)) != 0) - { - it_.template emplace<I+1>( - boost::asio::buffer_sequence_begin( - std::get<I>(*bn_))); - return; - } - construct(C<I+1>{}); - } - - void - construct(C<sizeof...(Bn)-1> const&) - { - auto constexpr I = sizeof...(Bn)-1; - it_.template emplace<I+1>( - boost::asio::buffer_sequence_begin( - std::get<I>(*bn_))); - } - - void - construct(C<sizeof...(Bn)> const&) - { - // end - auto constexpr I = sizeof...(Bn); - it_.template emplace<I+1>(); - } - - template<std::size_t I> - void - next(C<I> const&) - { - if(boost::asio::buffer_size( - std::get<I>(*bn_)) != 0) - { - it_.template emplace<I+1>( - boost::asio::buffer_sequence_begin( - std::get<I>(*bn_))); - return; - } - next(C<I+1>{}); - } - - void - next(C<sizeof...(Bn)> const&) - { - // end - auto constexpr I = sizeof...(Bn); - it_.template emplace<I+1>(); - } - - template<std::size_t I> - void - prev(C<I> const&) - { - if(boost::asio::buffer_size( - std::get<I>(*bn_)) != 0) - { - it_.template emplace<I+1>( - boost::asio::buffer_sequence_end( - std::get<I>(*bn_))); - return; - } - prev(C<I-1>{}); - } - - void - prev(C<0> const&) - { - auto constexpr I = 0; - it_.template emplace<I+1>( - boost::asio::buffer_sequence_end( - std::get<I>(*bn_))); - } - - template<std::size_t I> - reference - dereference(C<I> const&) const - { - if(it_.index() == I+1) - return *it_.template get<I+1>(); - return dereference(C<I+1>{}); - } - - [[noreturn]] - reference - dereference(C<sizeof...(Bn)> const&) const - { - BOOST_THROW_EXCEPTION(std::logic_error{ - "invalid iterator"}); - } - - template<std::size_t I> - void - increment(C<I> const&) - { - if(it_.index() == I+1) - { - if(++it_.template get<I+1>() != - boost::asio::buffer_sequence_end( - std::get<I>(*bn_))) - return; - return next(C<I+1>{}); - } - increment(C<I+1>{}); - } - - [[noreturn]] - void - increment(C<sizeof...(Bn)> const&) - { - BOOST_THROW_EXCEPTION(std::logic_error{ - "invalid iterator"}); - } - - void - decrement(C<sizeof...(Bn)> const&) - { - auto constexpr I = sizeof...(Bn); - if(it_.index() == I+1) - prev(C<I-1>{}); - decrement(C<I-1>{}); - } - - template<std::size_t I> - void - decrement(C<I> const&) - { - if(it_.index() == I+1) - { - if(it_.template get<I+1>() != - boost::asio::buffer_sequence_begin( - std::get<I>(*bn_))) - { - --it_.template get<I+1>(); - return; - } - prev(C<I-1>{}); - } - decrement(C<I-1>{}); - } - - void - decrement(C<0> const&) - { - auto constexpr I = 0; - if(it_.template get<I+1>() != - boost::asio::buffer_sequence_begin( - std::get<I>(*bn_))) - { - --it_.template get<I+1>(); - return; - } - BOOST_THROW_EXCEPTION(std::logic_error{ - "invalid iterator"}); - } -}; - -//------------------------------------------------------------------------------ - -template<class... Bn> -buffers_cat_view<Bn...>:: -const_iterator:: -const_iterator( - std::tuple<Bn...> const& bn, bool at_end) - : bn_(&bn) -{ - if(! at_end) - construct(C<0>{}); - else - construct(C<sizeof...(Bn)>{}); -} - -template<class... Bn> -bool -buffers_cat_view<Bn...>:: -const_iterator:: -operator==(const_iterator const& other) const -{ - if(bn_ != other.bn_) - return false; - return it_ == other.it_; -} - -template<class... Bn> -auto -buffers_cat_view<Bn...>:: -const_iterator:: -operator*() const -> - reference -{ - return dereference(C<0>{}); -} - -template<class... Bn> -auto -buffers_cat_view<Bn...>:: -const_iterator:: -operator++() -> - const_iterator& -{ - increment(C<0>{}); - return *this; -} - -template<class... Bn> -auto -buffers_cat_view<Bn...>:: -const_iterator:: -operator++(int) -> - const_iterator -{ - auto temp = *this; - ++(*this); - return temp; -} - -template<class... Bn> -auto -buffers_cat_view<Bn...>:: -const_iterator:: -operator--() -> - const_iterator& -{ - decrement(C<sizeof...(Bn)>{}); - return *this; -} - -template<class... Bn> -auto -buffers_cat_view<Bn...>:: -const_iterator:: -operator--(int) -> - const_iterator -{ - auto temp = *this; - --(*this); - return temp; -} - -//------------------------------------------------------------------------------ - -template<class... Bn> -buffers_cat_view<Bn...>:: -buffers_cat_view(Bn const&... bn) - : bn_(bn...) -{ -} - - -template<class... Bn> -inline -auto -buffers_cat_view<Bn...>::begin() const -> - const_iterator -{ - return const_iterator{bn_, false}; -} - -template<class... Bn> -inline -auto -buffers_cat_view<Bn...>::end() const -> - const_iterator -{ - return const_iterator{bn_, true}; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/buffers_prefix.ipp b/contrib/restricted/boost/boost/beast/core/impl/buffers_prefix.ipp deleted file mode 100644 index a45483854f..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/buffers_prefix.ipp +++ /dev/null @@ -1,258 +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_IMPL_BUFFERS_PREFIX_IPP -#define BOOST_BEAST_IMPL_BUFFERS_PREFIX_IPP - -#include <algorithm> -#include <cstdint> -#include <iterator> -#include <stdexcept> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { - -namespace detail { - -inline -boost::asio::const_buffer -buffers_prefix(std::size_t size, - boost::asio::const_buffer buffer) -{ - return {buffer.data(), - (std::min)(size, buffer.size())}; -} - -inline -boost::asio::mutable_buffer -buffers_prefix(std::size_t size, - boost::asio::mutable_buffer buffer) -{ - return {buffer.data(), - (std::min)(size, buffer.size())}; -} - -} // detail - -template<class BufferSequence> -class buffers_prefix_view<BufferSequence>::const_iterator -{ - friend class buffers_prefix_view<BufferSequence>; - - buffers_prefix_view const* b_ = nullptr; - std::size_t remain_; - iter_type it_; - -public: - using value_type = typename std::conditional< - boost::is_convertible<typename - std::iterator_traits<iter_type>::value_type, - boost::asio::mutable_buffer>::value, - boost::asio::mutable_buffer, - boost::asio::const_buffer>::type; - using pointer = value_type const*; - using reference = value_type; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::bidirectional_iterator_tag; - - const_iterator() = default; - const_iterator(const_iterator&& other) = default; - const_iterator(const_iterator const& other) = default; - const_iterator& operator=(const_iterator&& other) = default; - const_iterator& operator=(const_iterator const& other) = default; - - bool - operator==(const_iterator const& other) const - { - return b_ == other.b_ && it_ == other.it_; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - return detail::buffers_prefix(remain_, *it_); - } - - pointer - operator->() const = delete; - - const_iterator& - operator++() - { - remain_ -= boost::asio::buffer_size(*it_++); - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - remain_ -= boost::asio::buffer_size(*it_++); - return temp; - } - - const_iterator& - operator--() - { - remain_ += boost::asio::buffer_size(*--it_); - return *this; - } - - const_iterator - operator--(int) - { - auto temp = *this; - remain_ += boost::asio::buffer_size(*--it_); - return temp; - } - -private: - const_iterator(buffers_prefix_view const& b, - std::true_type) - : b_(&b) - , remain_(0) - , it_(b_->end_) - { - } - - const_iterator(buffers_prefix_view const& b, - std::false_type) - : b_(&b) - , remain_(b_->size_) - , it_(boost::asio::buffer_sequence_begin(b_->bs_)) - { - } -}; - -template<class BufferSequence> -void -buffers_prefix_view<BufferSequence>:: -setup(std::size_t size) -{ - size_ = 0; - end_ = boost::asio::buffer_sequence_begin(bs_); - auto const last = bs_.end(); - while(end_ != last) - { - auto const len = - boost::asio::buffer_size(*end_++); - if(len >= size) - { - size_ += size; - break; - } - size -= len; - size_ += len; - } -} - -template<class BufferSequence> -buffers_prefix_view<BufferSequence>:: -buffers_prefix_view(buffers_prefix_view&& other) - : buffers_prefix_view(std::move(other), - std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.end_)) -{ -} - -template<class BufferSequence> -buffers_prefix_view<BufferSequence>:: -buffers_prefix_view(buffers_prefix_view const& other) - : buffers_prefix_view(other, - std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.end_)) -{ -} - -template<class BufferSequence> -auto -buffers_prefix_view<BufferSequence>:: -operator=(buffers_prefix_view&& other) -> - buffers_prefix_view& -{ - auto const dist = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.end_); - bs_ = std::move(other.bs_); - size_ = other.size_; - end_ = std::next( - boost::asio::buffer_sequence_begin(bs_), - dist); - return *this; -} - -template<class BufferSequence> -auto -buffers_prefix_view<BufferSequence>:: -operator=(buffers_prefix_view const& other) -> - buffers_prefix_view& -{ - auto const dist = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.end_); - bs_ = other.bs_; - size_ = other.size_; - end_ = std::next( - boost::asio::buffer_sequence_begin(bs_), - dist); - return *this; -} - -template<class BufferSequence> -buffers_prefix_view<BufferSequence>:: -buffers_prefix_view(std::size_t size, - BufferSequence const& bs) - : bs_(bs) -{ - setup(size); -} - -template<class BufferSequence> -template<class... Args> -buffers_prefix_view<BufferSequence>:: -buffers_prefix_view(std::size_t size, - boost::in_place_init_t, Args&&... args) - : bs_(std::forward<Args>(args)...) -{ - setup(size); -} - -template<class BufferSequence> -inline -auto -buffers_prefix_view<BufferSequence>::begin() const -> - const_iterator -{ - return const_iterator{*this, std::false_type{}}; -} - -template<class BufferSequence> -inline -auto -buffers_prefix_view<BufferSequence>::end() const -> - const_iterator -{ - return const_iterator{*this, std::true_type{}}; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/buffers_suffix.ipp b/contrib/restricted/boost/boost/beast/core/impl/buffers_suffix.ipp deleted file mode 100644 index 4385fe500d..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/buffers_suffix.ipp +++ /dev/null @@ -1,250 +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_IMPL_BUFFERS_SUFFIX_IPP -#define BOOST_BEAST_IMPL_BUFFERS_SUFFIX_IPP - -#include <boost/beast/core/type_traits.hpp> -#include <boost/type_traits.hpp> -#include <algorithm> -#include <cstdint> -#include <iterator> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { - -template<class Buffers> -class buffers_suffix<Buffers>::const_iterator -{ - friend class buffers_suffix<Buffers>; - - using iter_type = typename - detail::buffer_sequence_iterator<Buffers>::type; - - iter_type it_; - buffers_suffix const* b_ = nullptr; - -public: - using value_type = typename std::conditional< - boost::is_convertible<typename - std::iterator_traits<iter_type>::value_type, - boost::asio::mutable_buffer>::value, - boost::asio::mutable_buffer, - boost::asio::const_buffer>::type; - using pointer = value_type const*; - using reference = value_type; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::bidirectional_iterator_tag; - - const_iterator() = default; - const_iterator(const_iterator&& other) = default; - const_iterator(const_iterator const& other) = default; - const_iterator& operator=(const_iterator&& other) = default; - const_iterator& operator=(const_iterator const& other) = default; - - bool - operator==(const_iterator const& other) const - { - return b_ == other.b_ && it_ == other.it_; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - return it_ == b_->begin_ - ? value_type{*it_} + b_->skip_ - : *it_; - } - - pointer - operator->() const = delete; - - const_iterator& - operator++() - { - ++it_; - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - - const_iterator& - operator--() - { - --it_; - return *this; - } - - const_iterator - operator--(int) - { - auto temp = *this; - --(*this); - return temp; - } - -private: - const_iterator(buffers_suffix const& b, - iter_type it) - : it_(it) - , b_(&b) - { - } -}; - -//------------------------------------------------------------------------------ - -template<class Buffers> -buffers_suffix<Buffers>:: -buffers_suffix() - : begin_(boost::asio::buffer_sequence_begin(bs_)) -{ -} - -template<class Buffers> -buffers_suffix<Buffers>:: -buffers_suffix(buffers_suffix&& other) - : buffers_suffix(std::move(other), - std::distance<iter_type>( - boost::asio::buffer_sequence_begin( - other.bs_), other.begin_)) -{ -} - -template<class Buffers> -buffers_suffix<Buffers>:: -buffers_suffix(buffers_suffix const& other) - : buffers_suffix(other, - std::distance<iter_type>( - boost::asio::buffer_sequence_begin( - other.bs_), other.begin_)) -{ -} - -template<class Buffers> -buffers_suffix<Buffers>:: -buffers_suffix(Buffers const& bs) - : bs_(bs) - , begin_(boost::asio::buffer_sequence_begin(bs_)) -{ - static_assert( - boost::asio::is_const_buffer_sequence<Buffers>::value|| - boost::asio::is_mutable_buffer_sequence<Buffers>::value, - "BufferSequence requirements not met"); -} - -template<class Buffers> -template<class... Args> -buffers_suffix<Buffers>:: -buffers_suffix(boost::in_place_init_t, Args&&... args) - : bs_(std::forward<Args>(args)...) - , begin_(boost::asio::buffer_sequence_begin(bs_)) -{ - static_assert(sizeof...(Args) > 0, - "Missing constructor arguments"); - static_assert( - std::is_constructible<Buffers, Args...>::value, - "Buffers not constructible from arguments"); -} - -template<class Buffers> -auto -buffers_suffix<Buffers>:: -operator=(buffers_suffix&& other) -> - buffers_suffix& -{ - auto const dist = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.begin_); - bs_ = std::move(other.bs_); - begin_ = std::next( - boost::asio::buffer_sequence_begin(bs_), - dist); - skip_ = other.skip_; - return *this; -} - -template<class Buffers> -auto -buffers_suffix<Buffers>:: -operator=(buffers_suffix const& other) -> - buffers_suffix& -{ - auto const dist = std::distance<iter_type>( - boost::asio::buffer_sequence_begin(other.bs_), - other.begin_); - bs_ = other.bs_; - begin_ = std::next( - boost::asio::buffer_sequence_begin(bs_), dist); - skip_ = other.skip_; - return *this; -} - -template<class Buffers> -inline -auto -buffers_suffix<Buffers>:: -begin() const -> - const_iterator -{ - return const_iterator{*this, begin_}; -} - -template<class Buffers> -inline -auto -buffers_suffix<Buffers>:: -end() const -> - const_iterator -{ - return const_iterator{*this, - boost::asio::buffer_sequence_end(bs_)}; -} - -template<class Buffers> -void -buffers_suffix<Buffers>:: -consume(std::size_t amount) -{ - using boost::asio::buffer_size; - auto const end = - boost::asio::buffer_sequence_end(bs_); - for(;amount > 0 && begin_ != end; ++begin_) - { - auto const len = - buffer_size(*begin_) - skip_; - if(amount < len) - { - skip_ += amount; - break; - } - amount -= len; - skip_ = 0; - } -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/file_posix.ipp b/contrib/restricted/boost/boost/beast/core/impl/file_posix.ipp deleted file mode 100644 index c30a7d020f..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/file_posix.ipp +++ /dev/null @@ -1,349 +0,0 @@ -// -// Copyright (c) 2015-2016 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_FILE_POSIX_IPP -#define BOOST_BEAST_CORE_IMPL_FILE_POSIX_IPP - -#if ! defined(BOOST_BEAST_NO_POSIX_FADVISE) -# if defined(__APPLE__) || (defined(ANDROID) && (__ANDROID_API__ < 21)) -# define BOOST_BEAST_NO_POSIX_FADVISE -# endif -#endif - -#if ! defined(BOOST_BEAST_USE_POSIX_FADVISE) -# if ! defined(BOOST_BEAST_NO_POSIX_FADVISE) -# define BOOST_BEAST_USE_POSIX_FADVISE 1 -# else -# define BOOST_BEAST_USE_POSIX_FADVISE 0 -# endif -#endif - -#include <limits> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/uio.h> -#include <sys/stat.h> -#include <unistd.h> -#include <limits.h> - -namespace boost { -namespace beast { - -namespace detail { - -inline -int -file_posix_close(int fd) -{ - for(;;) - { - if(! ::close(fd)) - break; - int const ev = errno; - if(errno != EINTR) - return ev; - } - return 0; -} - -} // detail - -inline -file_posix:: -~file_posix() -{ - if(fd_ != -1) - detail::file_posix_close(fd_); -} - -inline -file_posix:: -file_posix(file_posix&& other) - : fd_(other.fd_) -{ - other.fd_ = -1; -} - -inline -file_posix& -file_posix:: -operator=(file_posix&& other) -{ - if(&other == this) - return *this; - if(fd_ != -1) - detail::file_posix_close(fd_); - fd_ = other.fd_; - other.fd_ = -1; - return *this; -} - -inline -void -file_posix:: -native_handle(native_handle_type fd) -{ - if(fd_ != -1) - detail::file_posix_close(fd_); - fd_ = fd; -} - -inline -void -file_posix:: -close(error_code& ec) -{ - if(fd_ != -1) - { - auto const ev = - detail::file_posix_close(fd_); - if(ev) - ec.assign(ev, generic_category()); - else - ec.assign(0, ec.category()); - fd_ = -1; - } - else - { - ec.assign(0, ec.category()); - } -} - -inline -void -file_posix:: -open(char const* path, file_mode mode, error_code& ec) -{ - if(fd_ != -1) - { - auto const ev = - detail::file_posix_close(fd_); - if(ev) - ec.assign(ev, generic_category()); - else - ec.assign(0, ec.category()); - fd_ = -1; - } - int f = 0; -#if BOOST_BEAST_USE_POSIX_FADVISE - int advise = 0; -#endif - switch(mode) - { - default: - case file_mode::read: - f = O_RDONLY; - #if BOOST_BEAST_USE_POSIX_FADVISE - advise = POSIX_FADV_RANDOM; - #endif - break; - case file_mode::scan: - f = O_RDONLY; - #if BOOST_BEAST_USE_POSIX_FADVISE - advise = POSIX_FADV_SEQUENTIAL; - #endif - break; - - case file_mode::write: - f = O_RDWR | O_CREAT | O_TRUNC; - #if BOOST_BEAST_USE_POSIX_FADVISE - advise = POSIX_FADV_RANDOM; - #endif - break; - - case file_mode::write_new: - f = O_RDWR | O_CREAT | O_EXCL; - #if BOOST_BEAST_USE_POSIX_FADVISE - advise = POSIX_FADV_RANDOM; - #endif - break; - - case file_mode::write_existing: - f = O_RDWR | O_EXCL; - #if BOOST_BEAST_USE_POSIX_FADVISE - advise = POSIX_FADV_RANDOM; - #endif - break; - - case file_mode::append: - f = O_RDWR | O_CREAT | O_TRUNC; - #if BOOST_BEAST_USE_POSIX_FADVISE - advise = POSIX_FADV_SEQUENTIAL; - #endif - break; - - case file_mode::append_new: - f = O_RDWR | O_CREAT | O_EXCL; - #if BOOST_BEAST_USE_POSIX_FADVISE - advise = POSIX_FADV_SEQUENTIAL; - #endif - break; - - case file_mode::append_existing: - f = O_RDWR | O_EXCL; - #if BOOST_BEAST_USE_POSIX_FADVISE - advise = POSIX_FADV_SEQUENTIAL; - #endif - break; - } - for(;;) - { - fd_ = ::open(path, f, 0644); - if(fd_ != -1) - break; - auto const ev = errno; - if(ev != EINTR) - { - ec.assign(ev, generic_category()); - return; - } - } -#if BOOST_BEAST_USE_POSIX_FADVISE - if(::posix_fadvise(fd_, 0, 0, advise)) - { - auto const ev = errno; - detail::file_posix_close(fd_); - fd_ = -1; - ec.assign(ev, generic_category()); - return; - } -#endif - ec.assign(0, ec.category()); -} - -inline -std::uint64_t -file_posix:: -size(error_code& ec) const -{ - if(fd_ == -1) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - struct stat st; - if(::fstat(fd_, &st) != 0) - { - ec.assign(errno, generic_category()); - return 0; - } - ec.assign(0, ec.category()); - return st.st_size; -} - -inline -std::uint64_t -file_posix:: -pos(error_code& ec) const -{ - if(fd_ == -1) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - auto const result = ::lseek(fd_, 0, SEEK_CUR); - if(result == (off_t)-1) - { - ec.assign(errno, generic_category()); - return 0; - } - ec.assign(0, ec.category()); - return result; -} - -inline -void -file_posix:: -seek(std::uint64_t offset, error_code& ec) -{ - if(fd_ == -1) - { - ec = make_error_code(errc::invalid_argument); - return; - } - auto const result = ::lseek(fd_, offset, SEEK_SET); - if(result == static_cast<off_t>(-1)) - { - ec.assign(errno, generic_category()); - return; - } - ec.assign(0, ec.category()); -} - -inline -std::size_t -file_posix:: -read(void* buffer, std::size_t n, error_code& ec) const -{ - if(fd_ == -1) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - std::size_t nread = 0; - while(n > 0) - { - auto const amount = static_cast<ssize_t>((std::min)( - n, static_cast<std::size_t>(SSIZE_MAX))); - auto const result = ::read(fd_, buffer, amount); - if(result == -1) - { - auto const ev = errno; - if(ev == EINTR) - continue; - ec.assign(ev, generic_category()); - return nread; - } - if(result == 0) - { - // short read - return nread; - } - n -= result; - nread += result; - buffer = reinterpret_cast<char*>(buffer) + result; - } - return nread; -} - -inline -std::size_t -file_posix:: -write(void const* buffer, std::size_t n, error_code& ec) -{ - if(fd_ == -1) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - std::size_t nwritten = 0; - while(n > 0) - { - auto const amount = static_cast<ssize_t>((std::min)( - n, static_cast<std::size_t>(SSIZE_MAX))); - auto const result = ::write(fd_, buffer, amount); - if(result == -1) - { - auto const ev = errno; - if(ev == EINTR) - continue; - ec.assign(ev, generic_category()); - return nwritten; - } - n -= result; - nwritten += result; - buffer = reinterpret_cast<char const*>(buffer) + result; - } - return nwritten; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/file_stdio.ipp b/contrib/restricted/boost/boost/beast/core/impl/file_stdio.ipp deleted file mode 100644 index 60a0f3fc0e..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/file_stdio.ipp +++ /dev/null @@ -1,239 +0,0 @@ -// -// Copyright (c) 2015-2016 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_FILE_STDIO_IPP -#define BOOST_BEAST_CORE_IMPL_FILE_STDIO_IPP - -#include <limits> - -namespace boost { -namespace beast { - -inline -file_stdio:: -~file_stdio() -{ - if(f_) - fclose(f_); -} - -inline -file_stdio:: -file_stdio(file_stdio&& other) - : f_(other.f_) -{ - other.f_ = nullptr; -} - -inline -file_stdio& -file_stdio:: -operator=(file_stdio&& other) -{ - if(&other == this) - return *this; - if(f_) - fclose(f_); - f_ = other.f_; - other.f_ = nullptr; - return *this; -} - -inline -void -file_stdio:: -native_handle(FILE* f) -{ - if(f_) - fclose(f_); - f_ = f; -} - -inline -void -file_stdio:: -close(error_code& ec) -{ - if(f_) - { - int failed = fclose(f_); - f_ = nullptr; - if(failed) - { - ec.assign(errno, generic_category()); - return; - } - } - ec.assign(0, ec.category()); -} - -inline -void -file_stdio:: -open(char const* path, file_mode mode, error_code& ec) -{ - if(f_) - { - fclose(f_); - f_ = nullptr; - } - char const* s; - switch(mode) - { - default: - case file_mode::read: s = "rb"; break; - case file_mode::scan: s = "rb"; break; - case file_mode::write: s = "wb"; break; - case file_mode::write_new: s = "wbx"; break; - case file_mode::write_existing: s = "wb"; break; - case file_mode::append: s = "ab"; break; - case file_mode::append_new: s = "abx"; break; - case file_mode::append_existing: s = "ab"; break; - } -#if BOOST_MSVC - auto const ev = fopen_s(&f_, path, s); - if(ev) - { - f_ = nullptr; - ec.assign(ev, generic_category()); - return; - } -#else - f_ = std::fopen(path, s); - if(! f_) - { - ec.assign(errno, generic_category()); - return; - } -#endif - ec.assign(0, ec.category()); -} - -inline -std::uint64_t -file_stdio:: -size(error_code& ec) const -{ - if(! f_) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - long pos = std::ftell(f_); - if(pos == -1L) - { - ec.assign(errno, generic_category()); - return 0; - } - int result = std::fseek(f_, 0, SEEK_END); - if(result != 0) - { - ec.assign(errno, generic_category()); - return 0; - } - long size = std::ftell(f_); - if(size == -1L) - { - ec.assign(errno, generic_category()); - std::fseek(f_, pos, SEEK_SET); - return 0; - } - result = std::fseek(f_, pos, SEEK_SET); - if(result != 0) - ec.assign(errno, generic_category()); - else - ec.assign(0, ec.category()); - return size; -} - -inline -std::uint64_t -file_stdio:: -pos(error_code& ec) const -{ - if(! f_) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - long pos = std::ftell(f_); - if(pos == -1L) - { - ec.assign(errno, generic_category()); - return 0; - } - ec.assign(0, ec.category()); - return pos; -} - -inline -void -file_stdio:: -seek(std::uint64_t offset, error_code& ec) -{ - if(! f_) - { - ec = make_error_code(errc::invalid_argument); - return; - } - if(offset > (std::numeric_limits<long>::max)()) - { - ec = make_error_code(errc::invalid_seek); - return; - } - int result = std::fseek(f_, - static_cast<long>(offset), SEEK_SET); - if(result != 0) - ec.assign(errno, generic_category()); - else - ec.assign(0, ec.category()); -} - -inline -std::size_t -file_stdio:: -read(void* buffer, std::size_t n, error_code& ec) const -{ - if(! f_) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - auto nread = std::fread(buffer, 1, n, f_); - if(std::ferror(f_)) - { - ec.assign(errno, generic_category()); - return 0; - } - return nread; -} - -inline -std::size_t -file_stdio:: -write(void const* buffer, std::size_t n, error_code& ec) -{ - if(! f_) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - auto nwritten = std::fwrite(buffer, 1, n, f_); - if(std::ferror(f_)) - { - ec.assign(errno, generic_category()); - return 0; - } - return nwritten; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/file_win32.ipp b/contrib/restricted/boost/boost/beast/core/impl/file_win32.ipp deleted file mode 100644 index c1b4cc6c7d..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/file_win32.ipp +++ /dev/null @@ -1,364 +0,0 @@ -// -// Copyright (c) 2015-2016 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_FILE_WIN32_IPP -#define BOOST_BEAST_CORE_IMPL_FILE_WIN32_IPP - -#include <boost/winapi/access_rights.hpp> -#include <boost/winapi/error_codes.hpp> -#include <boost/winapi/file_management.hpp> -#include <boost/winapi/get_last_error.hpp> -#include <limits> -#include <utility> - -namespace boost { -namespace beast { - -namespace detail { - -// VFALCO Can't seem to get boost/detail/winapi to work with -// this so use the non-Ex version for now. -inline -boost::winapi::BOOL_ -set_file_pointer_ex( - boost::winapi::HANDLE_ hFile, - boost::winapi::LARGE_INTEGER_ lpDistanceToMove, - boost::winapi::PLARGE_INTEGER_ lpNewFilePointer, - boost::winapi::DWORD_ dwMoveMethod) -{ - auto dwHighPart = lpDistanceToMove.u.HighPart; - auto dwLowPart = boost::winapi::SetFilePointer( - hFile, - lpDistanceToMove.u.LowPart, - &dwHighPart, - dwMoveMethod); - if(dwLowPart == boost::winapi::INVALID_SET_FILE_POINTER_) - return 0; - if(lpNewFilePointer) - { - lpNewFilePointer->u.LowPart = dwLowPart; - lpNewFilePointer->u.HighPart = dwHighPart; - } - return 1; -} - -} // detail - -inline -file_win32:: -~file_win32() -{ - if(h_ != boost::winapi::INVALID_HANDLE_VALUE_) - boost::winapi::CloseHandle(h_); -} - -inline -file_win32:: -file_win32(file_win32&& other) - : h_(other.h_) -{ - other.h_ = boost::winapi::INVALID_HANDLE_VALUE_; -} - -inline -file_win32& -file_win32:: -operator=(file_win32&& other) -{ - if(&other == this) - return *this; - if(h_) - boost::winapi::CloseHandle(h_); - h_ = other.h_; - other.h_ = boost::winapi::INVALID_HANDLE_VALUE_; - return *this; -} - -inline -void -file_win32:: -native_handle(native_handle_type h) -{ - if(h_ != boost::winapi::INVALID_HANDLE_VALUE_) - boost::winapi::CloseHandle(h_); - h_ = h; -} - -inline -void -file_win32:: -close(error_code& ec) -{ - if(h_ != boost::winapi::INVALID_HANDLE_VALUE_) - { - if(! boost::winapi::CloseHandle(h_)) - ec.assign(boost::winapi::GetLastError(), - system_category()); - else - ec.assign(0, ec.category()); - h_ = boost::winapi::INVALID_HANDLE_VALUE_; - } - else - { - ec.assign(0, ec.category()); - } -} - -inline -void -file_win32:: -open(char const* path, file_mode mode, error_code& ec) -{ - if(h_ != boost::winapi::INVALID_HANDLE_VALUE_) - { - boost::winapi::CloseHandle(h_); - h_ = boost::winapi::INVALID_HANDLE_VALUE_; - } - boost::winapi::DWORD_ share_mode = 0; - boost::winapi::DWORD_ desired_access = 0; - boost::winapi::DWORD_ creation_disposition = 0; - boost::winapi::DWORD_ flags_and_attributes = 0; -/* - | When the file... - This argument: | Exists Does not exist - -------------------------+------------------------------------------------------ - CREATE_ALWAYS | Truncates Creates - CREATE_NEW +-----------+ Fails Creates - OPEN_ALWAYS ===| does this |===> Opens Creates - OPEN_EXISTING +-----------+ Opens Fails - TRUNCATE_EXISTING | Truncates Fails -*/ - switch(mode) - { - default: - case file_mode::read: - desired_access = boost::winapi::GENERIC_READ_; - share_mode = boost::winapi::FILE_SHARE_READ_; - creation_disposition = boost::winapi::OPEN_EXISTING_; - flags_and_attributes = 0x10000000; // FILE_FLAG_RANDOM_ACCESS - break; - - case file_mode::scan: - desired_access = boost::winapi::GENERIC_READ_; - share_mode = boost::winapi::FILE_SHARE_READ_; - creation_disposition = boost::winapi::OPEN_EXISTING_; - flags_and_attributes = 0x08000000; // FILE_FLAG_SEQUENTIAL_SCAN - break; - - case file_mode::write: - desired_access = boost::winapi::GENERIC_READ_ | - boost::winapi::GENERIC_WRITE_; - creation_disposition = boost::winapi::CREATE_ALWAYS_; - flags_and_attributes = 0x10000000; // FILE_FLAG_RANDOM_ACCESS - break; - - case file_mode::write_new: - desired_access = boost::winapi::GENERIC_READ_ | - boost::winapi::GENERIC_WRITE_; - creation_disposition = boost::winapi::CREATE_NEW_; - flags_and_attributes = 0x10000000; // FILE_FLAG_RANDOM_ACCESS - break; - - case file_mode::write_existing: - desired_access = boost::winapi::GENERIC_READ_ | - boost::winapi::GENERIC_WRITE_; - creation_disposition = boost::winapi::OPEN_EXISTING_; - flags_and_attributes = 0x10000000; // FILE_FLAG_RANDOM_ACCESS - break; - - case file_mode::append: - desired_access = boost::winapi::GENERIC_READ_ | - boost::winapi::GENERIC_WRITE_; - - creation_disposition = boost::winapi::CREATE_ALWAYS_; - flags_and_attributes = 0x08000000; // FILE_FLAG_SEQUENTIAL_SCAN - break; - - case file_mode::append_new: - desired_access = boost::winapi::GENERIC_READ_ | - boost::winapi::GENERIC_WRITE_; - creation_disposition = boost::winapi::CREATE_NEW_; - flags_and_attributes = 0x08000000; // FILE_FLAG_SEQUENTIAL_SCAN - break; - - case file_mode::append_existing: - desired_access = boost::winapi::GENERIC_READ_ | - boost::winapi::GENERIC_WRITE_; - creation_disposition = boost::winapi::OPEN_EXISTING_; - flags_and_attributes = 0x08000000; // FILE_FLAG_SEQUENTIAL_SCAN - break; - } - h_ = ::CreateFileA( - path, - desired_access, - share_mode, - NULL, - creation_disposition, - flags_and_attributes, - NULL); - if(h_ == boost::winapi::INVALID_HANDLE_VALUE_) - ec.assign(boost::winapi::GetLastError(), - system_category()); - else - ec.assign(0, ec.category()); -} - -inline -std::uint64_t -file_win32:: -size(error_code& ec) const -{ - if(h_ == boost::winapi::INVALID_HANDLE_VALUE_) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - boost::winapi::LARGE_INTEGER_ fileSize; - if(! boost::winapi::GetFileSizeEx(h_, &fileSize)) - { - ec.assign(boost::winapi::GetLastError(), - system_category()); - return 0; - } - ec.assign(0, ec.category()); - return fileSize.QuadPart; -} - -inline -std::uint64_t -file_win32:: -pos(error_code& ec) -{ - if(h_ == boost::winapi::INVALID_HANDLE_VALUE_) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - boost::winapi::LARGE_INTEGER_ in; - boost::winapi::LARGE_INTEGER_ out; - in.QuadPart = 0; - if(! detail::set_file_pointer_ex(h_, in, &out, - boost::winapi::FILE_CURRENT_)) - { - ec.assign(boost::winapi::GetLastError(), - system_category()); - return 0; - } - ec.assign(0, ec.category()); - return out.QuadPart; -} - -inline -void -file_win32:: -seek(std::uint64_t offset, error_code& ec) -{ - if(h_ == boost::winapi::INVALID_HANDLE_VALUE_) - { - ec = make_error_code(errc::invalid_argument); - return; - } - boost::winapi::LARGE_INTEGER_ in; - in.QuadPart = offset; - if(! detail::set_file_pointer_ex(h_, in, 0, - boost::winapi::FILE_BEGIN_)) - { - ec.assign(boost::winapi::GetLastError(), - system_category()); - return; - } - ec.assign(0, ec.category()); -} - -inline -std::size_t -file_win32:: -read(void* buffer, std::size_t n, error_code& ec) -{ - if(h_ == boost::winapi::INVALID_HANDLE_VALUE_) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - std::size_t nread = 0; - while(n > 0) - { - boost::winapi::DWORD_ amount; - if(n > (std::numeric_limits< - boost::winapi::DWORD_>::max)()) - amount = (std::numeric_limits< - boost::winapi::DWORD_>::max)(); - else - amount = static_cast< - boost::winapi::DWORD_>(n); - boost::winapi::DWORD_ bytesRead; - if(! ::ReadFile(h_, buffer, amount, &bytesRead, 0)) - { - auto const dwError = boost::winapi::GetLastError(); - if(dwError != boost::winapi::ERROR_HANDLE_EOF_) - ec.assign(dwError, system_category()); - else - ec.assign(0, ec.category()); - return nread; - } - if(bytesRead == 0) - return nread; - n -= bytesRead; - nread += bytesRead; - buffer = reinterpret_cast<char*>(buffer) + bytesRead; - } - ec.assign(0, ec.category()); - return nread; -} - -inline -std::size_t -file_win32:: -write(void const* buffer, std::size_t n, error_code& ec) -{ - if(h_ == boost::winapi::INVALID_HANDLE_VALUE_) - { - ec = make_error_code(errc::invalid_argument); - return 0; - } - std::size_t nwritten = 0; - while(n > 0) - { - boost::winapi::DWORD_ amount; - if(n > (std::numeric_limits< - boost::winapi::DWORD_>::max)()) - amount = (std::numeric_limits< - boost::winapi::DWORD_>::max)(); - else - amount = static_cast< - boost::winapi::DWORD_>(n); - boost::winapi::DWORD_ bytesWritten; - if(! ::WriteFile(h_, buffer, amount, &bytesWritten, 0)) - { - auto const dwError = boost::winapi::GetLastError(); - if(dwError != boost::winapi::ERROR_HANDLE_EOF_) - ec.assign(dwError, system_category()); - else - ec.assign(0, ec.category()); - return nwritten; - } - if(bytesWritten == 0) - return nwritten; - n -= bytesWritten; - nwritten += bytesWritten; - buffer = reinterpret_cast<char const*>(buffer) + bytesWritten; - } - ec.assign(0, ec.category()); - return nwritten; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/flat_buffer.ipp b/contrib/restricted/boost/boost/beast/core/impl/flat_buffer.ipp deleted file mode 100644 index ffca651cc9..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/flat_buffer.ipp +++ /dev/null @@ -1,475 +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_IMPL_FLAT_BUFFER_HPP -#define BOOST_BEAST_IMPL_FLAT_BUFFER_HPP - -#include <boost/assert.hpp> -#include <boost/throw_exception.hpp> -#include <stdexcept> - -namespace boost { -namespace beast { - -/* Memory is laid out thusly: - - begin_ ..|.. in_ ..|.. out_ ..|.. last_ ..|.. end_ -*/ - -template<class Allocator> -basic_flat_buffer<Allocator>:: -~basic_flat_buffer() -{ - if(begin_) - alloc_traits::deallocate( - this->member(), begin_, dist(begin_, end_)); -} - -template<class Allocator> -basic_flat_buffer<Allocator>:: -basic_flat_buffer() - : begin_(nullptr) - , in_(nullptr) - , out_(nullptr) - , last_(nullptr) - , end_(nullptr) - , max_((std::numeric_limits<std::size_t>::max)()) -{ -} - -template<class Allocator> -basic_flat_buffer<Allocator>:: -basic_flat_buffer(std::size_t limit) - : begin_(nullptr) - , in_(nullptr) - , out_(nullptr) - , last_(nullptr) - , end_(nullptr) - , max_(limit) -{ -} - -template<class Allocator> -basic_flat_buffer<Allocator>:: -basic_flat_buffer(Allocator const& alloc) - : detail::empty_base_optimization<base_alloc_type>(alloc) - , begin_(nullptr) - , in_(nullptr) - , out_(nullptr) - , last_(nullptr) - , end_(nullptr) - , max_((std::numeric_limits<std::size_t>::max)()) -{ -} - -template<class Allocator> -basic_flat_buffer<Allocator>:: -basic_flat_buffer(std::size_t limit, Allocator const& alloc) - : detail::empty_base_optimization<base_alloc_type>(alloc) - , begin_(nullptr) - , in_(nullptr) - , out_(nullptr) - , last_(nullptr) - , end_(nullptr) - , max_(limit) -{ -} - -template<class Allocator> -basic_flat_buffer<Allocator>:: -basic_flat_buffer(basic_flat_buffer&& other) - : detail::empty_base_optimization<base_alloc_type>( - std::move(other.member())) - , begin_(other.begin_) - , in_(other.in_) - , out_(other.out_) - , last_(out_) - , end_(other.end_) - , max_(other.max_) -{ - other.begin_ = nullptr; - other.in_ = nullptr; - other.out_ = nullptr; - other.last_ = nullptr; - other.end_ = nullptr; -} - -template<class Allocator> -basic_flat_buffer<Allocator>:: -basic_flat_buffer(basic_flat_buffer&& other, - Allocator const& alloc) - : detail::empty_base_optimization<base_alloc_type>(alloc) -{ - if(this->member() != other.member()) - { - begin_ = nullptr; - in_ = nullptr; - out_ = nullptr; - last_ = nullptr; - end_ = nullptr; - max_ = other.max_; - copy_from(other); - other.reset(); - } - else - { - begin_ = other.begin_; - in_ = other.in_; - out_ = other.out_; - last_ = out_; - end_ = other.end_; - max_ = other.max_; - other.begin_ = nullptr; - other.in_ = nullptr; - other.out_ = nullptr; - other.last_ = nullptr; - other.end_ = nullptr; - } -} - -template<class Allocator> -basic_flat_buffer<Allocator>:: -basic_flat_buffer(basic_flat_buffer const& other) - : detail::empty_base_optimization<base_alloc_type>( - alloc_traits::select_on_container_copy_construction( - other.member())) - , begin_(nullptr) - , in_(nullptr) - , out_(nullptr) - , last_(nullptr) - , end_(nullptr) - , max_(other.max_) -{ - copy_from(other); -} - -template<class Allocator> -basic_flat_buffer<Allocator>:: -basic_flat_buffer(basic_flat_buffer const& other, - Allocator const& alloc) - : detail::empty_base_optimization<base_alloc_type>(alloc) - , begin_(nullptr) - , in_(nullptr) - , out_(nullptr) - , last_(nullptr) - , end_(nullptr) - , max_(other.max_) -{ - copy_from(other); -} - -template<class Allocator> -template<class OtherAlloc> -basic_flat_buffer<Allocator>:: -basic_flat_buffer( - basic_flat_buffer<OtherAlloc> const& other) - : begin_(nullptr) - , in_(nullptr) - , out_(nullptr) - , last_(nullptr) - , end_(nullptr) - , max_(other.max_) -{ - copy_from(other); -} - -template<class Allocator> -template<class OtherAlloc> -basic_flat_buffer<Allocator>:: -basic_flat_buffer(basic_flat_buffer<OtherAlloc> const& other, - Allocator const& alloc) - : detail::empty_base_optimization<base_alloc_type>(alloc) - , begin_(nullptr) - , in_(nullptr) - , out_(nullptr) - , last_(nullptr) - , end_(nullptr) - , max_(other.max_) -{ - copy_from(other); -} - -template<class Allocator> -auto -basic_flat_buffer<Allocator>:: -operator=(basic_flat_buffer&& other) -> - basic_flat_buffer& -{ - if(this != &other) - move_assign(other, std::integral_constant<bool, - alloc_traits::propagate_on_container_move_assignment::value>{}); - return *this; -} - -template<class Allocator> -auto -basic_flat_buffer<Allocator>:: -operator=(basic_flat_buffer const& other) -> - basic_flat_buffer& -{ - if(this != &other) - copy_assign(other, std::integral_constant<bool, - alloc_traits::propagate_on_container_copy_assignment::value>{}); - return *this; -} - -template<class Allocator> -template<class OtherAlloc> -auto -basic_flat_buffer<Allocator>:: -operator=(basic_flat_buffer<OtherAlloc> const& other) -> - basic_flat_buffer& -{ - reset(); - max_ = other.max_; - copy_from(other); - return *this; -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -auto -basic_flat_buffer<Allocator>:: -prepare(std::size_t n) -> - mutable_buffers_type -{ - if(n <= dist(out_, end_)) - { - // existing capacity is sufficient - last_ = out_ + n; - return{out_, n}; - } - auto const len = size(); - if(n <= capacity() - len) - { - // after a memmove, - // existing capacity is sufficient - if(len > 0) - std::memmove(begin_, in_, len); - in_ = begin_; - out_ = in_ + len; - last_ = out_ + n; - return {out_, n}; - } - // enforce maximum capacity - if(n > max_ - len) - BOOST_THROW_EXCEPTION(std::length_error{ - "basic_flat_buffer overflow"}); - // allocate a new buffer - auto const new_size = (std::min<std::size_t>)( - max_, - (std::max<std::size_t>)(2 * len, len + n)); - auto const p = alloc_traits::allocate( - this->member(), new_size); - if(begin_) - { - BOOST_ASSERT(p); - BOOST_ASSERT(in_); - std::memcpy(p, in_, len); - alloc_traits::deallocate( - this->member(), begin_, capacity()); - } - begin_ = p; - in_ = begin_; - out_ = in_ + len; - last_ = out_ + n; - end_ = begin_ + new_size; - return {out_, n}; -} - -template<class Allocator> -void -basic_flat_buffer<Allocator>:: -consume(std::size_t n) -{ - if(n >= dist(in_, out_)) - { - in_ = begin_; - out_ = begin_; - return; - } - in_ += n; -} - -template<class Allocator> -void -basic_flat_buffer<Allocator>:: -shrink_to_fit() -{ - auto const len = size(); - if(len == capacity()) - return; - char* p; - if(len > 0) - { - BOOST_ASSERT(begin_); - BOOST_ASSERT(in_); - p = alloc_traits::allocate( - this->member(), len); - std::memcpy(p, in_, len); - } - else - { - p = nullptr; - } - alloc_traits::deallocate( - this->member(), begin_, dist(begin_, end_)); - begin_ = p; - in_ = begin_; - out_ = begin_ + len; - last_ = out_; - end_ = out_; -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -inline -void -basic_flat_buffer<Allocator>:: -reset() -{ - consume(size()); - shrink_to_fit(); -} - -template<class Allocator> -template<class DynamicBuffer> -inline -void -basic_flat_buffer<Allocator>:: -copy_from(DynamicBuffer const& buffer) -{ - if(buffer.size() == 0) - return; - using boost::asio::buffer_copy; - commit(buffer_copy( - prepare(buffer.size()), buffer.data())); -} - -template<class Allocator> -inline -void -basic_flat_buffer<Allocator>:: -move_assign(basic_flat_buffer& other, std::true_type) -{ - reset(); - this->member() = std::move(other.member()); - begin_ = other.begin_; - in_ = other.in_; - out_ = other.out_; - last_ = out_; - end_ = other.end_; - max_ = other.max_; - other.begin_ = nullptr; - other.in_ = nullptr; - other.out_ = nullptr; - other.last_ = nullptr; - other.end_ = nullptr; -} - -template<class Allocator> -inline -void -basic_flat_buffer<Allocator>:: -move_assign(basic_flat_buffer& other, std::false_type) -{ - reset(); - if(this->member() != other.member()) - { - copy_from(other); - other.reset(); - } - else - { - move_assign(other, std::true_type{}); - } -} - -template<class Allocator> -inline -void -basic_flat_buffer<Allocator>:: -copy_assign(basic_flat_buffer const& other, std::true_type) -{ - reset(); - max_ = other.max_; - this->member() = other.member(); - copy_from(other); -} - -template<class Allocator> -inline -void -basic_flat_buffer<Allocator>:: -copy_assign(basic_flat_buffer const& other, std::false_type) -{ - reset(); - max_ = other.max_; - copy_from(other); -} - -template<class Allocator> -inline -void -basic_flat_buffer<Allocator>:: -swap(basic_flat_buffer& other) -{ - swap(other, typename - alloc_traits::propagate_on_container_swap{}); -} - -template<class Allocator> -inline -void -basic_flat_buffer<Allocator>:: -swap(basic_flat_buffer& other, std::true_type) -{ - using std::swap; - swap(this->member(), other.member()); - swap(max_, other.max_); - swap(begin_, other.begin_); - swap(in_, other.in_); - swap(out_, other.out_); - last_ = this->out_; - other.last_ = other.out_; - swap(end_, other.end_); -} - -template<class Allocator> -inline -void -basic_flat_buffer<Allocator>:: -swap(basic_flat_buffer& other, std::false_type) -{ - BOOST_ASSERT(this->member() == other.member()); - using std::swap; - swap(max_, other.max_); - swap(begin_, other.begin_); - swap(in_, other.in_); - swap(out_, other.out_); - last_ = this->out_; - other.last_ = other.out_; - swap(end_, other.end_); -} - -template<class Allocator> -void -swap( - basic_flat_buffer<Allocator>& lhs, - basic_flat_buffer<Allocator>& rhs) -{ - lhs.swap(rhs); -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/flat_static_buffer.ipp b/contrib/restricted/boost/boost/beast/core/impl/flat_static_buffer.ipp deleted file mode 100644 index 3d38b92958..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/flat_static_buffer.ipp +++ /dev/null @@ -1,151 +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_IMPL_FLAT_STATIC_BUFFER_IPP -#define BOOST_BEAST_IMPL_FLAT_STATIC_BUFFER_IPP - -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/throw_exception.hpp> -#include <algorithm> -#include <cstring> -#include <iterator> -#include <stdexcept> - -namespace boost { -namespace beast { - -/* Memory is laid out thusly: - - begin_ ..|.. in_ ..|.. out_ ..|.. last_ ..|.. end_ -*/ - -inline -auto -flat_static_buffer_base:: -data() const -> - const_buffers_type -{ - return {in_, dist(in_, out_)}; -} - -inline -void -flat_static_buffer_base:: -reset() -{ - reset_impl(); -} - -inline -auto -flat_static_buffer_base:: -prepare(std::size_t n) -> - mutable_buffers_type -{ - return prepare_impl(n); -} - -inline -void -flat_static_buffer_base:: -reset(void* p, std::size_t n) -{ - reset_impl(p, n); -} - -template<class> -void -flat_static_buffer_base:: -reset_impl() -{ - in_ = begin_; - out_ = begin_; - last_ = begin_; -} - -template<class> -void -flat_static_buffer_base:: -reset_impl(void* p, std::size_t n) -{ - begin_ = - reinterpret_cast<char*>(p); - in_ = begin_; - out_ = begin_; - last_ = begin_; - end_ = begin_ + n; -} - -template<class> -auto -flat_static_buffer_base:: -prepare_impl(std::size_t n) -> - mutable_buffers_type -{ - if(n <= dist(out_, end_)) - { - last_ = out_ + n; - return {out_, n}; - } - auto const len = size(); - if(n > capacity() - len) - BOOST_THROW_EXCEPTION(std::length_error{ - "buffer overflow"}); - if(len > 0) - std::memmove(begin_, in_, len); - in_ = begin_; - out_ = in_ + len; - last_ = out_ + n; - return {out_, n}; -} - -template<class> -void -flat_static_buffer_base:: -consume_impl(std::size_t n) -{ - if(n >= size()) - { - in_ = begin_; - out_ = in_; - return; - } - in_ += n; -} - -//------------------------------------------------------------------------------ - -template<std::size_t N> -flat_static_buffer<N>:: -flat_static_buffer(flat_static_buffer const& other) - : flat_static_buffer_base(buf_, N) -{ - using boost::asio::buffer_copy; - this->commit(buffer_copy( - this->prepare(other.size()), other.data())); -} - -template<std::size_t N> -auto -flat_static_buffer<N>:: -operator=(flat_static_buffer const& other) -> - flat_static_buffer<N>& -{ - using boost::asio::buffer_copy; - this->consume(this->size()); - this->commit(buffer_copy( - this->prepare(other.size()), other.data())); - return *this; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/handler_ptr.ipp b/contrib/restricted/boost/boost/beast/core/impl/handler_ptr.ipp deleted file mode 100644 index 99d1a894d5..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/handler_ptr.ipp +++ /dev/null @@ -1,128 +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_IMPL_HANDLER_PTR_HPP -#define BOOST_BEAST_IMPL_HANDLER_PTR_HPP - -#include <boost/asio/associated_allocator.hpp> -#include <boost/assert.hpp> -#include <memory> - -namespace boost { -namespace beast { - -template<class T, class Handler> -void -handler_ptr<T, Handler>:: -clear() -{ - typename beast::detail::allocator_traits< - boost::asio::associated_allocator_t< - Handler>>::template rebind_alloc<T> alloc( - boost::asio::get_associated_allocator( - handler())); - beast::detail::allocator_traits< - decltype(alloc)>::destroy(alloc, t_); - beast::detail::allocator_traits< - decltype(alloc)>::deallocate(alloc, t_, 1); - t_ = nullptr; -} - -template<class T, class Handler> -handler_ptr<T, Handler>:: -~handler_ptr() -{ - if(t_) - { - clear(); - handler().~Handler(); - } -} - -template<class T, class Handler> -handler_ptr<T, Handler>:: -handler_ptr(handler_ptr&& other) - : t_(other.t_) -{ - if(other.t_) - { - new(&h_) Handler(std::move(other.handler())); - other.handler().~Handler(); - other.t_ = nullptr; - } -} - -template<class T, class Handler> -template<class DeducedHandler, class... Args> -handler_ptr<T, Handler>:: -handler_ptr(DeducedHandler&& h, Args&&... args) -{ - BOOST_STATIC_ASSERT(! std::is_array<T>::value); - typename beast::detail::allocator_traits< - boost::asio::associated_allocator_t< - Handler>>::template rebind_alloc<T> alloc{ - boost::asio::get_associated_allocator(h)}; - using A = decltype(alloc); - bool destroy = false; - auto deleter = [&alloc, &destroy](T* p) - { - if(destroy) - beast::detail::allocator_traits<A>::destroy(alloc, p); - beast::detail::allocator_traits<A>::deallocate(alloc, p, 1); - }; - std::unique_ptr<T, decltype(deleter)> t{ - beast::detail::allocator_traits<A>::allocate(alloc, 1), deleter}; - beast::detail::allocator_traits<A>::construct(alloc, t.get(), - static_cast<DeducedHandler const&>(h), - std::forward<Args>(args)...); - destroy = true; - new(&h_) Handler(std::forward<DeducedHandler>(h)); - t_ = t.release(); -} - -template<class T, class Handler> -auto -handler_ptr<T, Handler>:: -release_handler() -> - handler_type -{ - BOOST_ASSERT(t_); - clear(); - auto deleter = [](Handler* h) - { - h->~Handler(); - }; - std::unique_ptr< - Handler, decltype(deleter)> destroyer{ - &handler(), deleter}; - return std::move(handler()); -} - -template<class T, class Handler> -template<class... Args> -void -handler_ptr<T, Handler>:: -invoke(Args&&... args) -{ - BOOST_ASSERT(t_); - clear(); - auto deleter = [](Handler* h) - { - h->~Handler(); - }; - std::unique_ptr< - Handler, decltype(deleter)> destroyer{ - &handler(), deleter}; - handler()(std::forward<Args>(args)...); -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/multi_buffer.ipp b/contrib/restricted/boost/boost/beast/core/impl/multi_buffer.ipp deleted file mode 100644 index e7ae541f9c..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/multi_buffer.ipp +++ /dev/null @@ -1,1063 +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_IMPL_MULTI_BUFFER_IPP -#define BOOST_BEAST_IMPL_MULTI_BUFFER_IPP - -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/assert.hpp> -#include <boost/throw_exception.hpp> -#include <algorithm> -#include <exception> -#include <sstream> -#include <string> -#include <utility> - -namespace boost { -namespace beast { - -/* These diagrams illustrate the layout and state variables. - -1 Input and output contained entirely in one element: - - 0 out_ - |<-------------+------------------------------------------->| - in_pos_ out_pos_ out_end_ - - -2 Output contained in first and second elements: - - out_ - |<------+----------+------->| |<----------+-------------->| - in_pos_ out_pos_ out_end_ - - -3 Output contained in the second element: - - out_ - |<------------+------------>| |<----+-------------------->| - in_pos_ out_pos_ out_end_ - - -4 Output contained in second and third elements: - - out_ - |<-----+-------->| |<-------+------>| |<--------------->| - in_pos_ out_pos_ out_end_ - - -5 Input sequence is empty: - - out_ - |<------+------------------>| |<-----------+------------->| - out_pos_ out_end_ - in_pos_ - - -6 Output sequence is empty: - - out_ - |<------+------------------>| |<------+------------------>| - in_pos_ out_pos_ - out_end_ - - -7 The end of output can point to the end of an element. - But out_pos_ should never point to the end: - - out_ - |<------+------------------>| |<------+------------------>| - in_pos_ out_pos_ out_end_ - - -8 When the input sequence entirely fills the last element and - the output sequence is empty, out_ will point to the end of - the list of buffers, and out_pos_ and out_end_ will be 0: - - - |<------+------------------>| out_ == list_.end() - in_pos_ out_pos_ == 0 - out_end_ == 0 -*/ - -template<class Allocator> -class basic_multi_buffer<Allocator>::element - : public boost::intrusive::list_base_hook< - boost::intrusive::link_mode< - boost::intrusive::normal_link>> -{ - using size_type = - typename detail::allocator_traits<Allocator>::size_type; - - size_type const size_; - -public: - element(element const&) = delete; - element& operator=(element const&) = delete; - - explicit - element(size_type n) - : size_(n) - { - } - - size_type - size() const - { - return size_; - } - - char* - data() const - { - return const_cast<char*>( - reinterpret_cast<char const*>(this+1)); - } -}; - -template<class Allocator> -class basic_multi_buffer<Allocator>::const_buffers_type -{ - basic_multi_buffer const* b_; - - friend class basic_multi_buffer; - - explicit - const_buffers_type(basic_multi_buffer const& b); - -public: - using value_type = boost::asio::const_buffer; - - class const_iterator; - - const_buffers_type() = delete; - const_buffers_type(const_buffers_type const&) = default; - const_buffers_type& operator=(const_buffers_type const&) = default; - - const_iterator - begin() const; - - const_iterator - end() const; - - friend - std::size_t - buffer_size(const_buffers_type const& buffers) - { - return buffers.b_->size(); - } -}; - -template<class Allocator> -class basic_multi_buffer<Allocator>::mutable_buffers_type -{ - basic_multi_buffer const* b_; - - friend class basic_multi_buffer; - - explicit - mutable_buffers_type(basic_multi_buffer const& b); - -public: - using value_type = mutable_buffer; - - class const_iterator; - - mutable_buffers_type() = delete; - mutable_buffers_type(mutable_buffers_type const&) = default; - mutable_buffers_type& operator=(mutable_buffers_type const&) = default; - - const_iterator - begin() const; - - const_iterator - end() const; -}; - -//------------------------------------------------------------------------------ - -template<class Allocator> -class basic_multi_buffer<Allocator>::const_buffers_type::const_iterator -{ - basic_multi_buffer const* b_ = nullptr; - typename list_type::const_iterator it_; - -public: - using value_type = - typename const_buffers_type::value_type; - using pointer = value_type const*; - using reference = value_type; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::bidirectional_iterator_tag; - - const_iterator() = default; - const_iterator(const_iterator&& other) = default; - const_iterator(const_iterator const& other) = default; - const_iterator& operator=(const_iterator&& other) = default; - const_iterator& operator=(const_iterator const& other) = default; - - const_iterator(basic_multi_buffer const& b, - typename list_type::const_iterator const& it) - : b_(&b) - , it_(it) - { - } - - bool - operator==(const_iterator const& other) const - { - return b_ == other.b_ && it_ == other.it_; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - auto const& e = *it_; - return value_type{e.data(), - (b_->out_ == b_->list_.end() || - &e != &*b_->out_) ? e.size() : b_->out_pos_} + - (&e == &*b_->list_.begin() ? b_->in_pos_ : 0); - } - - pointer - operator->() const = delete; - - const_iterator& - operator++() - { - ++it_; - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - - const_iterator& - operator--() - { - --it_; - return *this; - } - - const_iterator - operator--(int) - { - auto temp = *this; - --(*this); - return temp; - } -}; - -template<class Allocator> -basic_multi_buffer<Allocator>:: -const_buffers_type:: -const_buffers_type( - basic_multi_buffer const& b) - : b_(&b) -{ -} - -template<class Allocator> -auto -basic_multi_buffer<Allocator>:: -const_buffers_type:: -begin() const -> - const_iterator -{ - return const_iterator{*b_, b_->list_.begin()}; -} - -template<class Allocator> -auto -basic_multi_buffer<Allocator>:: -const_buffers_type:: -end() const -> - const_iterator -{ - return const_iterator{*b_, b_->out_ == - b_->list_.end() ? b_->list_.end() : - std::next(b_->out_)}; -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -class basic_multi_buffer<Allocator>::mutable_buffers_type::const_iterator -{ - basic_multi_buffer const* b_ = nullptr; - typename list_type::const_iterator it_; - -public: - using value_type = - typename mutable_buffers_type::value_type; - using pointer = value_type const*; - using reference = value_type; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::bidirectional_iterator_tag; - - const_iterator() = default; - const_iterator(const_iterator&& other) = default; - const_iterator(const_iterator const& other) = default; - const_iterator& operator=(const_iterator&& other) = default; - const_iterator& operator=(const_iterator const& other) = default; - - const_iterator(basic_multi_buffer const& b, - typename list_type::const_iterator const& it) - : b_(&b) - , it_(it) - { - } - - bool - operator==(const_iterator const& other) const - { - return b_ == other.b_ && it_ == other.it_; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - auto const& e = *it_; - return value_type{e.data(), - &e == &*std::prev(b_->list_.end()) ? - b_->out_end_ : e.size()} + - (&e == &*b_->out_ ? b_->out_pos_ : 0); - } - - pointer - operator->() const = delete; - - const_iterator& - operator++() - { - ++it_; - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - - const_iterator& - operator--() - { - --it_; - return *this; - } - - const_iterator - operator--(int) - { - auto temp = *this; - --(*this); - return temp; - } -}; - -template<class Allocator> -basic_multi_buffer<Allocator>:: -mutable_buffers_type:: -mutable_buffers_type( - basic_multi_buffer const& b) - : b_(&b) -{ -} - -template<class Allocator> -auto -basic_multi_buffer<Allocator>:: -mutable_buffers_type:: -begin() const -> - const_iterator -{ - return const_iterator{*b_, b_->out_}; -} - -template<class Allocator> -auto -basic_multi_buffer<Allocator>:: -mutable_buffers_type:: -end() const -> - const_iterator -{ - return const_iterator{*b_, b_->list_.end()}; -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -basic_multi_buffer<Allocator>:: -~basic_multi_buffer() -{ - delete_list(); -} - -template<class Allocator> -basic_multi_buffer<Allocator>:: -basic_multi_buffer() - : out_(list_.end()) -{ -} - -template<class Allocator> -basic_multi_buffer<Allocator>:: -basic_multi_buffer(std::size_t limit) - : max_(limit) - , out_(list_.end()) -{ -} - -template<class Allocator> -basic_multi_buffer<Allocator>:: -basic_multi_buffer(Allocator const& alloc) - : detail::empty_base_optimization< - base_alloc_type>(alloc) - , out_(list_.end()) -{ -} - -template<class Allocator> -basic_multi_buffer<Allocator>:: -basic_multi_buffer(std::size_t limit, - Allocator const& alloc) - : detail::empty_base_optimization< - base_alloc_type>(alloc) - , max_(limit) - , out_(list_.end()) -{ -} - -template<class Allocator> -basic_multi_buffer<Allocator>:: -basic_multi_buffer(basic_multi_buffer&& other) - : detail::empty_base_optimization< - base_alloc_type>(std::move(other.member())) - , max_(other.max_) - , in_size_(other.in_size_) - , in_pos_(other.in_pos_) - , out_pos_(other.out_pos_) - , out_end_(other.out_end_) -{ - auto const at_end = - other.out_ == other.list_.end(); - list_ = std::move(other.list_); - out_ = at_end ? list_.end() : other.out_; - other.in_size_ = 0; - other.out_ = other.list_.end(); - other.in_pos_ = 0; - other.out_pos_ = 0; - other.out_end_ = 0; -} - -template<class Allocator> -basic_multi_buffer<Allocator>:: -basic_multi_buffer(basic_multi_buffer&& other, - Allocator const& alloc) - : detail::empty_base_optimization< - base_alloc_type>(alloc) - , max_(other.max_) -{ - if(this->member() != other.member()) - { - out_ = list_.end(); - copy_from(other); - other.reset(); - } - else - { - auto const at_end = - other.out_ == other.list_.end(); - list_ = std::move(other.list_); - out_ = at_end ? list_.end() : other.out_; - in_size_ = other.in_size_; - in_pos_ = other.in_pos_; - out_pos_ = other.out_pos_; - out_end_ = other.out_end_; - other.in_size_ = 0; - other.out_ = other.list_.end(); - other.in_pos_ = 0; - other.out_pos_ = 0; - other.out_end_ = 0; - } -} - -template<class Allocator> -basic_multi_buffer<Allocator>:: -basic_multi_buffer(basic_multi_buffer const& other) - : detail::empty_base_optimization< - base_alloc_type>(alloc_traits:: - select_on_container_copy_construction( - other.member())) - , max_(other.max_) - , out_(list_.end()) -{ - copy_from(other); -} - -template<class Allocator> -basic_multi_buffer<Allocator>:: -basic_multi_buffer(basic_multi_buffer const& other, - Allocator const& alloc) - : detail::empty_base_optimization< - base_alloc_type>(alloc) - , max_(other.max_) - , out_(list_.end()) -{ - copy_from(other); -} - -template<class Allocator> -template<class OtherAlloc> -basic_multi_buffer<Allocator>:: -basic_multi_buffer( - basic_multi_buffer<OtherAlloc> const& other) - : out_(list_.end()) -{ - copy_from(other); -} - -template<class Allocator> -template<class OtherAlloc> -basic_multi_buffer<Allocator>:: -basic_multi_buffer( - basic_multi_buffer<OtherAlloc> const& other, - allocator_type const& alloc) - : detail::empty_base_optimization< - base_alloc_type>(alloc) - , max_(other.max_) - , out_(list_.end()) -{ - copy_from(other); -} - -template<class Allocator> -auto -basic_multi_buffer<Allocator>:: -operator=(basic_multi_buffer&& other) -> - basic_multi_buffer& -{ - if(this == &other) - return *this; - reset(); - max_ = other.max_; - move_assign(other, std::integral_constant<bool, - alloc_traits::propagate_on_container_move_assignment::value>{}); - return *this; -} - -template<class Allocator> -auto -basic_multi_buffer<Allocator>:: -operator=(basic_multi_buffer const& other) -> -basic_multi_buffer& -{ - if(this == &other) - return *this; - copy_assign(other, std::integral_constant<bool, - alloc_traits::propagate_on_container_copy_assignment::value>{}); - return *this; -} - -template<class Allocator> -template<class OtherAlloc> -auto -basic_multi_buffer<Allocator>:: -operator=( - basic_multi_buffer<OtherAlloc> const& other) -> - basic_multi_buffer& -{ - reset(); - max_ = other.max_; - copy_from(other); - return *this; -} - -template<class Allocator> -std::size_t -basic_multi_buffer<Allocator>:: -capacity() const -{ - auto pos = out_; - if(pos == list_.end()) - return in_size_; - auto n = pos->size() - out_pos_; - while(++pos != list_.end()) - n += pos->size(); - return in_size_ + n; -} - -template<class Allocator> -auto -basic_multi_buffer<Allocator>:: -data() const -> - const_buffers_type -{ - return const_buffers_type(*this); -} - -template<class Allocator> -auto -basic_multi_buffer<Allocator>:: -prepare(size_type n) -> - mutable_buffers_type -{ - if(in_size_ + n > max_) - BOOST_THROW_EXCEPTION(std::length_error{ - "dynamic buffer overflow"}); - list_type reuse; - std::size_t total = in_size_; - // put all empty buffers on reuse list - if(out_ != list_.end()) - { - total += out_->size() - out_pos_; - if(out_ != list_.iterator_to(list_.back())) - { - out_end_ = out_->size(); - reuse.splice(reuse.end(), list_, - std::next(out_), list_.end()); - #if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); - #endif - } - auto const avail = out_->size() - out_pos_; - if(n > avail) - { - out_end_ = out_->size(); - n -= avail; - } - else - { - out_end_ = out_pos_ + n; - n = 0; - } - #if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); - #endif - } - // get space from reuse buffers - while(n > 0 && ! reuse.empty()) - { - auto& e = reuse.front(); - reuse.erase(reuse.iterator_to(e)); - list_.push_back(e); - total += e.size(); - if(n > e.size()) - { - out_end_ = e.size(); - n -= e.size(); - } - else - { - out_end_ = n; - n = 0; - } - #if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); - #endif - } - BOOST_ASSERT(total <= max_); - if(! reuse.empty() || n > 0) - { - for(auto it = reuse.begin(); it != reuse.end();) - { - auto& e = *it++; - reuse.erase(list_.iterator_to(e)); - auto const len = sizeof(e) + e.size(); - alloc_traits::destroy(this->member(), &e); - alloc_traits::deallocate(this->member(), - reinterpret_cast<char*>(&e), len); - } - if(n > 0) - { - static auto const growth_factor = 2.0f; - auto const size = - (std::min<std::size_t>)( - max_ - total, - (std::max<std::size_t>)({ - static_cast<std::size_t>( - in_size_ * growth_factor - in_size_), - 512, - n})); - auto& e = *reinterpret_cast<element*>(static_cast< - void*>(alloc_traits::allocate(this->member(), - sizeof(element) + size))); - alloc_traits::construct(this->member(), &e, size); - list_.push_back(e); - if(out_ == list_.end()) - out_ = list_.iterator_to(e); - out_end_ = n; - #if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); - #endif - } - } - return mutable_buffers_type(*this); -} - -template<class Allocator> -void -basic_multi_buffer<Allocator>:: -commit(size_type n) -{ - if(list_.empty()) - return; - if(out_ == list_.end()) - return; - auto const back = - list_.iterator_to(list_.back()); - while(out_ != back) - { - auto const avail = - out_->size() - out_pos_; - if(n < avail) - { - out_pos_ += n; - in_size_ += n; - #if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); - #endif - return; - } - ++out_; - n -= avail; - out_pos_ = 0; - in_size_ += avail; - #if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); - #endif - } - - n = (std::min)(n, out_end_ - out_pos_); - out_pos_ += n; - in_size_ += n; - if(out_pos_ == out_->size()) - { - ++out_; - out_pos_ = 0; - out_end_ = 0; - } -#if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); -#endif -} - -template<class Allocator> -void -basic_multi_buffer<Allocator>:: -consume(size_type n) -{ - if(list_.empty()) - return; - for(;;) - { - if(list_.begin() != out_) - { - auto const avail = - list_.front().size() - in_pos_; - if(n < avail) - { - in_size_ -= n; - in_pos_ += n; - #if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); - #endif - break; - } - n -= avail; - in_size_ -= avail; - in_pos_ = 0; - auto& e = list_.front(); - list_.erase(list_.iterator_to(e)); - auto const len = sizeof(e) + e.size(); - alloc_traits::destroy(this->member(), &e); - alloc_traits::deallocate(this->member(), - reinterpret_cast<char*>(&e), len); - #if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); - #endif - } - else - { - auto const avail = out_pos_ - in_pos_; - if(n < avail) - { - in_size_ -= n; - in_pos_ += n; - } - else - { - in_size_ = 0; - if(out_ != list_.iterator_to(list_.back()) || - out_pos_ != out_end_) - { - in_pos_ = out_pos_; - } - else - { - // Input and output sequences are empty, reuse buffer. - // Alternatively we could deallocate it. - in_pos_ = 0; - out_pos_ = 0; - out_end_ = 0; - } - } - #if BOOST_BEAST_MULTI_BUFFER_DEBUG_CHECK - debug_check(); - #endif - break; - } - } -} - -template<class Allocator> -inline -void -basic_multi_buffer<Allocator>:: -delete_list() -{ - for(auto iter = list_.begin(); iter != list_.end();) - { - auto& e = *iter++; - auto const len = sizeof(e) + e.size(); - alloc_traits::destroy(this->member(), &e); - alloc_traits::deallocate(this->member(), - reinterpret_cast<char*>(&e), len); - } -} - -template<class Allocator> -inline -void -basic_multi_buffer<Allocator>:: -reset() -{ - delete_list(); - list_.clear(); - out_ = list_.end(); - in_size_ = 0; - in_pos_ = 0; - out_pos_ = 0; - out_end_ = 0; -} - -template<class Allocator> -template<class DynamicBuffer> -inline -void -basic_multi_buffer<Allocator>:: -copy_from(DynamicBuffer const& buffer) -{ - if(buffer.size() == 0) - return; - using boost::asio::buffer_copy; - commit(buffer_copy( - prepare(buffer.size()), buffer.data())); -} - -template<class Allocator> -inline -void -basic_multi_buffer<Allocator>:: -move_assign(basic_multi_buffer& other, std::false_type) -{ - if(this->member() != other.member()) - { - copy_from(other); - other.reset(); - } - else - { - move_assign(other, std::true_type{}); - } -} - -template<class Allocator> -inline -void -basic_multi_buffer<Allocator>:: -move_assign(basic_multi_buffer& other, std::true_type) -{ - this->member() = std::move(other.member()); - auto const at_end = - other.out_ == other.list_.end(); - list_ = std::move(other.list_); - out_ = at_end ? list_.end() : other.out_; - - in_size_ = other.in_size_; - in_pos_ = other.in_pos_; - out_pos_ = other.out_pos_; - out_end_ = other.out_end_; - - other.in_size_ = 0; - other.out_ = other.list_.end(); - other.in_pos_ = 0; - other.out_pos_ = 0; - other.out_end_ = 0; -} - -template<class Allocator> -inline -void -basic_multi_buffer<Allocator>:: -copy_assign( - basic_multi_buffer const& other, std::false_type) -{ - reset(); - max_ = other.max_; - copy_from(other); -} - -template<class Allocator> -inline -void -basic_multi_buffer<Allocator>:: -copy_assign( - basic_multi_buffer const& other, std::true_type) -{ - reset(); - max_ = other.max_; - this->member() = other.member(); - copy_from(other); -} - -template<class Allocator> -inline -void -basic_multi_buffer<Allocator>:: -swap(basic_multi_buffer& other) -{ - swap(other, typename - alloc_traits::propagate_on_container_swap{}); -} - -template<class Allocator> -inline -void -basic_multi_buffer<Allocator>:: -swap(basic_multi_buffer& other, std::true_type) -{ - using std::swap; - auto const at_end0 = - out_ == list_.end(); - auto const at_end1 = - other.out_ == other.list_.end(); - swap(this->member(), other.member()); - swap(list_, other.list_); - swap(out_, other.out_); - if(at_end1) - out_ = list_.end(); - if(at_end0) - other.out_ = other.list_.end(); - swap(in_size_, other.in_size_); - swap(in_pos_, other.in_pos_); - swap(out_pos_, other.out_pos_); - swap(out_end_, other.out_end_); -} - -template<class Allocator> -inline -void -basic_multi_buffer<Allocator>:: -swap(basic_multi_buffer& other, std::false_type) -{ - BOOST_ASSERT(this->member() == other.member()); - using std::swap; - auto const at_end0 = - out_ == list_.end(); - auto const at_end1 = - other.out_ == other.list_.end(); - swap(list_, other.list_); - swap(out_, other.out_); - if(at_end1) - out_ = list_.end(); - if(at_end0) - other.out_ = other.list_.end(); - swap(in_size_, other.in_size_); - swap(in_pos_, other.in_pos_); - swap(out_pos_, other.out_pos_); - swap(out_end_, other.out_end_); -} - -template<class Allocator> -void -swap( - basic_multi_buffer<Allocator>& lhs, - basic_multi_buffer<Allocator>& rhs) -{ - lhs.swap(rhs); -} - -template<class Allocator> -void -basic_multi_buffer<Allocator>:: -debug_check() const -{ -#ifndef NDEBUG - using boost::asio::buffer_size; - BOOST_ASSERT(buffer_size(data()) == in_size_); - if(list_.empty()) - { - BOOST_ASSERT(in_pos_ == 0); - BOOST_ASSERT(in_size_ == 0); - BOOST_ASSERT(out_pos_ == 0); - BOOST_ASSERT(out_end_ == 0); - BOOST_ASSERT(out_ == list_.end()); - return; - } - - auto const& front = list_.front(); - - BOOST_ASSERT(in_pos_ < front.size()); - - if(out_ == list_.end()) - { - BOOST_ASSERT(out_pos_ == 0); - BOOST_ASSERT(out_end_ == 0); - } - else - { - auto const& out = *out_; - auto const& back = list_.back(); - - BOOST_ASSERT(out_end_ <= back.size()); - BOOST_ASSERT(out_pos_ < out.size()); - BOOST_ASSERT(&out != &front || out_pos_ >= in_pos_); - BOOST_ASSERT(&out != &front || out_pos_ - in_pos_ == in_size_); - BOOST_ASSERT(&out != &back || out_pos_ <= out_end_); - } -#endif -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/read_size.ipp b/contrib/restricted/boost/boost/beast/core/impl/read_size.ipp deleted file mode 100644 index ddcaf397a9..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/read_size.ipp +++ /dev/null @@ -1,80 +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_IMPL_READ_SIZE_IPP -#define BOOST_BEAST_IMPL_READ_SIZE_IPP - -namespace boost { -namespace beast { - -namespace detail { - -template<class T, class = void> -struct has_read_size_helper : std::false_type {}; - -template<class T> -struct has_read_size_helper<T, decltype( - read_size_helper(std::declval<T&>(), 512), - (void)0)> : std::true_type -{ -}; - -template<class DynamicBuffer> -std::size_t -read_size(DynamicBuffer& buffer, - std::size_t max_size, std::true_type) -{ - return read_size_helper(buffer, max_size); -} - -template<class DynamicBuffer> -std::size_t -read_size(DynamicBuffer& buffer, - std::size_t max_size, std::false_type) -{ - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - BOOST_ASSERT(max_size >= 1); - auto const size = buffer.size(); - auto const limit = buffer.max_size() - size; - BOOST_ASSERT(size <= buffer.max_size()); - return (std::min<std::size_t>)( - (std::max<std::size_t>)(512, buffer.capacity() - size), - (std::min<std::size_t>)(max_size, limit)); -} - -} // detail - -template<class DynamicBuffer> -inline -std::size_t -read_size( - DynamicBuffer& buffer, std::size_t max_size) -{ - return detail::read_size(buffer, max_size, - detail::has_read_size_helper<DynamicBuffer>{}); -} - -template<class DynamicBuffer> -std::size_t -read_size_or_throw( - DynamicBuffer& buffer, std::size_t max_size) -{ - auto const n = read_size(buffer, max_size); - if(n == 0) - BOOST_THROW_EXCEPTION(std::length_error{ - "buffer overflow"}); - return n; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/static_buffer.ipp b/contrib/restricted/boost/boost/beast/core/impl/static_buffer.ipp deleted file mode 100644 index 2fdb2d9a8a..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/static_buffer.ipp +++ /dev/null @@ -1,169 +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_IMPL_STATIC_BUFFER_IPP -#define BOOST_BEAST_IMPL_STATIC_BUFFER_IPP - -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/throw_exception.hpp> -#include <algorithm> -#include <cstring> -#include <iterator> -#include <stdexcept> - -namespace boost { -namespace beast { - -inline -static_buffer_base:: -static_buffer_base(void* p, std::size_t size) - : begin_(reinterpret_cast<char*>(p)) - , capacity_(size) -{ -} - -inline -auto -static_buffer_base:: -data() const -> - const_buffers_type -{ - using boost::asio::const_buffer; - const_buffers_type result; - if(in_off_ + in_size_ <= capacity_) - { - result[0] = const_buffer{begin_ + in_off_, in_size_}; - result[1] = const_buffer{begin_, 0}; - } - else - { - result[0] = const_buffer{begin_ + in_off_, capacity_ - in_off_}; - result[1] = const_buffer{begin_, in_size_ - (capacity_ - in_off_)}; - } - return result; -} - -inline -auto -static_buffer_base:: -mutable_data() -> - mutable_buffers_type -{ - using boost::asio::mutable_buffer; - mutable_buffers_type result; - if(in_off_ + in_size_ <= capacity_) - { - result[0] = mutable_buffer{begin_ + in_off_, in_size_}; - result[1] = mutable_buffer{begin_, 0}; - } - else - { - result[0] = mutable_buffer{begin_ + in_off_, capacity_ - in_off_}; - result[1] = mutable_buffer{begin_, in_size_ - (capacity_ - in_off_)}; - } - return result; -} - -inline -auto -static_buffer_base:: -prepare(std::size_t size) -> - mutable_buffers_type -{ - using boost::asio::mutable_buffer; - if(size > capacity_ - in_size_) - BOOST_THROW_EXCEPTION(std::length_error{ - "buffer overflow"}); - out_size_ = size; - auto const out_off = (in_off_ + in_size_) % capacity_; - mutable_buffers_type result; - if(out_off + out_size_ <= capacity_ ) - { - result[0] = mutable_buffer{begin_ + out_off, out_size_}; - result[1] = mutable_buffer{begin_, 0}; - } - else - { - result[0] = mutable_buffer{begin_ + out_off, capacity_ - out_off}; - result[1] = mutable_buffer{begin_, out_size_ - (capacity_ - out_off)}; - } - return result; -} - -inline -void -static_buffer_base:: -commit(std::size_t size) -{ - in_size_ += (std::min)(size, out_size_); - out_size_ = 0; -} - -inline -void -static_buffer_base:: -consume(std::size_t size) -{ - if(size < in_size_) - { - in_off_ = (in_off_ + size) % capacity_; - in_size_ -= size; - } - else - { - // rewind the offset, so the next call to prepare - // can have a longer continguous segment. this helps - // algorithms optimized for larger buffesr. - in_off_ = 0; - in_size_ = 0; - } -} - -inline -void -static_buffer_base:: -reset(void* p, std::size_t size) -{ - begin_ = reinterpret_cast<char*>(p); - capacity_ = size; - in_off_ = 0; - in_size_ = 0; - out_size_ = 0; -} - -//------------------------------------------------------------------------------ - -template<std::size_t N> -static_buffer<N>:: -static_buffer(static_buffer const& other) - : static_buffer_base(buf_, N) -{ - using boost::asio::buffer_copy; - this->commit(buffer_copy( - this->prepare(other.size()), other.data())); -} - -template<std::size_t N> -auto -static_buffer<N>:: -operator=(static_buffer const& other) -> - static_buffer<N>& -{ - using boost::asio::buffer_copy; - this->consume(this->size()); - this->commit(buffer_copy( - this->prepare(other.size()), other.data())); - return *this; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/static_string.ipp b/contrib/restricted/boost/boost/beast/core/impl/static_string.ipp deleted file mode 100644 index 29571dfeee..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/static_string.ipp +++ /dev/null @@ -1,618 +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_IMPL_STATIC_STRING_IPP -#define BOOST_BEAST_IMPL_STATIC_STRING_IPP - -#include <boost/beast/core/detail/static_string.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/throw_exception.hpp> - -namespace boost { -namespace beast { - -// -// (constructor) -// - -template<std::size_t N, class CharT, class Traits> -static_string<N, CharT, Traits>:: -static_string() -{ - n_ = 0; - term(); -} - -template<std::size_t N, class CharT, class Traits> -static_string<N, CharT, Traits>:: -static_string(size_type count, CharT ch) -{ - assign(count, ch); -} - -template<std::size_t N, class CharT, class Traits> -template<std::size_t M> -static_string<N, CharT, Traits>:: -static_string(static_string<M, CharT, Traits> const& other, - size_type pos) -{ - assign(other, pos); -} - -template<std::size_t N, class CharT, class Traits> -template<std::size_t M> -static_string<N, CharT, Traits>:: -static_string(static_string<M, CharT, Traits> const& other, - size_type pos, size_type count) -{ - assign(other, pos, count); -} - -template<std::size_t N, class CharT, class Traits> -static_string<N, CharT, Traits>:: -static_string(CharT const* s, size_type count) -{ - assign(s, count); -} - -template<std::size_t N, class CharT, class Traits> -static_string<N, CharT, Traits>:: -static_string(CharT const* s) -{ - assign(s); -} - -template<std::size_t N, class CharT, class Traits> -template<class InputIt> -static_string<N, CharT, Traits>:: -static_string(InputIt first, InputIt last) -{ - assign(first, last); -} - -template<std::size_t N, class CharT, class Traits> -static_string<N, CharT, Traits>:: -static_string(static_string const& s) -{ - assign(s); -} - -template<std::size_t N, class CharT, class Traits> -template<std::size_t M> -static_string<N, CharT, Traits>:: -static_string(static_string<M, CharT, Traits> const& s) -{ - assign(s); -} - -template<std::size_t N, class CharT, class Traits> -static_string<N, CharT, Traits>:: -static_string(std::initializer_list<CharT> init) -{ - assign(init.begin(), init.end()); -} - -template<std::size_t N, class CharT, class Traits> -static_string<N, CharT, Traits>:: -static_string(string_view_type sv) -{ - assign(sv); -} - -template<std::size_t N, class CharT, class Traits> -template<class T, class> -static_string<N, CharT, Traits>:: -static_string(T const& t, size_type pos, size_type n) -{ - assign(t, pos, n); -} - -// -// (assignment) -// - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -assign(size_type count, CharT ch) -> - static_string& -{ - if(count > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "count > max_size()"}); - n_ = count; - Traits::assign(&s_[0], n_, ch); - term(); - return *this; -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -assign(static_string const& str) -> - static_string& -{ - n_ = str.n_; - Traits::copy(&s_[0], &str.s_[0], n_ + 1); - return *this; -} - -template<std::size_t N, class CharT, class Traits> -template<std::size_t M> -auto -static_string<N, CharT, Traits>:: -assign(static_string<M, CharT, Traits> const& str, - size_type pos, size_type count) -> - static_string& -{ - auto const ss = str.substr(pos, count); - return assign(ss.data(), ss.size()); -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -assign(CharT const* s, size_type count) -> - static_string& -{ - if(count > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "count > max_size()"}); - n_ = count; - Traits::copy(&s_[0], s, n_); - term(); - return *this; -} - -template<std::size_t N, class CharT, class Traits> -template<class InputIt> -auto -static_string<N, CharT, Traits>:: -assign(InputIt first, InputIt last) -> - static_string& -{ - std::size_t const n = std::distance(first, last); - if(n > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "n > max_size()"}); - n_ = n; - for(auto it = &s_[0]; first != last; ++it, ++first) - Traits::assign(*it, *first); - term(); - return *this; -} - -template<std::size_t N, class CharT, class Traits> -template<class T> -auto -static_string<N, CharT, Traits>:: -assign(T const& t, size_type pos, size_type count) -> - typename std::enable_if<std::is_convertible<T, - string_view_type>::value, static_string&>::type -{ - auto const sv = string_view_type(t).substr(pos, count); - if(sv.size() > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "sv.size() > max_size()"}); - n_ = sv.size(); - Traits::copy(&s_[0], &sv[0], n_); - term(); - return *this; -} - -// -// Element access -// - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -at(size_type pos) -> - reference -{ - if(pos >= size()) - BOOST_THROW_EXCEPTION(std::out_of_range{ - "pos >= size()"}); - return s_[pos]; -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -at(size_type pos) const -> - const_reference -{ - if(pos >= size()) - BOOST_THROW_EXCEPTION(std::out_of_range{ - "pos >= size()"}); - return s_[pos]; -} - -// -// Capacity -// - -template<std::size_t N, class CharT, class Traits> -void -static_string<N, CharT, Traits>:: -reserve(std::size_t n) -{ - if(n > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "n > max_size()"}); -} - -// -// Operations -// - -template<std::size_t N, class CharT, class Traits> -void -static_string<N, CharT, Traits>:: -clear() -{ - n_ = 0; - term(); -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -insert(size_type index, size_type count, CharT ch) -> - static_string& -{ - if(index > size()) - BOOST_THROW_EXCEPTION(std::out_of_range{ - "index > size()"}); - insert(begin() + index, count, ch); - return *this; -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -insert(size_type index, CharT const* s, size_type count) -> - static_string& -{ - if(index > size()) - BOOST_THROW_EXCEPTION(std::out_of_range{ - "index > size()"}); - if(size() + count > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "size() + count > max_size()"}); - Traits::move( - &s_[index + count], &s_[index], size() - index); - n_ += count; - Traits::copy(&s_[index], s, count); - term(); - return *this; -} - -template<std::size_t N, class CharT, class Traits> -template<std::size_t M> -auto -static_string<N, CharT, Traits>:: -insert(size_type index, - static_string<M, CharT, Traits> const& str, - size_type index_str, size_type count) -> - static_string& -{ - auto const ss = str.substr(index_str, count); - return insert(index, ss.data(), ss.size()); -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -insert(const_iterator pos, size_type count, CharT ch) -> - iterator -{ - if(size() + count > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "size() + count() > max_size()"}); - auto const index = pos - &s_[0]; - Traits::move( - &s_[index + count], &s_[index], size() - index); - n_ += count; - Traits::assign(&s_[index], count, ch); - term(); - return &s_[index]; -} - -template<std::size_t N, class CharT, class Traits> -template<class InputIt> -auto -static_string<N, CharT, Traits>:: -insert(const_iterator pos, InputIt first, InputIt last) -> - typename std::enable_if< - detail::is_input_iterator<InputIt>::value, - iterator>::type -{ - std::size_t const count = std::distance(first, last); - if(size() + count > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "size() + count > max_size()"}); - std::size_t const index = pos - begin(); - Traits::move( - &s_[index + count], &s_[index], size() - index); - n_ += count; - for(auto it = begin() + index; - first != last; ++it, ++first) - Traits::assign(*it, *first); - term(); - return begin() + index; -} - -template<std::size_t N, class CharT, class Traits> -template<class T> -auto -static_string<N, CharT, Traits>:: -insert(size_type index, const T& t, - size_type index_str, size_type count) -> - typename std::enable_if<std::is_convertible< - T const&, string_view_type>::value && - ! std::is_convertible<T const&, CharT const*>::value, - static_string&>::type -{ - auto const str = - string_view_type(t).substr(index_str, count); - return insert(index, str.data(), str.size()); -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -erase(size_type index, size_type count) -> - static_string& -{ - if(index > size()) - BOOST_THROW_EXCEPTION(std::out_of_range{ - "index > size()"}); - auto const n = (std::min)(count, size() - index); - Traits::move( - &s_[index], &s_[index + n], size() - (index + n) + 1); - n_ -= n; - return *this; -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -erase(const_iterator pos) -> - iterator -{ - erase(pos - begin(), 1); - return begin() + (pos - begin()); -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -erase(const_iterator first, const_iterator last) -> - iterator -{ - erase(first - begin(), - std::distance(first, last)); - return begin() + (first - begin()); -} - -template<std::size_t N, class CharT, class Traits> -void -static_string<N, CharT, Traits>:: -push_back(CharT ch) -{ - if(size() >= max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "size() >= max_size()"}); - Traits::assign(s_[n_++], ch); - term(); -} - -template<std::size_t N, class CharT, class Traits> -template<std::size_t M> -auto -static_string<N, CharT, Traits>:: -append(static_string<M, CharT, Traits> const& str, - size_type pos, size_type count) -> - static_string& -{ - // Valid range is [0, size) - if(pos >= str.size()) - BOOST_THROW_EXCEPTION(std::out_of_range{ - "pos > str.size()"}); - string_view_type const ss{&str.s_[pos], - (std::min)(count, str.size() - pos)}; - insert(size(), ss.data(), ss.size()); - return *this; -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -substr(size_type pos, size_type count) const -> - string_view_type -{ - if(pos > size()) - BOOST_THROW_EXCEPTION(std::out_of_range{ - "pos > size()"}); - return{&s_[pos], (std::min)(count, size() - pos)}; -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -copy(CharT* dest, size_type count, size_type pos) const -> - size_type -{ - auto const str = substr(pos, count); - Traits::copy(dest, str.data(), str.size()); - return str.size(); -} - -template<std::size_t N, class CharT, class Traits> -void -static_string<N, CharT, Traits>:: -resize(std::size_t n) -{ - if(n > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "n > max_size()"}); - n_ = n; - term(); -} - -template<std::size_t N, class CharT, class Traits> -void -static_string<N, CharT, Traits>:: -resize(std::size_t n, CharT c) -{ - if(n > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "n > max_size()"}); - if(n > n_) - Traits::assign(&s_[n_], n - n_, c); - n_ = n; - term(); -} - -template<std::size_t N, class CharT, class Traits> -void -static_string<N, CharT, Traits>:: -swap(static_string& str) -{ - static_string tmp(str); - str.n_ = n_; - Traits::copy(&str.s_[0], &s_[0], n_ + 1); - n_ = tmp.n_; - Traits::copy(&s_[0], &tmp.s_[0], n_ + 1); -} - -template<std::size_t N, class CharT, class Traits> -template<std::size_t M> -void -static_string<N, CharT, Traits>:: -swap(static_string<M, CharT, Traits>& str) -{ - if(size() > str.max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "size() > str.max_size()"}); - if(str.size() > max_size()) - BOOST_THROW_EXCEPTION(std::length_error{ - "str.size() > max_size()"}); - static_string tmp(str); - str.n_ = n_; - Traits::copy(&str.s_[0], &s_[0], n_ + 1); - n_ = tmp.n_; - Traits::copy(&s_[0], &tmp.s_[0], n_ + 1); -} - - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -assign_char(CharT ch, std::true_type) -> - static_string& -{ - n_ = 1; - Traits::assign(s_[0], ch); - term(); - return *this; -} - -template<std::size_t N, class CharT, class Traits> -auto -static_string<N, CharT, Traits>:: -assign_char(CharT, std::false_type) -> - static_string& -{ - BOOST_THROW_EXCEPTION(std::length_error{ - "max_size() == 0"}); -} - -namespace detail { - -template<class Integer> -static_string<max_digits(sizeof(Integer))> -to_static_string(Integer x, std::true_type) -{ - if(x == 0) - return {'0'}; - static_string<detail::max_digits( - sizeof(Integer))> s; - if(x < 0) - { - x = -x; - char buf[max_digits(sizeof(x))]; - char* p = buf; - for(;x > 0; x /= 10) - *p++ = "0123456789"[x % 10]; - s.resize(1 + p - buf); - s[0] = '-'; - auto d = &s[1]; - while(p > buf) - *d++ = *--p; - } - else - { - char buf[max_digits(sizeof(x))]; - char* p = buf; - for(;x > 0; x /= 10) - *p++ = "0123456789"[x % 10]; - s.resize(p - buf); - auto d = &s[0]; - while(p > buf) - *d++ = *--p; - } - return s; -} - -template<class Integer> -static_string<max_digits(sizeof(Integer))> -to_static_string(Integer x, std::false_type) -{ - if(x == 0) - return {'0'}; - char buf[max_digits(sizeof(x))]; - char* p = buf; - for(;x > 0; x /= 10) - *p++ = "0123456789"[x % 10]; - static_string<detail::max_digits( - sizeof(Integer))> s; - s.resize(p - buf); - auto d = &s[0]; - while(p > buf) - *d++ = *--p; - return s; -} - -} // detail - -template<class Integer> -static_string<detail::max_digits(sizeof(Integer))> -to_static_string(Integer x) -{ - using CharT = char; - using Traits = std::char_traits<CharT>; - BOOST_STATIC_ASSERT(std::is_integral<Integer>::value); - char buf[detail::max_digits(sizeof(Integer))]; - auto last = buf + sizeof(buf); - auto it = detail::raw_to_string< - CharT, Integer, Traits>(last, sizeof(buf), x); - static_string<detail::max_digits(sizeof(Integer))> s; - s.resize(static_cast<std::size_t>(last - it)); - auto p = s.data(); - while(it < last) - Traits::assign(*p++, *it++); - return s; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/impl/string_param.ipp b/contrib/restricted/boost/boost/beast/core/impl/string_param.ipp deleted file mode 100644 index a60771cc12..0000000000 --- a/contrib/restricted/boost/boost/beast/core/impl/string_param.ipp +++ /dev/null @@ -1,108 +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_IMPL_STRING_PARAM_IPP -#define BOOST_BEAST_IMPL_STRING_PARAM_IPP - -namespace boost { -namespace beast { - -template<class T> -typename std::enable_if< - std::is_integral<T>::value>::type -string_param:: -print(T const& t) -{ - auto const last = buf_ + sizeof(buf_); - auto const it = detail::raw_to_string< - char, T, std::char_traits<char>>( - last, sizeof(buf_), t); - sv_ = {it, static_cast<std::size_t>( - last - it)}; -} - -template<class T> -typename std::enable_if< - ! std::is_integral<T>::value && - ! std::is_convertible<T, string_view>::value ->::type -string_param:: -print(T const& t) -{ - os_.emplace(buf_, sizeof(buf_)); - *os_ << t; - os_->flush(); - sv_ = os_->str(); -} - -inline -void -string_param:: -print(string_view sv) -{ - sv_ = sv; -} - -template<class T> -typename std::enable_if< - std::is_integral<T>::value>::type -string_param:: -print_1(T const& t) -{ - char buf[detail::max_digits(sizeof(T))]; - auto const last = buf + sizeof(buf); - auto const it = detail::raw_to_string< - char, T, std::char_traits<char>>( - last, sizeof(buf), t); - *os_ << string_view{it, - static_cast<std::size_t>(last - it)}; -} - -template<class T> -typename std::enable_if< - ! std::is_integral<T>::value>::type -string_param:: -print_1(T const& t) -{ - *os_ << t; -} - -template<class T0, class... TN> -void -string_param:: -print_n(T0 const& t0, TN const&... tn) -{ - print_1(t0); - print_n(tn...); -} - -template<class T0, class T1, class... TN> -void -string_param:: -print(T0 const& t0, T1 const& t1, TN const&... tn) -{ - os_.emplace(buf_, sizeof(buf_)); - print_1(t0); - print_1(t1); - print_n(tn...); - os_->flush(); - sv_ = os_->str(); -} - -template<class... Args> -string_param:: -string_param(Args const&... args) -{ - print(args...); -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/multi_buffer.hpp b/contrib/restricted/boost/boost/beast/core/multi_buffer.hpp deleted file mode 100644 index ee14b419a5..0000000000 --- a/contrib/restricted/boost/boost/beast/core/multi_buffer.hpp +++ /dev/null @@ -1,322 +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_MULTI_BUFFER_HPP -#define BOOST_BEAST_MULTI_BUFFER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/detail/allocator.hpp> -#include <boost/beast/core/detail/empty_base_optimization.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/intrusive/list.hpp> -#include <iterator> -#include <limits> -#include <memory> -#include <type_traits> - -namespace boost { -namespace beast { - -/** A @b DynamicBuffer that uses multiple buffers internally. - - The implementation uses a sequence of one or more character arrays - of varying sizes. Additional character array objects are appended to - the sequence to accommodate changes in the size of the character - sequence. - - @note Meets the requirements of @b DynamicBuffer. - - @tparam Allocator The allocator to use for managing memory. -*/ -template<class Allocator> -class basic_multi_buffer -#if ! BOOST_BEAST_DOXYGEN - : private detail::empty_base_optimization< - typename detail::allocator_traits<Allocator>:: - template rebind_alloc<char>> -#endif -{ - using base_alloc_type = typename - detail::allocator_traits<Allocator>:: - template rebind_alloc<char>; - - // Storage for the list of buffers representing the input - // and output sequences. The allocation for each element - // contains `element` followed by raw storage bytes. - class element; - - using alloc_traits = detail::allocator_traits<base_alloc_type>; - using list_type = typename boost::intrusive::make_list<element, - boost::intrusive::constant_time_size<true>>::type; - using iter = typename list_type::iterator; - using const_iter = typename list_type::const_iterator; - - using size_type = typename alloc_traits::size_type; - using const_buffer = boost::asio::const_buffer; - using mutable_buffer = boost::asio::mutable_buffer; - - static_assert(std::is_base_of<std::bidirectional_iterator_tag, - typename std::iterator_traits<iter>::iterator_category>::value, - "BidirectionalIterator requirements not met"); - - static_assert(std::is_base_of<std::bidirectional_iterator_tag, - typename std::iterator_traits<const_iter>::iterator_category>::value, - "BidirectionalIterator requirements not met"); - - std::size_t max_ = - (std::numeric_limits<std::size_t>::max)(); - list_type list_; // list of allocated buffers - iter out_; // element that contains out_pos_ - size_type in_size_ = 0; // size of the input sequence - size_type in_pos_ = 0; // input offset in list_.front() - size_type out_pos_ = 0; // output offset in *out_ - size_type out_end_ = 0; // output end offset in list_.back() - -public: - /// The type of allocator used. - using allocator_type = Allocator; - -#if BOOST_BEAST_DOXYGEN - /// The type used to represent the input sequence as a list of buffers. - using const_buffers_type = implementation_defined; - - /// The type used to represent the output sequence as a list of buffers. - using mutable_buffers_type = implementation_defined; - -#else - class const_buffers_type; - - class mutable_buffers_type; - -#endif - - /// Destructor - ~basic_multi_buffer(); - - /** Constructor - - Upon construction, capacity will be zero. - */ - basic_multi_buffer(); - - /** Constructor. - - @param limit The setting for @ref max_size. - */ - explicit - basic_multi_buffer(std::size_t limit); - - /** Constructor. - - @param alloc The allocator to use. - */ - explicit - basic_multi_buffer(Allocator const& alloc); - - /** Constructor. - - @param limit The setting for @ref max_size. - - @param alloc The allocator to use. - */ - basic_multi_buffer( - std::size_t limit, Allocator const& alloc); - - /** Move constructor - - After the move, `*this` will have an empty output sequence. - - @param other The object to move from. After the move, - The object's state will be as if constructed using - its current allocator and limit. - */ - basic_multi_buffer(basic_multi_buffer&& other); - - /** Move constructor - - After the move, `*this` will have an empty output sequence. - - @param other The object to move from. After the move, - The object's state will be as if constructed using - its current allocator and limit. - - @param alloc The allocator to use. - */ - basic_multi_buffer(basic_multi_buffer&& other, - Allocator const& alloc); - - /** Copy constructor. - - @param other The object to copy from. - */ - basic_multi_buffer(basic_multi_buffer const& other); - - /** Copy constructor - - @param other The object to copy from. - - @param alloc The allocator to use. - */ - basic_multi_buffer(basic_multi_buffer const& other, - Allocator const& alloc); - - /** Copy constructor. - - @param other The object to copy from. - */ - template<class OtherAlloc> - basic_multi_buffer(basic_multi_buffer< - OtherAlloc> const& other); - - /** Copy constructor. - - @param other The object to copy from. - - @param alloc The allocator to use. - */ - template<class OtherAlloc> - basic_multi_buffer(basic_multi_buffer< - OtherAlloc> const& other, allocator_type const& alloc); - - /** Move assignment - - After the move, `*this` will have an empty output sequence. - - @param other The object to move from. After the move, - The object's state will be as if constructed using - its current allocator and limit. - */ - basic_multi_buffer& - operator=(basic_multi_buffer&& other); - - /** Copy assignment - - After the copy, `*this` will have an empty output sequence. - - @param other The object to copy from. - */ - basic_multi_buffer& operator=(basic_multi_buffer const& other); - - /** Copy assignment - - After the copy, `*this` will have an empty output sequence. - - @param other The object to copy from. - */ - template<class OtherAlloc> - basic_multi_buffer& operator=( - basic_multi_buffer<OtherAlloc> const& other); - - /// Returns a copy of the associated allocator. - allocator_type - get_allocator() const - { - return this->member(); - } - - /// Returns the size of the input sequence. - size_type - size() const - { - return in_size_; - } - - /// Returns the permitted maximum sum of the sizes of the input and output sequence. - size_type - max_size() const - { - return max_; - } - - /// Returns the maximum sum of the sizes of the input sequence and output sequence the buffer can hold without requiring reallocation. - std::size_t - capacity() const; - - /** Get a list of buffers that represents the input sequence. - - @note These buffers remain valid across subsequent calls to `prepare`. - */ - const_buffers_type - data() const; - - /** Get a list of buffers that represents the output sequence, with the given size. - - @note Buffers representing the input sequence acquired prior to - this call remain valid. - */ - mutable_buffers_type - prepare(size_type n); - - /** Move bytes from the output sequence to the input sequence. - - @note Buffers representing the input sequence acquired prior to - this call remain valid. - */ - void - commit(size_type n); - - /// Remove bytes from the input sequence. - void - consume(size_type n); - - template<class Alloc> - friend - void - swap( - basic_multi_buffer<Alloc>& lhs, - basic_multi_buffer<Alloc>& rhs); - -private: - template<class OtherAlloc> - friend class basic_multi_buffer; - - void - delete_list(); - - void - reset(); - - template<class DynamicBuffer> - void - copy_from(DynamicBuffer const& other); - - void - move_assign(basic_multi_buffer& other, std::false_type); - - void - move_assign(basic_multi_buffer& other, std::true_type); - - void - copy_assign(basic_multi_buffer const& other, std::false_type); - - void - copy_assign(basic_multi_buffer const& other, std::true_type); - - void - swap(basic_multi_buffer&); - - void - swap(basic_multi_buffer&, std::true_type); - - void - swap(basic_multi_buffer&, std::false_type); - - void - debug_check() const; -}; - -/// A typical multi buffer -using multi_buffer = basic_multi_buffer<std::allocator<char>>; - -} // beast -} // boost - -#include <boost/beast/core/impl/multi_buffer.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/ostream.hpp b/contrib/restricted/boost/boost/beast/core/ostream.hpp deleted file mode 100644 index 1f00289bd1..0000000000 --- a/contrib/restricted/boost/boost/beast/core/ostream.hpp +++ /dev/null @@ -1,104 +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_WRITE_OSTREAM_HPP -#define BOOST_BEAST_WRITE_OSTREAM_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/ostream.hpp> -#include <type_traits> -#include <streambuf> -#include <utility> - -namespace boost { -namespace beast { - -/** Return an object representing a @b ConstBufferSequence. - - This function wraps a reference to a buffer sequence and permits - the following operation: - - @li `operator<<` to `std::ostream`. No character translation is - performed; unprintable and null characters will be transferred - as-is to the output stream. - - @par Example - @code - multi_buffer b; - ... - std::cout << buffers(b.data()) << std::endl; - @endcode - - @param b An object meeting the requirements of @b ConstBufferSequence - to be streamed. The implementation will make a copy of this object. - Ownership of the underlying memory is not transferred, the application - is still responsible for managing its lifetime. -*/ -template<class ConstBufferSequence> -#if BOOST_BEAST_DOXYGEN -implementation_defined -#else -detail::buffers_helper<ConstBufferSequence> -#endif -buffers(ConstBufferSequence const& b) -{ - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - return detail::buffers_helper< - ConstBufferSequence>{b}; -} - -/** Return an output stream that formats values into a @b DynamicBuffer. - - This function wraps the caller provided @b DynamicBuffer into - a `std::ostream` derived class, to allow `operator<<` stream style - formatting operations. - - @par Example - @code - ostream(buffer) << "Hello, world!" << std::endl; - @endcode - - @note Calling members of the underlying buffer before the output - stream is destroyed results in undefined behavior. - - @param buffer An object meeting the requirements of @b DynamicBuffer - into which the formatted output will be placed. - - @return An object derived from `std::ostream` which redirects output - The wrapped dynamic buffer is not modified, a copy is made instead. - Ownership of the underlying memory is not transferred, the application - is still responsible for managing its lifetime. The caller is - responsible for ensuring the dynamic buffer is not destroyed for the - lifetime of the output stream. -*/ -template<class DynamicBuffer> -#if BOOST_BEAST_DOXYGEN -implementation_defined -#else -detail::ostream_helper< - DynamicBuffer, char, std::char_traits<char>, - detail::basic_streambuf_movable::value> -#endif -ostream(DynamicBuffer& buffer) -{ - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - return detail::ostream_helper< - DynamicBuffer, char, std::char_traits<char>, - detail::basic_streambuf_movable::value>{buffer}; -} - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/read_size.hpp b/contrib/restricted/boost/boost/beast/core/read_size.hpp deleted file mode 100644 index d9aaaa61ab..0000000000 --- a/contrib/restricted/boost/boost/beast/core/read_size.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_READ_SIZE_HELPER_HPP -#define BOOST_BEAST_READ_SIZE_HELPER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/throw_exception.hpp> - -namespace boost { -namespace beast { - -/** Returns a natural read size. - - This function inspects the capacity, size, and maximum - size of the dynamic buffer. Then it computes a natural - read size given the passed-in upper limit. It favors - a read size that does not require a reallocation, subject - to a reasonable minimum to avoid tiny reads. - - @param buffer The dynamic buffer to inspect. - - @param max_size An upper limit on the returned value. - - @note If the buffer is already at its maximum size, zero - is returned. -*/ -template<class DynamicBuffer> -std::size_t -read_size(DynamicBuffer& buffer, std::size_t max_size); - -/** Returns a natural read size or throw if the buffer is full. - - This function inspects the capacity, size, and maximum - size of the dynamic buffer. Then it computes a natural - read size given the passed-in upper limit. It favors - a read size that does not require a reallocation, subject - to a reasonable minimum to avoid tiny reads. - - @param buffer The dynamic buffer to inspect. - - @param max_size An upper limit on the returned value. - - @throws std::length_error if `max_size > 0` and the buffer - is full. -*/ -template<class DynamicBuffer> -std::size_t -read_size_or_throw(DynamicBuffer& buffer, - std::size_t max_size); - -} // beast -} // boost - -#include <boost/beast/core/impl/read_size.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/span.hpp b/contrib/restricted/boost/boost/beast/core/span.hpp deleted file mode 100644 index 4aa7788501..0000000000 --- a/contrib/restricted/boost/boost/beast/core/span.hpp +++ /dev/null @@ -1,215 +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_SPAN_HPP -#define BOOST_BEAST_CORE_SPAN_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <algorithm> -#include <iterator> -#include <string> -#include <type_traits> - -namespace boost { -namespace beast { - -/** A range of bytes expressed as a ContiguousContainer - - This class implements a non-owning reference to a storage - area of a certain size and having an underlying integral - type with size of 1. - - @tparam T The type pointed to by span iterators -*/ -template<class T> -class span -{ - T* data_ = nullptr; - std::size_t size_ = 0; - -public: - /// The type of value, including cv qualifiers - using element_type = T; - - /// The type of value of each span element - using value_type = typename std::remove_const<T>::type; - - /// The type of integer used to index the span - using index_type = std::ptrdiff_t; - - /// A pointer to a span element - using pointer = T*; - - /// A reference to a span element - using reference = T&; - - /// The iterator used by the container - using iterator = pointer; - - /// The const pointer used by the container - using const_pointer = T const*; - - /// The const reference used by the container - using const_reference = T const&; - - /// The const iterator used by the container - using const_iterator = const_pointer; - - /// Constructor - span() = default; - - /// Constructor - span(span const&) = default; - - /// Assignment - span& operator=(span const&) = default; - - /** Constructor - - @param data A pointer to the beginning of the range of elements - - @param size The number of elements pointed to by `data` - */ - span(T* data, std::size_t size) - : data_(data), size_(size) - { - } - - /** Constructor - - @param container The container to construct from - */ - template<class ContiguousContainer -#if ! BOOST_BEAST_DOXYGEN - , class = typename std::enable_if< - detail::is_contiguous_container< - ContiguousContainer, T>::value>::type -#endif - > - explicit - span(ContiguousContainer&& container) - : data_(container.data()) - , size_(container.size()) - { - } - -#if ! BOOST_BEAST_DOXYGEN - template<class CharT, class Traits, class Allocator> - explicit - span(std::basic_string<CharT, Traits, Allocator>& s) - : data_(&s[0]) - , size_(s.size()) - { - } - - template<class CharT, class Traits, class Allocator> - explicit - span(std::basic_string<CharT, Traits, Allocator> const& s) - : data_(s.data()) - , size_(s.size()) - { - } -#endif - - /** Assignment - - @param container The container to assign from - */ - template<class ContiguousContainer> -#if BOOST_BEAST_DOXYGEN - span& -#else - typename std::enable_if<detail::is_contiguous_container< - ContiguousContainer, T>::value, - span&>::type -#endif - operator=(ContiguousContainer&& container) - { - data_ = container.data(); - size_ = container.size(); - return *this; - } - -#if ! BOOST_BEAST_DOXYGEN - template<class CharT, class Traits, class Allocator> - span& - operator=(std::basic_string< - CharT, Traits, Allocator>& s) - { - data_ = &s[0]; - size_ = s.size(); - return *this; - } - - template<class CharT, class Traits, class Allocator> - span& - operator=(std::basic_string< - CharT, Traits, Allocator> const& s) - { - data_ = s.data(); - size_ = s.size(); - return *this; - } -#endif - - /// Returns `true` if the span is empty - bool - empty() const - { - return size_ == 0; - } - - /// Returns a pointer to the beginning of the span - T* - data() const - { - return data_; - } - - /// Returns the number of elements in the span - std::size_t - size() const - { - return size_; - } - - /// Returns an iterator to the beginning of the span - const_iterator - begin() const - { - return data_; - } - - /// Returns an iterator to the beginning of the span - const_iterator - cbegin() const - { - return data_; - } - - /// Returns an iterator to one past the end of the span - const_iterator - end() const - { - return data_ + size_; - } - - /// Returns an iterator to one past the end of the span - const_iterator - cend() const - { - return data_ + size_; - } -}; - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/static_buffer.hpp b/contrib/restricted/boost/boost/beast/core/static_buffer.hpp deleted file mode 100644 index 86f06b1efd..0000000000 --- a/contrib/restricted/boost/boost/beast/core/static_buffer.hpp +++ /dev/null @@ -1,222 +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_STATIC_BUFFER_HPP -#define BOOST_BEAST_STATIC_BUFFER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/asio/buffer.hpp> -#include <algorithm> -#include <array> -#include <cstddef> -#include <cstring> - -namespace boost { -namespace beast { - -/** A circular @b DynamicBuffer with a fixed size internal buffer. - - This implements a circular dynamic buffer. Calls to @ref prepare - never require moving memory. The buffer sequences returned may - be up to length two. - Ownership of the underlying storage belongs to the derived class. - - @note Variables are usually declared using the template class - @ref static_buffer; however, to reduce the number of instantiations - of template functions receiving static stream buffer arguments in a - deduced context, the signature of the receiving function should use - @ref static_buffer_base. - - When used with @ref static_buffer this implements a dynamic - buffer using no memory allocations. - - @see @ref static_buffer -*/ -class static_buffer_base -{ - char* begin_; - std::size_t in_off_ = 0; - std::size_t in_size_ = 0; - std::size_t out_size_ = 0; - std::size_t capacity_; - - static_buffer_base(static_buffer_base const& other) = delete; - static_buffer_base& operator=(static_buffer_base const&) = delete; - -public: - /// The type used to represent the input sequence as a list of buffers. - using const_buffers_type = - std::array<boost::asio::const_buffer, 2>; - - /// The type used to represent the output sequence as a list of buffers. - using mutable_buffers_type = - std::array<boost::asio::mutable_buffer, 2>; - - /** Constructor - - This creates a dynamic buffer using the provided storage area. - - @param p A pointer to valid storage of at least `n` bytes. - - @param size The number of valid bytes pointed to by `p`. - */ - static_buffer_base(void* p, std::size_t size); - - /// Return the size of the input sequence. - std::size_t - size() const - { - return in_size_; - } - - /// Return the maximum sum of the input and output sequence sizes. - std::size_t - max_size() const - { - return capacity_; - } - - /// Return the maximum sum of input and output sizes that can be held without an allocation. - std::size_t - capacity() const - { - return capacity_; - } - - /** Get a list of buffers that represent the input sequence. - */ - const_buffers_type - data() const; - - /** Get a mutable list of buffers that represent the input sequence. - */ - mutable_buffers_type - mutable_data(); - - /** Get a list of buffers that represent the output sequence, with the given size. - - @param size The number of bytes to request. - - @throws std::length_error if the size would exceed the capacity. - */ - mutable_buffers_type - prepare(std::size_t size); - - /** Move bytes from the output sequence to the input sequence. - - @param size The nubmer of bytes to commit. If this is greater - than the size of the output sequence, the entire output - sequence is committed. - */ - void - commit(std::size_t size); - - /** Remove bytes from the input sequence. - - @param size The number of bytes to consume. If this is greater - than the size of the input sequence, the entire input sequence - is consumed. - */ - void - consume(std::size_t size); - -protected: - /** Constructor - - The buffer will be in an undefined state. It is necessary - for the derived class to call @ref reset in order to - initialize the object. - */ - static_buffer_base() = default; - - /** Reset the pointed-to buffer. - - This function resets the internal state to the buffer provided. - All input and output sequences are invalidated. This function - allows the derived class to construct its members before - initializing the static buffer. - - @param p A pointer to valid storage of at least `n` bytes. - - @param size The number of valid bytes pointed to by `p`. - */ - void - reset(void* p, std::size_t size); -}; - -//------------------------------------------------------------------------------ - -/** A circular @b DynamicBuffer with a fixed size internal buffer. - - This implements a circular dynamic buffer. Calls to @ref prepare - never require moving memory. The buffer sequences returned may - be up to length two. - Ownership of the underlying storage belongs to the derived class. - - @tparam N The number of bytes in the internal buffer. - - @note To reduce the number of template instantiations when passing - objects of this type in a deduced context, the signature of the - receiving function should use @ref static_buffer_base instead. - - @see @ref static_buffer_base -*/ -template<std::size_t N> -class static_buffer : public static_buffer_base -{ - char buf_[N]; - -public: - /// Constructor - static_buffer(static_buffer const&); - - /// Constructor - static_buffer() - : static_buffer_base(buf_, N) - { - } - - /// Assignment - static_buffer& operator=(static_buffer const&); - - /// Returns the @ref static_buffer_base portion of this object - static_buffer_base& - base() - { - return *this; - } - - /// Returns the @ref static_buffer_base portion of this object - static_buffer_base const& - base() const - { - return *this; - } - - /// Return the maximum sum of the input and output sequence sizes. - std::size_t constexpr - max_size() const - { - return N; - } - - /// Return the maximum sum of input and output sizes that can be held without an allocation. - std::size_t constexpr - capacity() const - { - return N; - } -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/static_buffer.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/static_string.hpp b/contrib/restricted/boost/boost/beast/core/static_string.hpp deleted file mode 100644 index 991c2e64a5..0000000000 --- a/contrib/restricted/boost/boost/beast/core/static_string.hpp +++ /dev/null @@ -1,1112 +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_STATIC_STRING_HPP -#define BOOST_BEAST_STATIC_STRING_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/detail/static_string.hpp> -#include <algorithm> -#include <cstdint> -#include <initializer_list> -#include <iterator> -#include <ostream> -#include <stdexcept> -#include <string> -#include <type_traits> - -namespace boost { -namespace beast { - -/** A modifiable string with a fixed-size storage area. - - These objects behave like `std::string` except that the storage - is not dynamically allocated but rather fixed in size. - - These strings offer performance advantages when a protocol - imposes a natural small upper limit on the size of a value. - - @note The stored string is always null-terminated. - - @see @ref to_static_string -*/ -template< - std::size_t N, - class CharT = char, - class Traits = std::char_traits<CharT>> -class static_string -{ - template<std::size_t, class, class> - friend class static_string; - - void - term() - { - Traits::assign(s_[n_], 0); - } - - std::size_t n_; - CharT s_[N+1]; - -public: - // - // Member types - // - - using traits_type = Traits; - using value_type = typename Traits::char_type; - using size_type = std::size_t; - using difference_type = std::ptrdiff_t; - using pointer = value_type*; - using reference = value_type&; - using const_pointer = value_type const*; - using const_reference = value_type const&; - using iterator = value_type*; - using const_iterator = value_type const*; - using reverse_iterator = - std::reverse_iterator<iterator>; - using const_reverse_iterator = - std::reverse_iterator<const_iterator>; - - /// The type of `string_view` returned by the interface - using string_view_type = - basic_string_view<CharT, Traits>; - - // - // Constants - // - - /// Maximum size of the string excluding the null terminator - static std::size_t constexpr max_size_n = N; - - /// A special index - static constexpr size_type npos = size_type(-1); - - // - // (constructor) - // - - /// Default constructor (empty string). - static_string(); - - /** Construct with count copies of character `ch`. - - The behavior is undefined if `count >= npos` - */ - static_string(size_type count, CharT ch); - - /// Construct with a substring (pos, other.size()) of `other`. - template<std::size_t M> - static_string(static_string<M, CharT, Traits> const& other, - size_type pos); - - /// Construct with a substring (pos, count) of `other`. - template<std::size_t M> - static_string(static_string<M, CharT, Traits> const& other, - size_type pos, size_type count); - - /// Construct with the first `count` characters of `s`, including nulls. - static_string(CharT const* s, size_type count); - - /// Construct from a null terminated string. - static_string(CharT const* s); - - /// Construct from a range of characters - template<class InputIt> - static_string(InputIt first, InputIt last); - - /// Copy constructor. - static_string(static_string const& other); - - /// Copy constructor. - template<std::size_t M> - static_string(static_string<M, CharT, Traits> const& other); - - /// Construct from an initializer list - static_string(std::initializer_list<CharT> init); - - /// Construct from a `string_view` - explicit - static_string(string_view_type sv); - - /** Construct from any object convertible to `string_view_type`. - - The range (pos, n) is extracted from the value - obtained by converting `t` to `string_view_type`, - and used to construct the string. - */ -#if BOOST_BEAST_DOXYGEN - template<class T> -#else - template<class T, class = typename std::enable_if< - std::is_convertible<T, string_view_type>::value>::type> -#endif - static_string(T const& t, size_type pos, size_type n); - - // - // (assignment) - // - - /// Copy assignment. - static_string& - operator=(static_string const& str) - { - return assign(str); - } - - /// Copy assignment. - template<std::size_t M> - static_string& - operator=(static_string<M, CharT, Traits> const& str) - { - return assign(str); - } - - /// Assign from null-terminated string. - static_string& - operator=(CharT const* s) - { - return assign(s); - } - - /// Assign from single character. - static_string& - operator=(CharT ch) - { - return assign_char(ch, - std::integral_constant<bool, (N>0)>{}); - } - - /// Assign from initializer list. - static_string& - operator=(std::initializer_list<CharT> init) - { - return assign(init); - } - - /// Assign from `string_view_type`. - static_string& - operator=(string_view_type sv) - { - return assign(sv); - } - - /// Assign `count` copies of `ch`. - static_string& - assign(size_type count, CharT ch); - - /// Assign from another `static_string` - static_string& - assign(static_string const& str); - - // VFALCO NOTE this could come in two flavors, - // N>M and N<M, and skip the exception - // check when N>M - - /// Assign from another `static_string` - template<std::size_t M> - static_string& - assign(static_string<M, CharT, Traits> const& str) - { - return assign(str.data(), str.size()); - } - - /// Assign `count` characterss starting at `npos` from `other`. - template<std::size_t M> - static_string& - assign(static_string<M, CharT, Traits> const& str, - size_type pos, size_type count = npos); - - /// Assign the first `count` characters of `s`, including nulls. - static_string& - assign(CharT const* s, size_type count); - - /// Assign a null terminated string. - static_string& - assign(CharT const* s) - { - return assign(s, Traits::length(s)); - } - - /// Assign from an iterator range of characters. - template<class InputIt> - static_string& - assign(InputIt first, InputIt last); - - /// Assign from initializer list. - static_string& - assign(std::initializer_list<CharT> init) - { - return assign(init.begin(), init.end()); - } - - /// Assign from `string_view_type`. - static_string& - assign(string_view_type str) - { - return assign(str.data(), str.size()); - } - - /** Assign from any object convertible to `string_view_type`. - - The range (pos, n) is extracted from the value - obtained by converting `t` to `string_view_type`, - and used to assign the string. - */ - template<class T> -#if BOOST_BEAST_DOXYGEN - static_string& -#else - typename std::enable_if<std::is_convertible<T, - string_view_type>::value, static_string&>::type -#endif - assign(T const& t, - size_type pos, size_type count = npos); - - // - // Element access - // - - /// Access specified character with bounds checking. - reference - at(size_type pos); - - /// Access specified character with bounds checking. - const_reference - at(size_type pos) const; - - /// Access specified character. - reference - operator[](size_type pos) - { - return s_[pos]; - } - - /// Access specified character. - const_reference - operator[](size_type pos) const - { - return s_[pos]; - } - - /// Accesses the first character. - CharT& - front() - { - return s_[0]; - } - - /// Accesses the first character. - CharT const& - front() const - { - return s_[0]; - } - - /// Accesses the last character. - CharT& - back() - { - return s_[n_-1]; - } - - /// Accesses the last character. - CharT const& - back() const - { - return s_[n_-1]; - } - - /// Returns a pointer to the first character of a string. - CharT* - data() - { - return &s_[0]; - } - - /// Returns a pointer to the first character of a string. - CharT const* - data() const - { - return &s_[0]; - } - - /// Returns a non-modifiable standard C character array version of the string. - CharT const* - c_str() const - { - return data(); - } - - /// Convert a static string to a `string_view_type` - operator string_view_type() const - { - return basic_string_view< - CharT, Traits>{data(), size()}; - } - - // - // Iterators - // - - /// Returns an iterator to the beginning. - iterator - begin() - { - return &s_[0]; - } - - /// Returns an iterator to the beginning. - const_iterator - begin() const - { - return &s_[0]; - } - - /// Returns an iterator to the beginning. - const_iterator - cbegin() const - { - return &s_[0]; - } - - /// Returns an iterator to the end. - iterator - end() - { - return &s_[n_]; - } - - /// Returns an iterator to the end. - const_iterator - end() const - { - return &s_[n_]; - } - - /// Returns an iterator to the end. - const_iterator - cend() const - { - return &s_[n_]; - } - - /// Returns a reverse iterator to the beginning. - reverse_iterator - rbegin() - { - return reverse_iterator{end()}; - } - - /// Returns a reverse iterator to the beginning. - const_reverse_iterator - rbegin() const - { - return const_reverse_iterator{cend()}; - } - - /// Returns a reverse iterator to the beginning. - const_reverse_iterator - crbegin() const - { - return const_reverse_iterator{cend()}; - } - - /// Returns a reverse iterator to the end. - reverse_iterator - rend() - { - return reverse_iterator{begin()}; - } - - /// Returns a reverse iterator to the end. - const_reverse_iterator - rend() const - { - return const_reverse_iterator{cbegin()}; - } - - /// Returns a reverse iterator to the end. - const_reverse_iterator - crend() const - { - return const_reverse_iterator{cbegin()}; - } - - // - // Capacity - // - - /// Returns `true` if the string is empty. - bool - empty() const - { - return n_ == 0; - } - - /// Returns the number of characters, excluding the null terminator. - size_type - size() const - { - return n_; - } - - /// Returns the number of characters, excluding the null terminator. - size_type - length() const - { - return size(); - } - - /// Returns the maximum number of characters that can be stored, excluding the null terminator. - size_type constexpr - max_size() const - { - return N; - } - - /** Reserves storage. - - This actually just throws an exception if `n > N`, - otherwise does nothing since the storage is fixed. - */ - void - reserve(std::size_t n); - - /// Returns the number of characters that can be held in currently allocated storage. - size_type constexpr - capacity() const - { - return max_size(); - } - - /** Reduces memory usage by freeing unused memory. - - This actually does nothing, since the storage is fixed. - */ - void - shrink_to_fit() - { - } - - // - // Operations - // - - /// Clears the contents. - void - clear(); - - static_string& - insert(size_type index, size_type count, CharT ch); - - static_string& - insert(size_type index, CharT const* s) - { - return insert(index, s, Traits::length(s)); - } - - static_string& - insert(size_type index, CharT const* s, size_type count); - - template<std::size_t M> - static_string& - insert(size_type index, - static_string<M, CharT, Traits> const& str) - { - return insert(index, str.data(), str.size()); - } - - template<std::size_t M> - static_string& - insert(size_type index, - static_string<M, CharT, Traits> const& str, - size_type index_str, size_type count = npos); - - iterator - insert(const_iterator pos, CharT ch) - { - return insert(pos, 1, ch); - } - - iterator - insert(const_iterator pos, size_type count, CharT ch); - - template<class InputIt> -#if BOOST_BEAST_DOXYGEN - iterator -#else - typename std::enable_if< - detail::is_input_iterator<InputIt>::value, - iterator>::type -#endif - insert(const_iterator pos, InputIt first, InputIt last); - - iterator - insert(const_iterator pos, std::initializer_list<CharT> init) - { - return insert(pos, init.begin(), init.end()); - } - - static_string& - insert(size_type index, string_view_type str) - { - return insert(index, str.data(), str.size()); - } - - template<class T> -#if BOOST_BEAST_DOXYGEN - static_string& -#else - typename std::enable_if< - std::is_convertible<T const&, string_view_type>::value && - ! std::is_convertible<T const&, CharT const*>::value, - static_string&>::type -#endif - insert(size_type index, T const& t, - size_type index_str, size_type count = npos); - - static_string& - erase(size_type index = 0, size_type count = npos); - - iterator - erase(const_iterator pos); - - iterator - erase(const_iterator first, const_iterator last); - - void - push_back(CharT ch); - - void - pop_back() - { - Traits::assign(s_[--n_], 0); - } - - static_string& - append(size_type count, CharT ch) - { - insert(end(), count, ch); - return *this; - } - - template<std::size_t M> - static_string& - append(static_string<M, CharT, Traits> const& str) - { - insert(size(), str); - return *this; - } - - template<std::size_t M> - static_string& - append(static_string<M, CharT, Traits> const& str, - size_type pos, size_type count = npos); - - static_string& - append(CharT const* s, size_type count) - { - insert(size(), s, count); - return *this; - } - - static_string& - append(CharT const* s) - { - insert(size(), s); - return *this; - } - - template<class InputIt> -#if BOOST_BEAST_DOXYGEN - static_string& -#else - typename std::enable_if< - detail::is_input_iterator<InputIt>::value, - static_string&>::type -#endif - append(InputIt first, InputIt last) - { - insert(end(), first, last); - return *this; - } - - static_string& - append(std::initializer_list<CharT> init) - { - insert(end(), init); - return *this; - } - - static_string& - append(string_view_type sv) - { - insert(size(), sv); - return *this; - } - - template<class T> - typename std::enable_if< - std::is_convertible<T const&, string_view_type>::value && - ! std::is_convertible<T const&, CharT const*>::value, - static_string&>::type - append(T const& t, size_type pos, size_type count = npos) - { - insert(size(), t, pos, count); - return *this; - } - - template<std::size_t M> - static_string& - operator+=(static_string<M, CharT, Traits> const& str) - { - return append(str.data(), str.size()); - } - - static_string& - operator+=(CharT ch) - { - push_back(ch); - return *this; - } - - static_string& - operator+=(CharT const* s) - { - return append(s); - } - - static_string& - operator+=(std::initializer_list<CharT> init) - { - return append(init); - } - - static_string& - operator+=(string_view_type const& str) - { - return append(str); - } - - template<std::size_t M> - int - compare(static_string<M, CharT, Traits> const& str) const - { - return detail::lexicographical_compare<CharT, Traits>( - &s_[0], n_, &str.s_[0], str.n_); - } - - template<std::size_t M> - int - compare(size_type pos1, size_type count1, - static_string<M, CharT, Traits> const& str) const - { - return detail::lexicographical_compare<CharT, Traits>( - substr(pos1, count1), str.data(), str.size()); - } - - template<std::size_t M> - int - compare(size_type pos1, size_type count1, - static_string<M, CharT, Traits> const& str, - size_type pos2, size_type count2 = npos) const - { - return detail::lexicographical_compare( - substr(pos1, count1), str.substr(pos2, count2)); - } - - int - compare(CharT const* s) const - { - return detail::lexicographical_compare<CharT, Traits>( - &s_[0], n_, s, Traits::length(s)); - } - - int - compare(size_type pos1, size_type count1, - CharT const* s) const - { - return detail::lexicographical_compare<CharT, Traits>( - substr(pos1, count1), s, Traits::length(s)); - } - - int - compare(size_type pos1, size_type count1, - CharT const*s, size_type count2) const - { - return detail::lexicographical_compare<CharT, Traits>( - substr(pos1, count1), s, count2); - } - - int - compare(string_view_type str) const - { - return detail::lexicographical_compare<CharT, Traits>( - &s_[0], n_, str.data(), str.size()); - } - - int - compare(size_type pos1, size_type count1, - string_view_type str) const - { - return detail::lexicographical_compare<CharT, Traits>( - substr(pos1, count1), str); - } - - template<class T> -#if BOOST_BEAST_DOXYGEN - int -#else - typename std::enable_if< - std::is_convertible<T const&, string_view_type>::value && - ! std::is_convertible<T const&, CharT const*>::value, - int>::type -#endif - compare(size_type pos1, size_type count1, - T const& t, size_type pos2, - size_type count2 = npos) const - { - return compare(pos1, count1, - string_view_type(t).substr(pos2, count2)); - } - - string_view_type - substr(size_type pos = 0, size_type count = npos) const; - - /// Copy a substring (pos, pos+count) to character string pointed to by `dest`. - size_type - copy(CharT* dest, size_type count, size_type pos = 0) const; - - /** Changes the number of characters stored. - - If the resulting string is larger, the new - characters are uninitialized. - */ - void - resize(std::size_t n); - - /** Changes the number of characters stored. - - If the resulting string is larger, the new - characters are initialized to the value of `c`. - */ - void - resize(std::size_t n, CharT c); - - /// Exchange the contents of this string with another. - void - swap(static_string& str); - - /// Exchange the contents of this string with another. - template<std::size_t M> - void - swap(static_string<M, CharT, Traits>& str); - - // - // Search - // - -private: - static_string& - assign_char(CharT ch, std::true_type); - - static_string& - assign_char(CharT ch, std::false_type); -}; - -// -// Disallowed operations -// - -// These operations are explicitly deleted since -// there is no reasonable implementation possible. - -template<std::size_t N, std::size_t M, class CharT, class Traits> -void -operator+( - static_string<N, CharT, Traits>const& lhs, - static_string<M, CharT, Traits>const& rhs) = delete; - -template<std::size_t N, class CharT, class Traits> -void -operator+(CharT const* lhs, - static_string<N, CharT, Traits>const& rhs) = delete; - -template<std::size_t N, class CharT, class Traits> -void -operator+(CharT lhs, - static_string<N, CharT, Traits> const& rhs) = delete; - -template<std::size_t N, class CharT, class Traits> -void -operator+(static_string<N, CharT, Traits> const& lhs, - CharT const* rhs) = delete; - -template<std::size_t N, class CharT, class Traits> -void -operator+(static_string<N, CharT, Traits> const& lhs, - CharT rhs) = delete; - -// -// Non-member functions -// - -template<std::size_t N, std::size_t M, - class CharT, class Traits> -bool -operator==( - static_string<N, CharT, Traits> const& lhs, - static_string<M, CharT, Traits> const& rhs) -{ - return lhs.compare(rhs) == 0; -} - -template<std::size_t N, std::size_t M, - class CharT, class Traits> -bool -operator!=( - static_string<N, CharT, Traits> const& lhs, - static_string<M, CharT, Traits> const& rhs) -{ - return lhs.compare(rhs) != 0; -} - -template<std::size_t N, std::size_t M, - class CharT, class Traits> -bool -operator<( - static_string<N, CharT, Traits> const& lhs, - static_string<M, CharT, Traits> const& rhs) -{ - return lhs.compare(rhs) < 0; -} - -template<std::size_t N, std::size_t M, - class CharT, class Traits> -bool -operator<=( - static_string<N, CharT, Traits> const& lhs, - static_string<M, CharT, Traits> const& rhs) -{ - return lhs.compare(rhs) <= 0; -} - -template<std::size_t N, std::size_t M, - class CharT, class Traits> -bool -operator>( - static_string<N, CharT, Traits> const& lhs, - static_string<M, CharT, Traits> const& rhs) -{ - return lhs.compare(rhs) > 0; -} - -template<std::size_t N, std::size_t M, - class CharT, class Traits> -bool -operator>=( - static_string<N, CharT, Traits> const& lhs, - static_string<M, CharT, Traits> const& rhs) -{ - return lhs.compare(rhs) >= 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator==( - CharT const* lhs, - static_string<N, CharT, Traits> const& rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs, Traits::length(lhs), - rhs.data(), rhs.size()) == 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator==( - static_string<N, CharT, Traits> const& lhs, - CharT const* rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs.data(), lhs.size(), - rhs, Traits::length(rhs)) == 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator!=( - CharT const* lhs, - static_string<N, CharT, Traits> const& rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs, Traits::length(lhs), - rhs.data(), rhs.size()) != 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator!=( - static_string<N, CharT, Traits> const& lhs, - CharT const* rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs.data(), lhs.size(), - rhs, Traits::length(rhs)) != 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator<( - CharT const* lhs, - static_string<N, CharT, Traits> const& rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs, Traits::length(lhs), - rhs.data(), rhs.size()) < 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator<( - static_string<N, CharT, Traits> const& lhs, - CharT const* rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs.data(), lhs.size(), - rhs, Traits::length(rhs)) < 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator<=( - CharT const* lhs, - static_string<N, CharT, Traits> const& rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs, Traits::length(lhs), - rhs.data(), rhs.size()) <= 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator<=( - static_string<N, CharT, Traits> const& lhs, - CharT const* rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs.data(), lhs.size(), - rhs, Traits::length(rhs)) <= 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator>( - CharT const* lhs, - static_string<N, CharT, Traits> const& rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs, Traits::length(lhs), - rhs.data(), rhs.size()) > 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator>( - static_string<N, CharT, Traits> const& lhs, - CharT const* rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs.data(), lhs.size(), - rhs, Traits::length(rhs)) > 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator>=( - CharT const* lhs, - static_string<N, CharT, Traits> const& rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs, Traits::length(lhs), - rhs.data(), rhs.size()) >= 0; -} - -template<std::size_t N, class CharT, class Traits> -bool -operator>=( - static_string<N, CharT, Traits> const& lhs, - CharT const* rhs) -{ - return detail::lexicographical_compare<CharT, Traits>( - lhs.data(), lhs.size(), - rhs, Traits::length(rhs)) >= 0; -} - -// -// swap -// - -template<std::size_t N, class CharT, class Traits> -void -swap( - static_string<N, CharT, Traits>& lhs, - static_string<N, CharT, Traits>& rhs) -{ - lhs.swap(rhs); -} - -template<std::size_t N, std::size_t M, - class CharT, class Traits> -void -swap( - static_string<N, CharT, Traits>& lhs, - static_string<M, CharT, Traits>& rhs) -{ - lhs.swap(rhs); -} - -// -// Input/Output -// - -template<std::size_t N, class CharT, class Traits> -std::basic_ostream<CharT, Traits>& -operator<<(std::basic_ostream<CharT, Traits>& os, - static_string<N, CharT, Traits> const& str) -{ - return os << static_cast< - beast::basic_string_view<CharT, Traits>>(str); -} - -// -// Numeric conversions -// - -/** Returns a static string representing an integer as a decimal. - - @param x The signed or unsigned integer to convert. - This must be an integral type. - - @return A @ref static_string with an implementation defined - maximum size large enough to hold the longest possible decimal - representation of any integer of the given type. -*/ -template<class Integer> -static_string<detail::max_digits(sizeof(Integer))> -to_static_string(Integer x); - -} // beast -} // boost - -#include <boost/beast/core/impl/static_string.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/string.hpp b/contrib/restricted/boost/boost/beast/core/string.hpp deleted file mode 100644 index 27bfa57165..0000000000 --- a/contrib/restricted/boost/boost/beast/core/string.hpp +++ /dev/null @@ -1,132 +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_STRING_HPP -#define BOOST_BEAST_STRING_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/version.hpp> -#include <boost/utility/string_view.hpp> -#include <algorithm> - -namespace boost { -namespace beast { - -/// The type of string view used by the library -using string_view = boost::string_view; - -/// The type of basic string view used by the library -template<class CharT, class Traits> -using basic_string_view = - boost::basic_string_view<CharT, Traits>; - -namespace detail { - -inline -char -ascii_tolower(char c) -{ - return ((static_cast<unsigned>(c) - 65U) < 26) ? - c + 'a' - 'A' : c; -} - -template<class = void> -bool -iequals( - beast::string_view lhs, - beast::string_view rhs) -{ - auto n = lhs.size(); - if(rhs.size() != n) - return false; - auto p1 = lhs.data(); - auto p2 = rhs.data(); - char a, b; - while(n--) - { - a = *p1++; - b = *p2++; - if(a != b) - { - // slow loop - do - { - if(ascii_tolower(a) != ascii_tolower(b)) - return false; - a = *p1++; - b = *p2++; - } - while(n--); - return true; - } - } - return true; -} - -} // detail - -/** Returns `true` if two strings are equal, using a case-insensitive comparison. - - The case-comparison operation is defined only for low-ASCII characters. - - @param lhs The string on the left side of the equality - - @param rhs The string on the right side of the equality -*/ -inline -bool -iequals( - beast::string_view lhs, - beast::string_view rhs) -{ - return detail::iequals(lhs, rhs); -} - -/** A case-insensitive less predicate for strings. - - The case-comparison operation is defined only for low-ASCII characters. -*/ -struct iless -{ - bool - operator()( - string_view lhs, - string_view rhs) const - { - using std::begin; - using std::end; - return std::lexicographical_compare( - begin(lhs), end(lhs), begin(rhs), end(rhs), - [](char c1, char c2) - { - return detail::ascii_tolower(c1) < detail::ascii_tolower(c2); - } - ); - } -}; - -/** A case-insensitive equality predicate for strings. - - The case-comparison operation is defined only for low-ASCII characters. -*/ -struct iequal -{ - bool - operator()( - string_view lhs, - string_view rhs) const - { - return iequals(lhs, rhs); - } -}; - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/string_param.hpp b/contrib/restricted/boost/boost/beast/core/string_param.hpp deleted file mode 100644 index a068cc4091..0000000000 --- a/contrib/restricted/boost/boost/beast/core/string_param.hpp +++ /dev/null @@ -1,130 +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_STRING_PARAM_HPP -#define BOOST_BEAST_STRING_PARAM_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/static_string.hpp> -#include <boost/beast/core/detail/static_ostream.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/optional.hpp> - -namespace boost { -namespace beast { - -/** A function parameter which efficiently converts to string. - - This is used as a function parameter type to allow callers - notational convenience: objects other than strings may be - passed in contexts where a string is expected. The conversion - to string is made using `operator<<` to a non-dynamically - allocated static buffer if possible, else to a `std::string` - on overflow. - - To use it, modify your function signature to accept - `string_param` and then extract the string inside the - function: - @code - void print(string_param s) - { - std::cout << s.str(); - } - @endcode -*/ -class string_param -{ - string_view sv_; - char buf_[128]; - boost::optional<detail::static_ostream> os_; - - template<class T> - typename std::enable_if< - std::is_integral<T>::value>::type - print(T const&); - - template<class T> - typename std::enable_if< - ! std::is_integral<T>::value && - ! std::is_convertible<T, string_view>::value - >::type - print(T const&); - - void - print(string_view); - - template<class T> - typename std::enable_if< - std::is_integral<T>::value>::type - print_1(T const&); - - template<class T> - typename std::enable_if< - ! std::is_integral<T>::value>::type - print_1(T const&); - - void - print_n() - { - } - - template<class T0, class... TN> - void - print_n(T0 const&, TN const&...); - - template<class T0, class T1, class... TN> - void - print(T0 const&, T1 const&, TN const&...); - -public: - /// Copy constructor (disallowed) - string_param(string_param const&) = delete; - - /// Copy assignment (disallowed) - string_param& operator=(string_param const&) = delete; - - /** Constructor - - This function constructs a string as if by concatenating - the result of streaming each argument in order into an - output stream. It is used as a notational convenience - at call sites which expect a parameter with the semantics - of a @ref string_view. - - The implementation uses a small, internal static buffer - to avoid memory allocations especially for the case where - the list of arguments to be converted consists of a single - integral type. - - @param args One or more arguments to convert - */ - template<class... Args> - string_param(Args const&... args); - - /// Returns the contained string - string_view - str() const - { - return sv_; - } - - /// Implicit conversion to @ref string_view - operator string_view const() const - { - return sv_; - } -}; - -} // beast -} // boost - -#include <boost/beast/core/impl/string_param.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/core/type_traits.hpp b/contrib/restricted/boost/boost/beast/core/type_traits.hpp deleted file mode 100644 index f5e466a759..0000000000 --- a/contrib/restricted/boost/boost/beast/core/type_traits.hpp +++ /dev/null @@ -1,480 +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_TYPE_TRAITS_HPP -#define BOOST_BEAST_TYPE_TRAITS_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/file_base.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <type_traits> - -namespace boost { -namespace beast { - -//------------------------------------------------------------------------------ -// -// Handler concepts -// -//------------------------------------------------------------------------------ - -/** Determine if `T` meets the requirements of @b CompletionHandler. - - This trait checks whether a type meets the requirements for a completion - handler, and is also callable with the specified signature. - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` meets the requirements, - else the type will be `std::false_type`. - - @par Example - - Use with `static_assert`: - - @code - struct handler - { - void operator()(error_code&); - }; - - static_assert(is_completion_handler<handler, void(error_code&)>::value, - "Not a completion handler"); - @endcode -*/ -template<class T, class Signature> -#if BOOST_BEAST_DOXYGEN -using is_completion_handler = std::integral_constant<bool, ...>; -#else -using is_completion_handler = std::integral_constant<bool, - std::is_move_constructible<typename std::decay<T>::type>::value && - detail::is_invocable<T, Signature>::value>; -#endif - -//------------------------------------------------------------------------------ -// -// Stream concepts -// -//------------------------------------------------------------------------------ - -/** Determine if `T` has the `get_executor` member function. - - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` has the member - function with the correct signature, else type will be `std::false_type`. - - @par Example - - Use with tag dispatching: - - @code - template<class T> - void maybe_hello(T& t, std::true_type) - { - boost::asio::post( - t.get_executor(), - [] - { - std::cout << "Hello, world!" << std::endl; - }); - } - - template<class T> - void maybe_hello(T&, std::false_type) - { - // T does not have get_executor - } - - template<class T> - void maybe_hello(T& t) - { - maybe_hello(t, has_get_executor<T>{}); - } - @endcode - - Use with `static_assert`: - - @code - struct stream - { - using executor_type = boost::asio::io_context::executor_type; - executor_type get_executor() noexcept; - }; - - static_assert(has_get_executor<stream>::value, "Missing get_executor member"); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct has_get_executor : std::integral_constant<bool, ...>{}; -#else -template<class T, class = void> -struct has_get_executor : std::false_type {}; - -template<class T> -struct has_get_executor<T, beast::detail::void_t<decltype( - std::declval<T&>().get_executor(), - (void)0)>> : std::true_type {}; -#endif - -/** Alias for `T::lowest_layer_type` if it exists, else `T` - - This will be a type alias for `T::lowest_layer_type` - if it exists, else it will be an alias for `T`. - - @par Example - - Declaring a wrapper: - - @code - template<class Stream> - struct stream_wrapper - { - using next_layer_type = typename std::remove_reference<Stream>::type; - using lowest_layer_type = get_lowest_layer<stream_type>; - }; - @endcode - - Defining a metafunction: - - @code - /// Alias for `std::true_type` if `T` wraps another stream - template<class T> - using is_stream_wrapper : std::integral_constant<bool, - ! std::is_same<T, get_lowest_layer<T>>::value> {}; - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct get_lowest_layer; -#else -template<class T> -using get_lowest_layer = typename detail::get_lowest_layer_helper<T>::type; -#endif - -/** Determine if `T` meets the requirements of @b AsyncReadStream. - - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` meets the requirements, - else the type will be `std::false_type`. - - @par Example - - Use with `static_assert`: - - @code - template<class AsyncReadStream> - void f(AsyncReadStream& stream) - { - static_assert(is_async_read_stream<AsyncReadStream>::value, - "AsyncReadStream requirements not met"); - ... - @endcode - - Use with `std::enable_if` (SFINAE): - - @code - template<class AsyncReadStream> - typename std::enable_if<is_async_read_stream<AsyncReadStream>::value>::type - f(AsyncReadStream& stream); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_async_read_stream : std::integral_constant<bool, ...>{}; -#else -template<class T, class = void> -struct is_async_read_stream : std::false_type {}; - -template<class T> -struct is_async_read_stream<T, detail::void_t<decltype( - std::declval<T>().async_read_some( - std::declval<detail::MutableBufferSequence>(), - std::declval<detail::ReadHandler>()), - (void)0)>> : std::integral_constant<bool, - has_get_executor<T>::value - > {}; -#endif - -/** Determine if `T` meets the requirements of @b AsyncWriteStream. - - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` meets the requirements, - else the type will be `std::false_type`. - - @par Example - - Use with `static_assert`: - - @code - template<class AsyncWriteStream> - void f(AsyncWriteStream& stream) - { - static_assert(is_async_write_stream<AsyncWriteStream>::value, - "AsyncWriteStream requirements not met"); - ... - @endcode - - Use with `std::enable_if` (SFINAE): - - @code - template<class AsyncWriteStream> - typename std::enable_if<is_async_write_stream<AsyncWriteStream>::value>::type - f(AsyncWriteStream& stream); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_async_write_stream : std::integral_constant<bool, ...>{}; -#else -template<class T, class = void> -struct is_async_write_stream : std::false_type {}; - -template<class T> -struct is_async_write_stream<T, detail::void_t<decltype( - std::declval<T>().async_write_some( - std::declval<detail::ConstBufferSequence>(), - std::declval<detail::WriteHandler>()), - (void)0)>> : std::integral_constant<bool, - has_get_executor<T>::value - > {}; -#endif - -/** Determine if `T` meets the requirements of @b SyncReadStream. - - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` meets the requirements, - else the type will be `std::false_type`. - - @par Example - - Use with `static_assert`: - - @code - template<class SyncReadStream> - void f(SyncReadStream& stream) - { - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - ... - @endcode - - Use with `std::enable_if` (SFINAE): - - @code - template<class SyncReadStream> - typename std::enable_if<is_sync_read_stream<SyncReadStream>::value>::type - f(SyncReadStream& stream); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_sync_read_stream : std::integral_constant<bool, ...>{}; -#else -template<class T, class = void> -struct is_sync_read_stream : std::false_type {}; - -template<class T> -struct is_sync_read_stream<T, detail::void_t<decltype( - std::declval<std::size_t&>() = std::declval<T>().read_some( - std::declval<detail::MutableBufferSequence>()), - std::declval<std::size_t&>() = std::declval<T>().read_some( - std::declval<detail::MutableBufferSequence>(), - std::declval<boost::system::error_code&>()), - (void)0)>> : std::true_type {}; -#endif - -/** Determine if `T` meets the requirements of @b SyncWriteStream. - - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` meets the requirements, - else the type will be `std::false_type`. - - @par Example - - Use with `static_assert`: - - @code - template<class SyncReadStream> - void f(SyncReadStream& stream) - { - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - ... - @endcode - - Use with `std::enable_if` (SFINAE): - - @code - template<class SyncReadStream> - typename std::enable_if<is_sync_read_stream<SyncReadStream>::value>::type - f(SyncReadStream& stream); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_sync_write_stream : std::integral_constant<bool, ...>{}; -#else -template<class T, class = void> -struct is_sync_write_stream : std::false_type {}; - -template<class T> -struct is_sync_write_stream<T, detail::void_t<decltype( - std::declval<std::size_t&>() = std::declval<T&>().write_some( - std::declval<detail::ConstBufferSequence>()), - std::declval<std::size_t&>() = std::declval<T&>().write_some( - std::declval<detail::ConstBufferSequence>(), - std::declval<boost::system::error_code&>()), - (void)0)>> : std::true_type {}; -#endif - -/** Determine if `T` meets the requirements of @b AsyncStream. - - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` meets the requirements, - else the type will be `std::false_type`. - - @par Example - - Use with `static_assert`: - - @code - template<class AsyncStream> - void f(AsyncStream& stream) - { - static_assert(is_async_stream<AsyncStream>::value, - "AsyncStream requirements not met"); - ... - @endcode - - Use with `std::enable_if` (SFINAE): - - @code - template<class AsyncStream> - typename std::enable_if<is_async_stream<AsyncStream>::value>::type - f(AsyncStream& stream); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_async_stream : std::integral_constant<bool, ...>{}; -#else -template<class T> -using is_async_stream = std::integral_constant<bool, - is_async_read_stream<T>::value && is_async_write_stream<T>::value>; -#endif - -/** Determine if `T` meets the requirements of @b SyncStream. - - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` meets the requirements, - else the type will be `std::false_type`. - - @par Example - - Use with `static_assert`: - - @code - template<class SyncStream> - void f(SyncStream& stream) - { - static_assert(is_sync_stream<SyncStream>::value, - "SyncStream requirements not met"); - ... - @endcode - - Use with `std::enable_if` (SFINAE): - - @code - template<class SyncStream> - typename std::enable_if<is_sync_stream<SyncStream>::value>::type - f(SyncStream& stream); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_sync_stream : std::integral_constant<bool, ...>{}; -#else -template<class T> -using is_sync_stream = std::integral_constant<bool, - is_sync_read_stream<T>::value && is_sync_write_stream<T>::value>; -#endif - -//------------------------------------------------------------------------------ -// -// File concepts -// -//------------------------------------------------------------------------------ - -/** Determine if `T` meets the requirements of @b File. - - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` meets the requirements, - else the type will be `std::false_type`. - - @par Example - - Use with `static_assert`: - - @code - template<class File> - void f(File& file) - { - static_assert(is_file<File>::value, - "File requirements not met"); - ... - @endcode - - Use with `std::enable_if` (SFINAE): - - @code - template<class File> - typename std::enable_if<is_file<File>::value>::type - f(File& file); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_file : std::integral_constant<bool, ...>{}; -#else -template<class T, class = void> -struct is_file : std::false_type {}; - -template<class T> -struct is_file<T, detail::void_t<decltype( - std::declval<bool&>() = std::declval<T const&>().is_open(), - std::declval<T&>().close(std::declval<error_code&>()), - std::declval<T&>().open( - std::declval<char const*>(), - std::declval<file_mode>(), - std::declval<error_code&>()), - std::declval<std::uint64_t&>() = std::declval<T&>().size( - std::declval<error_code&>()), - std::declval<std::uint64_t&>() = std::declval<T&>().pos( - std::declval<error_code&>()), - std::declval<T&>().seek( - std::declval<std::uint64_t>(), - std::declval<error_code&>()), - std::declval<std::size_t&>() = std::declval<T&>().read( - std::declval<void*>(), - std::declval<std::size_t>(), - std::declval<error_code&>()), - std::declval<std::size_t&>() = std::declval<T&>().write( - std::declval<void const*>(), - std::declval<std::size_t>(), - std::declval<error_code&>()), - (void)0)>> : std::integral_constant<bool, - std::is_default_constructible<T>::value && - std::is_destructible<T>::value - > {}; -#endif - -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http.hpp b/contrib/restricted/boost/boost/beast/http.hpp deleted file mode 100644 index c419724db2..0000000000 --- a/contrib/restricted/boost/boost/beast/http.hpp +++ /dev/null @@ -1,38 +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_HTTP_HPP -#define BOOST_BEAST_HTTP_HPP - -#include <boost/beast/core/detail/config.hpp> - -#include <boost/beast/http/basic_dynamic_body.hpp> -#include <boost/beast/http/basic_parser.hpp> -#include <boost/beast/http/buffer_body.hpp> -#include <boost/beast/http/chunk_encode.hpp> -#include <boost/beast/http/dynamic_body.hpp> -#include <boost/beast/http/empty_body.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/field.hpp> -#include <boost/beast/http/fields.hpp> -#include <boost/beast/http/file_body.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/beast/http/parser.hpp> -#include <boost/beast/http/read.hpp> -#include <boost/beast/http/rfc7230.hpp> -#include <boost/beast/http/serializer.hpp> -#include <boost/beast/http/span_body.hpp> -#include <boost/beast/http/status.hpp> -#include <boost/beast/http/string_body.hpp> -#include <boost/beast/http/type_traits.hpp> -#include <boost/beast/http/vector_body.hpp> -#include <boost/beast/http/verb.hpp> -#include <boost/beast/http/write.hpp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/basic_dynamic_body.hpp b/contrib/restricted/boost/boost/beast/http/basic_dynamic_body.hpp deleted file mode 100644 index 7d850d76f3..0000000000 --- a/contrib/restricted/boost/boost/beast/http/basic_dynamic_body.hpp +++ /dev/null @@ -1,167 +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_HTTP_BASIC_DYNAMIC_BODY_HPP -#define BOOST_BEAST_HTTP_BASIC_DYNAMIC_BODY_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/optional.hpp> -#include <algorithm> -#include <cstdint> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/** A @b Body using a @b DynamicBuffer - - This body uses a @b DynamicBuffer as a memory-based container - for holding message payloads. Messages using this body type - may be serialized and parsed. -*/ -template<class DynamicBuffer> -struct basic_dynamic_body -{ - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - - /** The type of container used for the body - - This determines the type of @ref message::body - when this body type is used with a message container. - */ - using value_type = DynamicBuffer; - - /** Returns the payload size of the body - - When this body is used with @ref message::prepare_payload, - the Content-Length will be set to the payload size, and - any chunked Transfer-Encoding will be removed. - */ - static - std::uint64_t - size(value_type const& v) - { - return v.size(); - } - - /** The algorithm for parsing the body - - Meets the requirements of @b BodyReader. - */ -#if BOOST_BEAST_DOXYGEN - using reader = implementation_defined; -#else - class reader - { - value_type& body_; - - public: - template<bool isRequest, class Fields> - explicit - reader(header<isRequest, Fields>&, value_type& b) - : body_(b) - { - } - - void - init(boost::optional< - std::uint64_t> const&, error_code& ec) - { - ec.assign(0, ec.category()); - } - - template<class ConstBufferSequence> - std::size_t - put(ConstBufferSequence const& buffers, - error_code& ec) - { - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - auto const n = buffer_size(buffers); - if(body_.size() > body_.max_size() - n) - { - ec = error::buffer_overflow; - return 0; - } - boost::optional<typename - DynamicBuffer::mutable_buffers_type> b; - try - { - b.emplace(body_.prepare((std::min)(n, - body_.max_size() - body_.size()))); - } - catch(std::length_error const&) - { - ec = error::buffer_overflow; - return 0; - } - ec.assign(0, ec.category()); - auto const bytes_transferred = - buffer_copy(*b, buffers); - body_.commit(bytes_transferred); - return bytes_transferred; - } - - void - finish(error_code& ec) - { - ec.assign(0, ec.category()); - } - }; -#endif - - /** The algorithm for serializing the body - - Meets the requirements of @b BodyWriter. - */ -#if BOOST_BEAST_DOXYGEN - using writer = implementation_defined; -#else - class writer - { - DynamicBuffer const& body_; - - public: - using const_buffers_type = - typename DynamicBuffer::const_buffers_type; - - template<bool isRequest, class Fields> - explicit - writer(header<isRequest, Fields> const&, value_type const& b) - : body_(b) - { - } - - void - init(error_code& ec) - { - ec.assign(0, ec.category()); - } - - boost::optional<std::pair<const_buffers_type, bool>> - get(error_code& ec) - { - ec.assign(0, ec.category()); - return {{body_.data(), false}}; - } - }; -#endif -}; - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/basic_file_body.hpp b/contrib/restricted/boost/boost/beast/http/basic_file_body.hpp deleted file mode 100644 index 6d1de9a3b8..0000000000 --- a/contrib/restricted/boost/boost/beast/http/basic_file_body.hpp +++ /dev/null @@ -1,539 +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_HTTP_BASIC_FILE_BODY_HPP -#define BOOST_BEAST_HTTP_BASIC_FILE_BODY_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/file_base.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/assert.hpp> -#include <boost/optional.hpp> -#include <algorithm> -#include <cstdio> -#include <cstdint> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -//[example_http_file_body_1 - -/** A message body represented by a file on the filesystem. - - Messages with this type have bodies represented by a - file on the file system. When parsing a message using - this body type, the data is stored in the file pointed - to by the path, which must be writable. When serializing, - the implementation will read the file and present those - octets as the body content. This may be used to serve - content from a directory as part of a web service. - - @tparam File The implementation to use for accessing files. - This type must meet the requirements of @b File. -*/ -template<class File> -struct basic_file_body -{ - // Make sure the type meets the requirements - static_assert(is_file<File>::value, - "File requirements not met"); - - /// The type of File this body uses - using file_type = File; - - // Algorithm for storing buffers when parsing. - class reader; - - // Algorithm for retrieving buffers when serializing. - class writer; - - // The type of the @ref message::body member. - class value_type; - - /** Returns the size of the body - - @param body The file body to use - */ - static - std::uint64_t - size(value_type const& body); -}; - -//] - -//[example_http_file_body_2 - -/** The type of the @ref message::body member. - - Messages declared using `basic_file_body` will have this type for - the body member. This rich class interface allow the file to be - opened with the file handle maintained directly in the object, - which is attached to the message. -*/ -template<class File> -class basic_file_body<File>::value_type -{ - // This body container holds a handle to the file - // when it is open, and also caches the size when set. - - friend class reader; - friend class writer; - friend struct basic_file_body; - - // This represents the open file - File file_; - - // The cached file size - std::uint64_t file_size_ = 0; - -public: - /** Destructor. - - If the file is open, it is closed first. - */ - ~value_type() = default; - - /// Constructor - value_type() = default; - - /// Constructor - value_type(value_type&& other) = default; - - /// Move assignment - value_type& operator=(value_type&& other) = default; - - /// Returns `true` if the file is open - bool - is_open() const - { - return file_.is_open(); - } - - /// Returns the size of the file if open - std::uint64_t - size() const - { - return file_size_; - } - - /// Close the file if open - void - close(); - - /** Open a file at the given path with the specified mode - - @param path The utf-8 encoded path to the file - - @param mode The file mode to use - - @param ec Set to the error, if any occurred - */ - void - open(char const* path, file_mode mode, error_code& ec); - - /** Set the open file - - This function is used to set the open file. Any previously - set file will be closed. - - @param file The file to set. The file must be open or else - an error occurs - - @param ec Set to the error, if any occurred - */ - void - reset(File&& file, error_code& ec); -}; - -template<class File> -void -basic_file_body<File>:: -value_type:: -close() -{ - error_code ignored; - file_.close(ignored); -} - -template<class File> -void -basic_file_body<File>:: -value_type:: -open(char const* path, file_mode mode, error_code& ec) -{ - // Open the file - file_.open(path, mode, ec); - if(ec) - return; - - // Cache the size - file_size_ = file_.size(ec); - if(ec) - { - close(); - return; - } -} - -template<class File> -void -basic_file_body<File>:: -value_type:: -reset(File&& file, error_code& ec) -{ - // First close the file if open - if(file_.is_open()) - { - error_code ignored; - file_.close(ignored); - } - - // Take ownership of the new file - file_ = std::move(file); - - // Cache the size - file_size_ = file_.size(ec); -} - -// This is called from message::payload_size -template<class File> -std::uint64_t -basic_file_body<File>:: -size(value_type const& body) -{ - // Forward the call to the body - return body.size(); -} - -//] - -//[example_http_file_body_3 - -/** Algorithm for retrieving buffers when serializing. - - Objects of this type are created during serialization - to extract the buffers representing the body. -*/ -template<class File> -class basic_file_body<File>::writer -{ - value_type& body_; // The body we are reading from - std::uint64_t remain_; // The number of unread bytes - char buf_[4096]; // Small buffer for reading - -public: - // The type of buffer sequence returned by `get`. - // - using const_buffers_type = - boost::asio::const_buffer; - - // Constructor. - // - // `h` holds the headers of the message we are - // serializing, while `b` holds the body. - // - // Note that the message is passed by non-const reference. - // This is intentional, because reading from the file - // changes its "current position" which counts makes the - // operation logically not-const (although it is bitwise - // const). - // - // The BodyWriter concept allows the writer to choose - // whether to take the message by const reference or - // non-const reference. Depending on the choice, a - // serializer constructed using that body type will - // require the same const or non-const reference to - // construct. - // - // Readers which accept const messages usually allow - // the same body to be serialized by multiple threads - // concurrently, while readers accepting non-const - // messages may only be serialized by one thread at - // a time. - // - template<bool isRequest, class Fields> - writer(header<isRequest, Fields>& h, value_type& b); - - // Initializer - // - // This is called before the body is serialized and - // gives the writer a chance to do something that might - // need to return an error code. - // - void - init(error_code& ec); - - // This function is called zero or more times to - // retrieve buffers. A return value of `boost::none` - // means there are no more buffers. Otherwise, - // the contained pair will have the next buffer - // to serialize, and a `bool` indicating whether - // or not there may be additional buffers. - boost::optional<std::pair<const_buffers_type, bool>> - get(error_code& ec); -}; - -//] - -//[example_http_file_body_4 - -// Here we just stash a reference to the path for later. -// Rather than dealing with messy constructor exceptions, -// we save the things that might fail for the call to `init`. -// -template<class File> -template<bool isRequest, class Fields> -basic_file_body<File>:: -writer:: -writer(header<isRequest, Fields>& h, value_type& b) - : body_(b) -{ - boost::ignore_unused(h); - - // The file must already be open - BOOST_ASSERT(body_.file_.is_open()); - - // Get the size of the file - remain_ = body_.file_size_; -} - -// Initializer -template<class File> -void -basic_file_body<File>:: -writer:: -init(error_code& ec) -{ - // The error_code specification requires that we - // either set the error to some value, or set it - // to indicate no error. - // - // We don't do anything fancy so set "no error" - ec.assign(0, ec.category()); -} - -// This function is called repeatedly by the serializer to -// retrieve the buffers representing the body. Our strategy -// is to read into our buffer and return it until we have -// read through the whole file. -// -template<class File> -auto -basic_file_body<File>:: -writer:: -get(error_code& ec) -> - boost::optional<std::pair<const_buffers_type, bool>> -{ - // Calculate the smaller of our buffer size, - // or the amount of unread data in the file. - auto const amount = remain_ > sizeof(buf_) ? - sizeof(buf_) : static_cast<std::size_t>(remain_); - - // Handle the case where the file is zero length - if(amount == 0) - { - // Modify the error code to indicate success - // This is required by the error_code specification. - // - // NOTE We use the existing category instead of calling - // into the library to get the generic category because - // that saves us a possibly expensive atomic operation. - // - ec.assign(0, ec.category()); - return boost::none; - } - - // Now read the next buffer - auto const nread = body_.file_.read(buf_, amount, ec); - if(ec) - return boost::none; - - // Make sure there is forward progress - BOOST_ASSERT(nread != 0); - BOOST_ASSERT(nread <= remain_); - - // Update the amount remaining based on what we got - remain_ -= nread; - - // Return the buffer to the caller. - // - // The second element of the pair indicates whether or - // not there is more data. As long as there is some - // unread bytes, there will be more data. Otherwise, - // we set this bool to `false` so we will not be called - // again. - // - ec.assign(0, ec.category()); - return {{ - const_buffers_type{buf_, nread}, // buffer to return. - remain_ > 0 // `true` if there are more buffers. - }}; -} - -//] - -//[example_http_file_body_5 - -/** Algorithm for storing buffers when parsing. - - Objects of this type are created during parsing - to store incoming buffers representing the body. -*/ -template<class File> -class basic_file_body<File>::reader -{ - value_type& body_; // The body we are writing to - -public: - // Constructor. - // - // This is called after the header is parsed and - // indicates that a non-zero sized body may be present. - // `h` holds the received message headers. - // `b` is an instance of `basic_file_body`. - // - template<bool isRequest, class Fields> - explicit - reader(header<isRequest, Fields>&h, value_type& b); - - // Initializer - // - // This is called before the body is parsed and - // gives the reader a chance to do something that might - // need to return an error code. It informs us of - // the payload size (`content_length`) which we can - // optionally use for optimization. - // - void - init(boost::optional<std::uint64_t> const&, error_code& ec); - - // This function is called one or more times to store - // buffer sequences corresponding to the incoming body. - // - template<class ConstBufferSequence> - std::size_t - put(ConstBufferSequence const& buffers, - error_code& ec); - - // This function is called when writing is complete. - // It is an opportunity to perform any final actions - // which might fail, in order to return an error code. - // Operations that might fail should not be attemped in - // destructors, since an exception thrown from there - // would terminate the program. - // - void - finish(error_code& ec); -}; - -//] - -//[example_http_file_body_6 - -// We don't do much in the reader constructor since the -// file is already open. -// -template<class File> -template<bool isRequest, class Fields> -basic_file_body<File>:: -reader:: -reader(header<isRequest, Fields>& h, value_type& body) - : body_(body) -{ - boost::ignore_unused(h); -} - -template<class File> -void -basic_file_body<File>:: -reader:: -init( - boost::optional<std::uint64_t> const& content_length, - error_code& ec) -{ - // The file must already be open for writing - BOOST_ASSERT(body_.file_.is_open()); - - // We don't do anything with this but a sophisticated - // application might check available space on the device - // to see if there is enough room to store the body. - boost::ignore_unused(content_length); - - // The error_code specification requires that we - // either set the error to some value, or set it - // to indicate no error. - // - // We don't do anything fancy so set "no error" - ec.assign(0, ec.category()); -} - -// This will get called one or more times with body buffers -// -template<class File> -template<class ConstBufferSequence> -std::size_t -basic_file_body<File>:: -reader:: -put(ConstBufferSequence const& buffers, error_code& ec) -{ - // This function must return the total number of - // bytes transferred from the input buffers. - std::size_t nwritten = 0; - - // Loop over all the buffers in the sequence, - // and write each one to the file. - for(auto it = boost::asio::buffer_sequence_begin(buffers); - it != boost::asio::buffer_sequence_end(buffers); ++it) - { - // Write this buffer to the file - boost::asio::const_buffer buffer = *it; - nwritten += body_.file_.write( - buffer.data(), buffer.size(), ec); - if(ec) - return nwritten; - } - - // Indicate success - // This is required by the error_code specification - ec.assign(0, ec.category()); - - return nwritten; -} - -// Called after writing is done when there's no error. -template<class File> -void -basic_file_body<File>:: -reader:: -finish(error_code& ec) -{ - // This has to be cleared before returning, to - // indicate no error. The specification requires it. - ec.assign(0, ec.category()); -} - -//] - -#if ! BOOST_BEAST_DOXYGEN -// operator<< is not supported for file_body -template<bool isRequest, class File, class Fields> -std::ostream& -operator<<(std::ostream& os, message< - isRequest, basic_file_body<File>, Fields> const& msg) = delete; -#endif - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/basic_parser.hpp b/contrib/restricted/boost/boost/beast/http/basic_parser.hpp deleted file mode 100644 index 552adec7e4..0000000000 --- a/contrib/restricted/boost/boost/beast/http/basic_parser.hpp +++ /dev/null @@ -1,621 +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_HTTP_BASIC_PARSER_HPP -#define BOOST_BEAST_HTTP_BASIC_PARSER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/http/field.hpp> -#include <boost/beast/http/verb.hpp> -#include <boost/beast/http/detail/basic_parser.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/optional.hpp> -#include <boost/assert.hpp> -#include <limits> -#include <memory> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/** A parser for decoding HTTP/1 wire format messages. - - This parser is designed to efficiently parse messages in the - HTTP/1 wire format. It allocates no memory when input is - presented as a single contiguous buffer, and uses minimal - state. It will handle chunked encoding and it understands - the semantics of the Connection, Content-Length, and Upgrade - fields. - The parser is optimized for the case where the input buffer - sequence consists of a single contiguous buffer. The - @ref flat_buffer class is provided, which guarantees - that the input sequence of the stream buffer will be represented - by exactly one contiguous buffer. To ensure the optimum performance - of the parser, use @ref flat_buffer with HTTP algorithms - such as @ref read, @ref read_some, @ref async_read, and @ref async_read_some. - Alternatively, the caller may use custom techniques to ensure that - the structured portion of the HTTP message (header or chunk header) - is contained in a linear buffer. - - The interface uses CRTP (Curiously Recurring Template Pattern). - To use this class directly, derive from @ref basic_parser. When - bytes are presented, the implementation will make a series of zero - or more calls to derived class members functions (termed "callbacks" - in this context) matching a specific signature. - - Every callback must be provided by the derived class, or else - a compilation error will be generated. This exemplar shows - the signature and description of the callbacks required in - the derived class. - For each callback, the function will ensure that `!ec` is `true` - if there was no error or set to the appropriate error code if - there was one. If an error is set, the value is propagated to - the caller of the parser. - - @par Derived Class Requirements - @code - template<bool isRequest> - class derived - : public basic_parser<isRequest, derived<isRequest>> - { - private: - // The friend declaration is needed, - // otherwise the callbacks must be made public. - friend class basic_parser<isRequest, derived>; - - /// Called after receiving the request-line (isRequest == true). - void - on_request_impl( - verb method, // The method verb, verb::unknown if no match - string_view method_str, // The method as a string - string_view target, // The request-target - int version, // The HTTP-version - error_code& ec); // The error returned to the caller, if any - - /// Called after receiving the start-line (isRequest == false). - void - on_response_impl( - int code, // The status-code - string_view reason, // The obsolete reason-phrase - int version, // The HTTP-version - error_code& ec); // The error returned to the caller, if any - - /// Called after receiving a header field. - void - on_field_impl( - field f, // The known-field enumeration constant - string_view name, // The field name string. - string_view value, // The field value - error_code& ec); // The error returned to the caller, if any - - /// Called after the complete header is received. - void - on_header_impl( - error_code& ec); // The error returned to the caller, if any - - /// Called just before processing the body, if a body exists. - void - on_body_init_impl( - boost::optional< - std::uint64_t> const& - content_length, // Content length if known, else `boost::none` - error_code& ec); // The error returned to the caller, if any - - /// Called for each piece of the body, if a body exists. - //! - //! This is used when there is no chunked transfer coding. - //! - //! The function returns the number of bytes consumed from the - //! input buffer. Any input octets not consumed will be will be - //! presented on subsequent calls. - //! - std::size_t - on_body_impl( - string_view s, // A portion of the body - error_code& ec); // The error returned to the caller, if any - - /// Called for each chunk header. - void - on_chunk_header_impl( - std::uint64_t size, // The size of the upcoming chunk, - // or zero for the last chunk - string_view extension, // The chunk extensions (may be empty) - error_code& ec); // The error returned to the caller, if any - - /// Called to deliver the chunk body. - //! - //! This is used when there is a chunked transfer coding. The - //! implementation will automatically remove the encoding before - //! calling this function. - //! - //! The function returns the number of bytes consumed from the - //! input buffer. Any input octets not consumed will be will be - //! presented on subsequent calls. - //! - std::size_t - on_chunk_body_impl( - std::uint64_t remain, // The number of bytes remaining in the chunk, - // including what is being passed here. - // or zero for the last chunk - string_view body, // The next piece of the chunk body - error_code& ec); // The error returned to the caller, if any - - /// Called when the complete message is parsed. - void - on_finish_impl(error_code& ec); - - public: - derived() = default; - }; - @endcode - - @tparam isRequest A `bool` indicating whether the parser will be - presented with request or response message. - - @tparam Derived The derived class type. This is part of the - Curiously Recurring Template Pattern interface. - - @note If the parser encounters a field value with obs-fold - longer than 4 kilobytes in length, an error is generated. -*/ -template<bool isRequest, class Derived> -class basic_parser - : private detail::basic_parser_base -{ - template<bool OtherIsRequest, class OtherDerived> - friend class basic_parser; - - // limit on the size of the stack flat buffer - static std::size_t constexpr max_stack_buffer = 8192; - - // Message will be complete after reading header - static unsigned constexpr flagSkipBody = 1<< 0; - - // Consume input buffers across semantic boundaries - static unsigned constexpr flagEager = 1<< 1; - - // The parser has read at least one byte - static unsigned constexpr flagGotSome = 1<< 2; - - // Message semantics indicate a body is expected. - // cleared if flagSkipBody set - // - static unsigned constexpr flagHasBody = 1<< 3; - - static unsigned constexpr flagHTTP11 = 1<< 4; - static unsigned constexpr flagNeedEOF = 1<< 5; - static unsigned constexpr flagExpectCRLF = 1<< 6; - static unsigned constexpr flagConnectionClose = 1<< 7; - static unsigned constexpr flagConnectionUpgrade = 1<< 8; - static unsigned constexpr flagConnectionKeepAlive = 1<< 9; - static unsigned constexpr flagContentLength = 1<< 10; - static unsigned constexpr flagChunked = 1<< 11; - static unsigned constexpr flagUpgrade = 1<< 12; - static unsigned constexpr flagFinalChunk = 1<< 13; - - static constexpr - std::uint64_t - default_body_limit(std::true_type) - { - // limit for requests - return 1 * 1024 * 1024; // 1MB - } - - static constexpr - std::uint64_t - default_body_limit(std::false_type) - { - // limit for responses - return 8 * 1024 * 1024; // 8MB - } - - std::uint64_t body_limit_ = - default_body_limit(is_request{}); // max payload body - std::uint64_t len_ = 0; // size of chunk or body - std::unique_ptr<char[]> buf_; // temp storage - std::size_t buf_len_ = 0; // size of buf_ - std::size_t skip_ = 0; // resume search here - std::uint32_t header_limit_ = 8192; // max header size - unsigned short status_ = 0; // response status - state state_ = state::nothing_yet; // initial state - unsigned f_ = 0; // flags - -protected: - /// Default constructor - basic_parser() = default; - - /// Move constructor - basic_parser(basic_parser &&) = default; - - /// Move assignment - basic_parser& operator=(basic_parser &&) = default; - - /** Move constructor - - @note - - After the move, the only valid operation on the - moved-from object is destruction. - */ - template<class OtherDerived> - basic_parser(basic_parser<isRequest, OtherDerived>&&); - -public: - /// `true` if this parser parses requests, `false` for responses. - using is_request = - std::integral_constant<bool, isRequest>; - - /// Destructor - ~basic_parser() = default; - - /// Copy constructor - basic_parser(basic_parser const&) = delete; - - /// Copy assignment - basic_parser& operator=(basic_parser const&) = delete; - - /** Returns a reference to this object as a @ref basic_parser. - - This is used to pass a derived class where a base class is - expected, to choose a correct function overload when the - resolution would be ambiguous. - */ - basic_parser& - base() - { - return *this; - } - - /** Returns a constant reference to this object as a @ref basic_parser. - - This is used to pass a derived class where a base class is - expected, to choose a correct function overload when the - resolution would be ambiguous. - */ - basic_parser const& - base() const - { - return *this; - } - - /// Returns `true` if the parser has received at least one byte of input. - bool - got_some() const - { - return state_ != state::nothing_yet; - } - - /** Returns `true` if the message is complete. - - The message is complete after the full header is prduced - and one of the following is true: - - @li The skip body option was set. - - @li The semantics of the message indicate there is no body. - - @li The semantics of the message indicate a body is expected, - and the entire body was parsed. - */ - bool - is_done() const - { - return state_ == state::complete; - } - - /** Returns `true` if a the parser has produced the full header. - */ - bool - is_header_done() const - { - return state_ > state::fields; - } - - /** Returns `true` if the message is an upgrade message. - - @note The return value is undefined unless - @ref is_header_done would return `true`. - */ - bool - upgrade() const - { - return (f_ & flagConnectionUpgrade) != 0; - } - - /** Returns `true` if the last value for Transfer-Encoding is "chunked". - - @note The return value is undefined unless - @ref is_header_done would return `true`. - */ - bool - chunked() const - { - return (f_ & flagChunked) != 0; - } - - /** Returns `true` if the message has keep-alive connection semantics. - - This function always returns `false` if @ref need_eof would return - `false`. - - @note The return value is undefined unless - @ref is_header_done would return `true`. - */ - bool - keep_alive() const; - - /** Returns the optional value of Content-Length if known. - - @note The return value is undefined unless - @ref is_header_done would return `true`. - */ - boost::optional<std::uint64_t> - content_length() const; - - /** Returns `true` if the message semantics require an end of file. - - Depending on the contents of the header, the parser may - require and end of file notification to know where the end - of the body lies. If this function returns `true` it will be - necessary to call @ref put_eof when there will never be additional - data from the input. - */ - bool - need_eof() const - { - return (f_ & flagNeedEOF) != 0; - } - - /** Set the limit on the payload body. - - This function sets the maximum allowed size of the payload body, - before any encodings except chunked have been removed. Depending - on the message semantics, one of these cases will apply: - - @li The Content-Length is specified and exceeds the limit. In - this case the result @ref error::body_limit is returned - immediately after the header is parsed. - - @li The Content-Length is unspecified and the chunked encoding - is not specified as the last encoding. In this case the end of - message is determined by the end of file indicator on the - associated stream or input source. If a sufficient number of - body payload octets are presented to the parser to exceed the - configured limit, the parse fails with the result - @ref error::body_limit - - @li The Transfer-Encoding specifies the chunked encoding as the - last encoding. In this case, when the number of payload body - octets produced by removing the chunked encoding exceeds - the configured limit, the parse fails with the result - @ref error::body_limit. - - Setting the limit after any body octets have been parsed - results in undefined behavior. - - The default limit is 1MB for requests and 8MB for responses. - - @param v The payload body limit to set - */ - void - body_limit(std::uint64_t v) - { - body_limit_ = v; - } - - /** Set a limit on the total size of the header. - - This function sets the maximum allowed size of the header - including all field name, value, and delimiter characters - and also including the CRLF sequences in the serialized - input. If the end of the header is not found within the - limit of the header size, the error @ref error::header_limit - is returned by @ref put. - - Setting the limit after any header octets have been parsed - results in undefined behavior. - */ - void - header_limit(std::uint32_t v) - { - header_limit_ = v; - } - - /// Returns `true` if the eager parse option is set. - bool - eager() const - { - return (f_ & flagEager) != 0; - } - - /** Set the eager parse option. - - Normally the parser returns after successfully parsing a structured - element (header, chunk header, or chunk body) even if there are octets - remaining in the input. This is necessary when attempting to parse the - header first, or when the caller wants to inspect information which may - be invalidated by subsequent parsing, such as a chunk extension. The - `eager` option controls whether the parser keeps going after parsing - structured element if there are octets remaining in the buffer and no - error occurs. This option is automatically set or cleared during certain - stream operations to improve performance with no change in functionality. - - The default setting is `false`. - - @param v `true` to set the eager parse option or `false` to disable it. - */ - void - eager(bool v) - { - if(v) - f_ |= flagEager; - else - f_ &= ~flagEager; - } - - /// Returns `true` if the skip parse option is set. - bool - skip() const - { - return (f_ & flagSkipBody) != 0; - } - - /** Set the skip parse option. - - This option controls whether or not the parser expects to see an HTTP - body, regardless of the presence or absence of certain fields such as - Content-Length or a chunked Transfer-Encoding. Depending on the request, - some responses do not carry a body. For example, a 200 response to a - CONNECT request from a tunneling proxy, or a response to a HEAD request. - In these cases, callers may use this function inform the parser that - no body is expected. The parser will consider the message complete - after the header has been received. - - @param v `true` to set the skip body option or `false` to disable it. - - @note This function must called before any bytes are processed. - */ - void - skip(bool v); - - /** Write a buffer sequence to the parser. - - This function attempts to incrementally parse the HTTP - message data stored in the caller provided buffers. Upon - success, a positive return value indicates that the parser - made forward progress, consuming that number of - bytes. - - In some cases there may be an insufficient number of octets - in the input buffer in order to make forward progress. This - is indicated by the code @ref error::need_more. When - this happens, the caller should place additional bytes into - the buffer sequence and call @ref put again. - - The error code @ref error::need_more is special. When this - error is returned, a subsequent call to @ref put may succeed - if the buffers have been updated. Otherwise, upon error - the parser may not be restarted. - - @param buffers An object meeting the requirements of - @b ConstBufferSequence that represents the next chunk of - message data. If the length of this buffer sequence is - one, the implementation will not allocate additional memory. - The class @ref beast::flat_buffer is provided as one way to - meet this requirement - - @param ec Set to the error, if any occurred. - - @return The number of octets consumed in the buffer - sequence. The caller should remove these octets even if the - error is set. - */ - template<class ConstBufferSequence> - std::size_t - put(ConstBufferSequence const& buffers, error_code& ec); - -#if ! BOOST_BEAST_DOXYGEN - std::size_t - put(boost::asio::const_buffer const& buffer, - error_code& ec); -#endif - - /** Inform the parser that the end of stream was reached. - - In certain cases, HTTP needs to know where the end of - the stream is. For example, sometimes servers send - responses without Content-Length and expect the client - to consume input (for the body) until EOF. Callbacks - and errors will still be processed as usual. - - This is typically called when a read from the - underlying stream object sets the error code to - `boost::asio::error::eof`. - - @note Only valid after parsing a complete header. - - @param ec Set to the error, if any occurred. - */ - void - put_eof(error_code& ec); - -private: - inline - Derived& - impl() - { - return *static_cast<Derived*>(this); - } - - template<class ConstBufferSequence> - std::size_t - put_from_stack(std::size_t size, - ConstBufferSequence const& buffers, - error_code& ec); - - void - maybe_need_more( - char const* p, std::size_t n, - error_code& ec); - - void - parse_start_line( - char const*& p, char const* last, - error_code& ec, std::true_type); - - void - parse_start_line( - char const*& p, char const* last, - error_code& ec, std::false_type); - - void - parse_fields( - char const*& p, char const* last, - error_code& ec); - - void - finish_header( - error_code& ec, std::true_type); - - void - finish_header( - error_code& ec, std::false_type); - - void - parse_body(char const*& p, - std::size_t n, error_code& ec); - - void - parse_body_to_eof(char const*& p, - std::size_t n, error_code& ec); - - void - parse_chunk_header(char const*& p, - std::size_t n, error_code& ec); - - void - parse_chunk_body(char const*& p, - std::size_t n, error_code& ec); - - void - do_field(field f, - string_view value, error_code& ec); -}; - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/basic_parser.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/buffer_body.hpp b/contrib/restricted/boost/boost/beast/http/buffer_body.hpp deleted file mode 100644 index 3ffe0a002a..0000000000 --- a/contrib/restricted/boost/boost/beast/http/buffer_body.hpp +++ /dev/null @@ -1,227 +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_HTTP_BUFFER_BODY_HPP -#define BOOST_BEAST_HTTP_BUFFER_BODY_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/beast/http/type_traits.hpp> -#include <boost/optional.hpp> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/** A @b Body using a caller provided buffer - - Messages using this body type may be serialized and parsed. - To use this class, the caller must initialize the members - of @ref buffer_body::value_type to appropriate values before - each call to read or write during a stream operation. -*/ -struct buffer_body -{ - /// The type of the body member when used in a message. - struct value_type - { - /** A pointer to a contiguous area of memory of @ref size octets, else `nullptr`. - - @par When Serializing - - If this is `nullptr` and `more` is `true`, the error - @ref error::need_buffer will be returned from @ref serializer::get - Otherwise, the serializer will use the memory pointed to - by `data` having `size` octets of valid storage as the - next buffer representing the body. - - @par When Parsing - - If this is `nullptr`, the error @ref error::need_buffer - will be returned from @ref parser::put. Otherwise, the - parser will store body octets into the memory pointed to - by `data` having `size` octets of valid storage. After - octets are stored, the `data` and `size` members are - adjusted: `data` is incremented to point to the next - octet after the data written, while `size` is decremented - to reflect the remaining space at the memory location - pointed to by `data`. - */ - void* data = nullptr; - - /** The number of octets in the buffer pointed to by @ref data. - - @par When Serializing - - If `data` is `nullptr` during serialization, this value - is ignored. Otherwise, it represents the number of valid - body octets pointed to by `data`. - - @par When Parsing - - The value of this field will be decremented during parsing - to indicate the number of remaining free octets in the - buffer pointed to by `data`. When it reaches zero, the - parser will return @ref error::need_buffer, indicating to - the caller that the values of `data` and `size` should be - updated to point to a new memory buffer. - */ - std::size_t size = 0; - - /** `true` if this is not the last buffer. - - @par When Serializing - - If this is `true` and `data` is `nullptr`, the error - @ref error::need_buffer will be returned from @ref serializer::get - - @par When Parsing - - This field is not used during parsing. - */ - bool more = true; - }; - - /** The algorithm for parsing the body - - Meets the requirements of @b BodyReader. - */ -#if BOOST_BEAST_DOXYGEN - using reader = implementation_defined; -#else - class reader - { - value_type& body_; - - public: - template<bool isRequest, class Fields> - explicit - reader(header<isRequest, Fields>&, value_type& b) - : body_(b) - { - } - - void - init(boost::optional<std::uint64_t> const&, error_code& ec) - { - ec.assign(0, ec.category()); - } - - template<class ConstBufferSequence> - std::size_t - put(ConstBufferSequence const& buffers, - error_code& ec) - { - using boost::asio::buffer_size; - using boost::asio::buffer_copy; - if(! body_.data) - { - ec = error::need_buffer; - return 0; - } - auto const bytes_transferred = - buffer_copy(boost::asio::buffer( - body_.data, body_.size), buffers); - body_.data = reinterpret_cast<char*>( - body_.data) + bytes_transferred; - body_.size -= bytes_transferred; - if(bytes_transferred == buffer_size(buffers)) - ec.assign(0, ec.category()); - else - ec = error::need_buffer; - return bytes_transferred; - } - - void - finish(error_code& ec) - { - ec.assign(0, ec.category()); - } - }; -#endif - - /** The algorithm for serializing the body - - Meets the requirements of @b BodyWriter. - */ -#if BOOST_BEAST_DOXYGEN - using writer = implementation_defined; -#else - class writer - { - bool toggle_ = false; - value_type const& body_; - - public: - using const_buffers_type = - boost::asio::const_buffer; - - template<bool isRequest, class Fields> - explicit - writer(header<isRequest, Fields> const&, value_type const& b) - : body_(b) - { - } - - void - init(error_code& ec) - { - ec.assign(0, ec.category()); - } - - boost::optional< - std::pair<const_buffers_type, bool>> - get(error_code& ec) - { - if(toggle_) - { - if(body_.more) - { - toggle_ = false; - ec = error::need_buffer; - } - else - { - ec.assign(0, ec.category()); - } - return boost::none; - } - if(body_.data) - { - ec.assign(0, ec.category()); - toggle_ = true; - return {{const_buffers_type{ - body_.data, body_.size}, body_.more}}; - } - if(body_.more) - ec = error::need_buffer; - else - ec.assign(0, ec.category()); - return boost::none; - } - }; -#endif -}; - -#if ! BOOST_BEAST_DOXYGEN -// operator<< is not supported for buffer_body -template<bool isRequest, class Fields> -std::ostream& -operator<<(std::ostream& os, message<isRequest, - buffer_body, Fields> const& msg) = delete; -#endif - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/chunk_encode.hpp b/contrib/restricted/boost/boost/beast/http/chunk_encode.hpp deleted file mode 100644 index 4994765fc8..0000000000 --- a/contrib/restricted/boost/boost/beast/http/chunk_encode.hpp +++ /dev/null @@ -1,736 +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_HTTP_CHUNK_ENCODE_HPP -#define BOOST_BEAST_HTTP_CHUNK_ENCODE_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/buffers_cat.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/http/type_traits.hpp> -#include <boost/beast/http/detail/chunk_encode.hpp> -#include <boost/asio/buffer.hpp> -#include <memory> -#include <type_traits> - -namespace boost { -namespace beast { -namespace http { - -/** A chunked encoding crlf - - This implements a @b ConstBufferSequence holding the CRLF - (`"\r\n"`) used as a delimiter in a @em chunk. - - To use this class, pass an instance of it to a - stream algorithm as the buffer sequence: - @code - // writes "\r\n" - boost::asio::write(stream, chunk_crlf{}); - @endcode - - @see https://tools.ietf.org/html/rfc7230#section-4.1 -*/ -struct chunk_crlf -{ - /// Constructor - chunk_crlf() = default; - - //----- - - /// Required for @b ConstBufferSequence -#if BOOST_BEAST_DOXYGEN - using value_type = implementation_defined; -#else - using value_type = detail::chunk_crlf_iter::value_type; -#endif - - /// Required for @b ConstBufferSequence - using const_iterator = value_type const*; - - /// Required for @b ConstBufferSequence - chunk_crlf(chunk_crlf const&) = default; - - /// Required for @b ConstBufferSequence - const_iterator - begin() const - { - return &detail::chunk_crlf_iter::value; - } - - /// Required for @b ConstBufferSequence - const_iterator - end() const - { - return begin() + 1; - } -}; - -//------------------------------------------------------------------------------ - -/** A @em chunk header - - This implements a @b ConstBufferSequence representing the - header of a @em chunk. The serialized format is as follows: - @code - chunk-header = 1*HEXDIG chunk-ext CRLF - chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) - chunk-ext-name = token - chunk-ext-val = token / quoted-string - @endcode - The chunk extension is optional. After the header and - chunk body have been serialized, it is the callers - responsibility to also serialize the final CRLF (`"\r\n"`). - - This class allows the caller to emit piecewise chunk bodies, - by first serializing the chunk header using this class and then - serializing the chunk body in a series of one or more calls to - a stream write operation. - - To use this class, pass an instance of it to a - stream algorithm as the buffer sequence: - @code - // writes "400;x\r\n" - boost::asio::write(stream, chunk_header{1024, "x"}); - @endcode - - @see https://tools.ietf.org/html/rfc7230#section-4.1 -*/ -class chunk_header -{ - using view_type = buffers_cat_view< - detail::chunk_size, // chunk-size - boost::asio::const_buffer, // chunk-extensions - chunk_crlf>; // CRLF - - std::shared_ptr< - detail::chunk_extensions> exts_; - view_type view_; - -public: - /** Constructor - - This constructs a buffer sequence representing a - @em chunked-body size and terminating CRLF (`"\r\n"`) - with no chunk extensions. - - @param size The size of the chunk body that follows. - The value must be greater than zero. - - @see https://tools.ietf.org/html/rfc7230#section-4.1 - */ - explicit - chunk_header(std::size_t size); - - /** Constructor - - This constructs a buffer sequence representing a - @em chunked-body size and terminating CRLF (`"\r\n"`) - with provided chunk extensions. - - @param size The size of the chunk body that follows. - The value must be greater than zero. - - @param extensions The chunk extensions string. This - string must be formatted correctly as per rfc7230, - using this BNF syntax: - @code - chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) - chunk-ext-name = token - chunk-ext-val = token / quoted-string - @endcode - The data pointed to by this string view must remain - valid for the lifetime of any operations performed on - the object. - - @see https://tools.ietf.org/html/rfc7230#section-4.1.1 - */ - chunk_header( - std::size_t size, - string_view extensions); - - /** Constructor - - This constructs a buffer sequence representing a - @em chunked-body size and terminating CRLF (`"\r\n"`) - with provided chunk extensions. - The default allocator is used to provide storage for the - extensions object. - - @param size The size of the chunk body that follows. - The value must be greater than zero. - - @param extensions The chunk extensions object. The expression - `extensions.str()` must be valid, and the return type must - be convertible to @ref string_view. This object will be copied - or moved as needed to ensure that the chunk header object retains - ownership of the buffers provided by the chunk extensions object. - - @note This function participates in overload resolution only - if @b ChunkExtensions meets the requirements stated above. - - @see https://tools.ietf.org/html/rfc7230#section-4.1 - */ - template<class ChunkExtensions -#if ! BOOST_BEAST_DOXYGEN - , class = typename std::enable_if< - detail::is_chunk_extensions< - ChunkExtensions>::value>::type -#endif - > - chunk_header( - std::size_t size, - ChunkExtensions&& extensions); - - /** Constructor - - This constructs a buffer sequence representing a - @em chunked-body size and terminating CRLF (`"\r\n"`) - with provided chunk extensions. - The specified allocator is used to provide storage for the - extensions object. - - @param size The size of the chunk body that follows. - The value be greater than zero. - - @param extensions The chunk extensions object. The expression - `extensions.str()` must be valid, and the return type must - be convertible to @ref string_view. This object will be copied - or moved as needed to ensure that the chunk header object retains - ownership of the buffers provided by the chunk extensions object. - - @param allocator The allocator to provide storage for the moved - or copied extensions object. - - @note This function participates in overload resolution only - if @b ChunkExtensions meets the requirements stated above. - - @see https://tools.ietf.org/html/rfc7230#section-4.1 - */ - template<class ChunkExtensions, class Allocator -#if ! BOOST_BEAST_DOXYGEN - , class = typename std::enable_if< - detail::is_chunk_extensions< - ChunkExtensions>::value>::type -#endif - > - chunk_header( - std::size_t size, - ChunkExtensions&& extensions, - Allocator const& allocator); - - //----- - - /// Required for @b ConstBufferSequence -#if BOOST_BEAST_DOXYGEN - using value_type = implementation_defined; -#else - using value_type = typename view_type::value_type; -#endif - - /// Required for @b ConstBufferSequence -#if BOOST_BEAST_DOXYGEN - using const_iterator = implementation_defined; -#else - using const_iterator = typename view_type::const_iterator; -#endif - - /// Required for @b ConstBufferSequence - chunk_header(chunk_header const&) = default; - - /// Required for @b ConstBufferSequence - const_iterator - begin() const - { - return view_.begin(); - } - - /// Required for @b ConstBufferSequence - const_iterator - end() const - { - return view_.end(); - } -}; - -//------------------------------------------------------------------------------ - -/** A @em chunk - - This implements a @b ConstBufferSequence representing - a @em chunk. The serialized format is as follows: - @code - chunk = chunk-size [ chunk-ext ] CRLF chunk-data CRLF - chunk-size = 1*HEXDIG - chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) - chunk-ext-name = token - chunk-ext-val = token / quoted-string - chunk-data = 1*OCTET ; a sequence of chunk-size octets - @endcode - The chunk extension is optional. - - To use this class, pass an instance of it to a - stream algorithm as the buffer sequence. - - @see https://tools.ietf.org/html/rfc7230#section-4.1 -*/ -template<class ConstBufferSequence> -class chunk_body -{ - using view_type = buffers_cat_view< - detail::chunk_size, // chunk-size - boost::asio::const_buffer, // chunk-extensions - chunk_crlf, // CRLF - ConstBufferSequence, // chunk-body - chunk_crlf>; // CRLF - - std::shared_ptr< - detail::chunk_extensions> exts_; - view_type view_; - -public: - /** Constructor - - This constructs buffers representing a complete @em chunk - with no chunk extensions and having the size and contents - of the specified buffer sequence. - - @param buffers A buffer sequence representing the chunk - body. 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 while this - object is in use. - - @see https://tools.ietf.org/html/rfc7230#section-4.1 - */ - explicit - chunk_body( - ConstBufferSequence const& buffers); - - /** Constructor - - This constructs buffers representing a complete @em chunk - with the passed chunk extensions and having the size and - contents of the specified buffer sequence. - - @param buffers A buffer sequence representing the chunk - body. 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 while this - object is in use. - - @param extensions The chunk extensions string. This - string must be formatted correctly as per rfc7230, - using this BNF syntax: - @code - chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) - chunk-ext-name = token - chunk-ext-val = token / quoted-string - @endcode - The data pointed to by this string view must remain - valid for the lifetime of any operations performed on - the object. - - @see https://tools.ietf.org/html/rfc7230#section-4.1.1 - */ - chunk_body( - ConstBufferSequence const& buffers, - string_view extensions); - - /** Constructor - - This constructs buffers representing a complete @em chunk - with the passed chunk extensions and having the size and - contents of the specified buffer sequence. - The default allocator is used to provide storage for the - extensions object. - - @param buffers A buffer sequence representing the chunk - body. 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 while this - object is in use. - - @param extensions The chunk extensions object. The expression - `extensions.str()` must be valid, and the return type must - be convertible to @ref string_view. This object will be copied - or moved as needed to ensure that the chunk header object retains - ownership of the buffers provided by the chunk extensions object. - - @note This function participates in overload resolution only - if @b ChunkExtensions meets the requirements stated above. - - @see https://tools.ietf.org/html/rfc7230#section-4.1 - */ - template<class ChunkExtensions -#if ! BOOST_BEAST_DOXYGEN - , class = typename std::enable_if< - ! std::is_convertible<typename std::decay< - ChunkExtensions>::type, string_view>::value>::type -#endif - > - chunk_body( - ConstBufferSequence const& buffers, - ChunkExtensions&& extensions); - - /** Constructor - - This constructs buffers representing a complete @em chunk - with the passed chunk extensions and having the size and - contents of the specified buffer sequence. - The specified allocator is used to provide storage for the - extensions object. - - @param buffers A buffer sequence representing the chunk - body. 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 while this - object is in use. - - @param extensions The chunk extensions object. The expression - `extensions.str()` must be valid, and the return type must - be convertible to @ref string_view. This object will be copied - or moved as needed to ensure that the chunk header object retains - ownership of the buffers provided by the chunk extensions object. - - @param allocator The allocator to provide storage for the moved - or copied extensions object. - - @note This function participates in overload resolution only - if @b ChunkExtensions meets the requirements stated above. - - @see https://tools.ietf.org/html/rfc7230#section-4.1 - */ - template<class ChunkExtensions, class Allocator -#if ! BOOST_BEAST_DOXYGEN - , class = typename std::enable_if< - ! std::is_convertible<typename std::decay< - ChunkExtensions>::type, string_view>::value>::type -#endif - > - chunk_body( - ConstBufferSequence const& buffers, - ChunkExtensions&& extensions, - Allocator const& allocator); - - //----- - - /// Required for @b ConstBufferSequence -#if BOOST_BEAST_DOXYGEN - using value_type = implementation_defined; -#else - using value_type = typename view_type::value_type; -#endif - - /// Required for @b ConstBufferSequence -#if BOOST_BEAST_DOXYGEN - using const_iterator = implementation_defined; -#else - using const_iterator = typename view_type::const_iterator; -#endif - - /// Required for @b ConstBufferSequence - const_iterator - begin() const - { - return view_.begin(); - } - - /// Required for @b ConstBufferSequence - const_iterator - end() const - { - return view_.end(); - } -}; - -//------------------------------------------------------------------------------ - -/** A chunked-encoding last chunk -*/ -template<class Trailer = chunk_crlf> -class chunk_last -{ - static_assert( - is_fields<Trailer>::value || - boost::asio::is_const_buffer_sequence<Trailer>::value, - "Trailer requirements not met"); - - using buffers_type = typename - detail::buffers_or_fields<Trailer>::type; - - using view_type = - buffers_cat_view< - detail::chunk_size0, // "0\r\n" - buffers_type>; // Trailer (includes CRLF) - - template<class Allocator> - buffers_type - prepare(Trailer const& trailer, Allocator const& alloc); - - buffers_type - prepare(Trailer const& trailer, std::true_type); - - buffers_type - prepare(Trailer const& trailer, std::false_type); - - std::shared_ptr<void> sp_; - view_type view_; - -public: - /** Constructor - - The last chunk will have an empty trailer - */ - chunk_last(); - - /** Constructor - - @param trailer The trailer to use. This may be - a type meeting the requirements of either Fields - or ConstBufferSequence. If it is a ConstBufferSequence, - the trailer must be formatted correctly as per rfc7230 - including a CRLF on its own line to denote the end - of the trailer. - */ - explicit - chunk_last(Trailer const& trailer); - - /** Constructor - - @param trailer The trailer to use. This type must - meet the requirements of Fields. - - @param allocator The allocator to use for storing temporary - data associated with the serialized trailer buffers. - */ -#if BOOST_BEAST_DOXYGEN - template<class Allocator> - chunk_last(Trailer const& trailer, Allocator const& allocator); -#else - template<class DeducedTrailer, class Allocator, - class = typename std::enable_if< - is_fields<DeducedTrailer>::value>::type> - chunk_last( - DeducedTrailer const& trailer, Allocator const& allocator); -#endif - - //----- - - /// Required for @b ConstBufferSequence - chunk_last(chunk_last const&) = default; - - /// Required for @b ConstBufferSequence -#if BOOST_BEAST_DOXYGEN - using value_type = implementation_defined; -#else - using value_type = - typename view_type::value_type; -#endif - - /// Required for @b ConstBufferSequence -#if BOOST_BEAST_DOXYGEN - using const_iterator = implementation_defined; -#else - using const_iterator = - typename view_type::const_iterator; -#endif - - /// Required for @b ConstBufferSequence - const_iterator - begin() const - { - return view_.begin(); - } - - /// Required for @b ConstBufferSequence - const_iterator - end() const - { - return view_.end(); - } -}; - -//------------------------------------------------------------------------------ - -/** A set of chunk extensions - - This container stores a set of chunk extensions suited for use with - @ref chunk_header and @ref chunk_body. The container may be iterated - to access the extensions in their structured form. - - Meets the requirements of ChunkExtensions -*/ -template<class Allocator> -class basic_chunk_extensions -{ - std::basic_string<char, - std::char_traits<char>, Allocator> s_; - - std::basic_string<char, - std::char_traits<char>, Allocator> range_; - - template<class FwdIt> - FwdIt - do_parse(FwdIt it, FwdIt last, error_code& ec); - - void - do_insert(string_view name, string_view value); - -public: - /** The type of value when iterating. - - The first element of the pair is the name, and the second - element is the value which may be empty. The value is - stored in its raw representation, without quotes or escapes. - */ - using value_type = std::pair<string_view, string_view>; - - class const_iterator; - - /// Constructor - basic_chunk_extensions() = default; - - /// Constructor - basic_chunk_extensions(basic_chunk_extensions&&) = default; - - /// Constructor - basic_chunk_extensions(basic_chunk_extensions const&) = default; - - /** Constructor - - @param allocator The allocator to use for storing the serialized extension - */ - explicit - basic_chunk_extensions(Allocator const& allocator) - : s_(allocator) - { - } - - /** Clear the chunk extensions - - This preserves the capacity of the internal string - used to hold the serialized representation. - */ - void - clear() - { - s_.clear(); - } - - /** Parse a set of chunk extensions - - Any previous extensions will be cleared - */ - void - parse(string_view s, error_code& ec); - - /** Insert an extension name with an empty value - - @param name The name of the extension - */ - void - insert(string_view name); - - /** Insert an extension value - - @param name The name of the extension - - @param value The value to insert. Depending on the - contents, the serialized extension may use a quoted string. - */ - void - insert(string_view name, string_view value); - - /// Return the serialized representation of the chunk extension - string_view - str() const - { - return s_; - } - - const_iterator - begin() const; - - const_iterator - end() const; -}; - -//------------------------------------------------------------------------------ - -/// A set of chunk extensions -using chunk_extensions = - basic_chunk_extensions<std::allocator<char>>; - -/** Returns a @ref chunk_body - - This functions constructs and returns a complete - @ref chunk_body for a chunk body represented by the - specified buffer sequence. - - @param buffers The buffers representing the chunk body. - - @param args Optional arguments passed to the @ref chunk_body constructor. - - @note This function is provided as a notational convenience - to omit specification of the class template arguments. -*/ -template<class ConstBufferSequence, class... Args> -auto -make_chunk( - ConstBufferSequence const& buffers, - Args&&... args) -> - chunk_body<ConstBufferSequence> -{ - return chunk_body<ConstBufferSequence>( - buffers, std::forward<Args>(args)...); -} - -/** Returns a @ref chunk_last - - @note This function is provided as a notational convenience - to omit specification of the class template arguments. -*/ -inline -chunk_last<chunk_crlf> -make_chunk_last() -{ - return chunk_last<chunk_crlf>{}; -} - -/** Returns a @ref chunk_last - - This function construct and returns a complete - @ref chunk_last for a last chunk containing the - specified trailers. - - @param trailer A ConstBufferSequence or - @note This function is provided as a notational convenience - to omit specification of the class template arguments. - - @param args Optional arguments passed to the @ref chunk_last - constructor. -*/ -template<class Trailer, class... Args> -chunk_last<Trailer> -make_chunk_last( - Trailer const& trailer, - Args&&... args) -{ - return chunk_last<Trailer>{ - trailer, std::forward<Args>(args)...}; -} - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/chunk_encode.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/detail/basic_parsed_list.hpp b/contrib/restricted/boost/boost/beast/http/detail/basic_parsed_list.hpp deleted file mode 100644 index d1e1565252..0000000000 --- a/contrib/restricted/boost/boost/beast/http/detail/basic_parsed_list.hpp +++ /dev/null @@ -1,198 +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_HTTP_DETAIL_BASIC_PARSED_LIST_HPP -#define BOOST_BEAST_HTTP_DETAIL_BASIC_PARSED_LIST_HPP - -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/detail/empty_base_optimization.hpp> -#include <cstddef> -#include <iterator> - -namespace boost { -namespace beast { -namespace http { -namespace detail { - -/** A list parser which presents the sequence as a container. -*/ -template<class Policy> -class basic_parsed_list -{ - string_view s_; - -public: - /// The type of policy this list uses for parsing. - using policy_type = Policy; - - /// The type of each element in the list. - using value_type = typename Policy::value_type; - - /// A constant iterator to a list element. -#if BOOST_BEAST_DOXYGEN - using const_iterator = implementation_defined; -#else - class const_iterator; -#endif - - class const_iterator - : private beast::detail:: - empty_base_optimization<Policy> - { - basic_parsed_list const* list_ = nullptr; - char const* it_ = nullptr; - typename Policy::value_type v_; - bool error_ = false; - - public: - using value_type = - typename Policy::value_type; - using reference = value_type const&; - using pointer = value_type const*; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::forward_iterator_tag; - - const_iterator() = default; - - bool - operator==( - const_iterator const& other) const - { - return - other.list_ == list_ && - other.it_ == it_; - } - - bool - operator!=( - const_iterator const& other) const - { - return ! (*this == other); - } - - reference - operator*() const - { - return v_; - } - - const_iterator& - operator++() - { - increment(); - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - - bool - error() const - { - return error_; - } - - private: - friend class basic_parsed_list; - - const_iterator( - basic_parsed_list const& list, bool at_end) - : list_(&list) - , it_(at_end ? nullptr : - list.s_.begin()) - { - if(! at_end) - increment(); - } - - void - increment() - { - if(! this->member()( - v_, it_, list_->s_)) - { - it_ = nullptr; - error_ = true; - } - } - }; - - /// Construct a list from a string - explicit - basic_parsed_list(string_view s) - : s_(s) - { - } - - /// Return a const iterator to the beginning of the list - const_iterator begin() const; - - /// Return a const iterator to the end of the list - const_iterator end() const; - - /// Return a const iterator to the beginning of the list - const_iterator cbegin() const; - - /// Return a const iterator to the end of the list - const_iterator cend() const; -}; - -template<class Policy> -inline -auto -basic_parsed_list<Policy>:: -begin() const -> - const_iterator -{ - return const_iterator{*this, false}; -} - -template<class Policy> -inline -auto -basic_parsed_list<Policy>:: -end() const -> - const_iterator -{ - return const_iterator{*this, true}; -} - -template<class Policy> -inline -auto -basic_parsed_list<Policy>:: -cbegin() const -> - const_iterator -{ - return const_iterator{*this, false}; -} - -template<class Policy> -inline -auto -basic_parsed_list<Policy>:: -cend() const -> - const_iterator -{ - return const_iterator{*this, true}; -} - -} // detail -} // http -} // beast -} // boost - -#endif - diff --git a/contrib/restricted/boost/boost/beast/http/detail/basic_parser.hpp b/contrib/restricted/boost/boost/beast/http/detail/basic_parser.hpp deleted file mode 100644 index 0936862add..0000000000 --- a/contrib/restricted/boost/boost/beast/http/detail/basic_parser.hpp +++ /dev/null @@ -1,896 +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_HTTP_DETAIL_BASIC_PARSER_HPP -#define BOOST_BEAST_HTTP_DETAIL_BASIC_PARSER_HPP - -#include <boost/beast/core/static_string.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/detail/cpu_info.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/detail/rfc7230.hpp> -#include <boost/config.hpp> -#include <boost/version.hpp> -#include <algorithm> -#include <cstddef> -#include <utility> - -namespace boost { -namespace beast { -namespace http { -namespace detail { - -class basic_parser_base -{ -protected: - // limit on the size of the obs-fold buffer - // - // https://stackoverflow.com/questions/686217/maximum-on-http-header-values - // - static std::size_t constexpr max_obs_fold = 4096; - - enum class state - { - nothing_yet = 0, - start_line, - fields, - body0, - body, - body_to_eof0, - body_to_eof, - chunk_header0, - chunk_header, - chunk_body, - complete - }; - - static - bool - is_pathchar(char c) - { - // VFALCO This looks the same as the one below... - - // TEXT = <any OCTET except CTLs, and excluding LWS> - static bool constexpr tab[256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240 - }; - return tab[static_cast<unsigned char>(c)]; - } - - static - inline - bool - unhex(unsigned char& d, char c) - { - static signed char constexpr tab[256] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 0 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 16 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 32 - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, // 48 - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 64 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 80 - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 96 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 112 - - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 128 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 144 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 160 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 176 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 192 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 208 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 224 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 240 - }; - d = static_cast<unsigned char>( - tab[static_cast<unsigned char>(c)]); - return d != static_cast<unsigned char>(-1); - } - - static - bool - is_digit(char c) - { - return static_cast<unsigned char>(c-'0') < 10; - } - - static - bool - is_print(char c) - { - return static_cast<unsigned char>(c-32) < 95; - } - - template<class FwdIt> - static - FwdIt - trim_front(FwdIt it, FwdIt const& end) - { - while(it != end) - { - if(*it != ' ' && *it != '\t') - break; - ++it; - } - return it; - } - - template<class RanIt> - static - RanIt - trim_back( - RanIt it, RanIt const& first) - { - while(it != first) - { - auto const c = it[-1]; - if(c != ' ' && c != '\t') - break; - --it; - } - return it; - } - - static - string_view - make_string(char const* first, char const* last) - { - return {first, static_cast< - std::size_t>(last - first)}; - } - - //-------------------------------------------------------------------------- - - static - std::pair<char const*, bool> - find_fast( - char const* buf, - char const* buf_end, - char const* ranges, - size_t ranges_size) - { - bool found = false; - boost::ignore_unused(buf_end, ranges, ranges_size); - return {buf, found}; - } - - // VFALCO Can SIMD help this? - static - char const* - find_eol( - char const* it, char const* last, - error_code& ec) - { - for(;;) - { - if(it == last) - { - ec.assign(0, ec.category()); - return nullptr; - } - if(*it == '\r') - { - if(++it == last) - { - ec.assign(0, ec.category()); - return nullptr; - } - if(*it != '\n') - { - ec = error::bad_line_ending; - return nullptr; - } - ec.assign(0, ec.category()); - return ++it; - } - // VFALCO Should we handle the legacy case - // for lines terminated with a single '\n'? - ++it; - } - } - - static - char const* - find_eom(char const* p, char const* last) - { - for(;;) - { - if(p + 4 > last) - return nullptr; - if(p[3] != '\n') - { - if(p[3] == '\r') - ++p; - else - p += 4; - } - else if(p[2] != '\r') - { - p += 4; - } - else if(p[1] != '\n') - { - p += 2; - } - else if(p[0] != '\r') - { - p += 2; - } - else - { - return p + 4; - } - } - } - - //-------------------------------------------------------------------------- - - static - char const* - parse_token_to_eol( - char const* p, - char const* last, - char const*& token_last, - error_code& ec) - { - for(;; ++p) - { - if(p >= last) - { - ec = error::need_more; - return p; - } - if(BOOST_UNLIKELY(! is_print(*p))) - if((BOOST_LIKELY(static_cast< - unsigned char>(*p) < '\040') && - BOOST_LIKELY(*p != '\011')) || - BOOST_UNLIKELY(*p == '\177')) - goto found_control; - } - found_control: - if(BOOST_LIKELY(*p == '\r')) - { - if(++p >= last) - { - ec = error::need_more; - return last; - } - if(*p++ != '\n') - { - ec = error::bad_line_ending; - return last; - } - token_last = p - 2; - } - #if 0 - // VFALCO This allows `\n` by itself - // to terminate a line - else if(*p == '\n') - { - token_last = p; - ++p; - } - #endif - else - { - // invalid character - return nullptr; - } - return p; - } - - template<class Iter, class Unsigned> - static - bool - parse_dec(Iter it, Iter last, Unsigned& v) - { - if(! is_digit(*it)) - return false; - v = *it - '0'; - for(;;) - { - if(! is_digit(*++it)) - break; - auto const d = *it - '0'; - if(v > ((std::numeric_limits< - Unsigned>::max)() - 10) / 10) - return false; - v = 10 * v + d; - } - return it == last; - } - - template<class Iter, class Unsigned> - static - bool - parse_hex(Iter& it, Unsigned& v) - { - unsigned char d; - if(! unhex(d, *it)) - return false; - v = d; - for(;;) - { - if(! unhex(d, *++it)) - break; - auto const v0 = v; - v = 16 * v + d; - if(v < v0) - return false; - } - return true; - } - - static - bool - parse_crlf(char const*& it) - { - if( it[0] != '\r' || it[1] != '\n') - return false; - it += 2; - return true; - } - - static - void - parse_method( - char const*& it, char const* last, - string_view& result, error_code& ec) - { - // parse token SP - auto const first = it; - for(;; ++it) - { - if(it + 1 > last) - { - ec = error::need_more; - return; - } - if(! detail::is_token_char(*it)) - break; - } - if(it + 1 > last) - { - ec = error::need_more; - return; - } - if(*it != ' ') - { - ec = error::bad_method; - return; - } - if(it == first) - { - // cannot be empty - ec = error::bad_method; - return; - } - result = make_string(first, it++); - } - - static - void - parse_target( - char const*& it, char const* last, - string_view& result, error_code& ec) - { - // parse target SP - auto const first = it; - for(;; ++it) - { - if(it + 1 > last) - { - ec = error::need_more; - return; - } - if(! is_pathchar(*it)) - break; - } - if(it + 1 > last) - { - ec = error::need_more; - return; - } - if(*it != ' ') - { - ec = error::bad_target; - return; - } - if(it == first) - { - // cannot be empty - ec = error::bad_target; - return; - } - result = make_string(first, it++); - } - - static - void - parse_version( - char const*& it, char const* last, - int& result, error_code& ec) - { - if(it + 8 > last) - { - ec = error::need_more; - return; - } - if(*it++ != 'H') - { - ec = error::bad_version; - return; - } - if(*it++ != 'T') - { - ec = error::bad_version; - return; - } - if(*it++ != 'T') - { - ec = error::bad_version; - return; - } - if(*it++ != 'P') - { - ec = error::bad_version; - return; - } - if(*it++ != '/') - { - ec = error::bad_version; - return; - } - if(! is_digit(*it)) - { - ec = error::bad_version; - return; - } - result = 10 * (*it++ - '0'); - if(*it++ != '.') - { - ec = error::bad_version; - return; - } - if(! is_digit(*it)) - { - ec = error::bad_version; - return; - } - result += *it++ - '0'; - } - - static - void - parse_status( - char const*& it, char const* last, - unsigned short& result, error_code& ec) - { - // parse 3(digit) SP - if(it + 4 > last) - { - ec = error::need_more; - return; - } - if(! is_digit(*it)) - { - ec = error::bad_status; - return; - } - result = 100 * (*it++ - '0'); - if(! is_digit(*it)) - { - ec = error::bad_status; - return; - } - result += 10 * (*it++ - '0'); - if(! is_digit(*it)) - { - ec = error::bad_status; - return; - } - result += *it++ - '0'; - if(*it++ != ' ') - { - ec = error::bad_status; - return; - } - } - - void - parse_reason( - char const*& it, char const* last, - string_view& result, error_code& ec) - { - auto const first = it; - char const* token_last = nullptr; - auto p = parse_token_to_eol( - it, last, token_last, ec); - if(ec) - return; - if(! p) - { - ec = error::bad_reason; - return; - } - result = make_string(first, token_last); - it = p; - } - - template<std::size_t N> - void - parse_field( - char const*& p, - char const* last, - string_view& name, - string_view& value, - static_string<N>& buf, - error_code& ec) - { - /* header-field = field-name ":" OWS field-value OWS - - field-name = token - field-value = *( field-content / obs-fold ) - field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] - field-vchar = VCHAR / obs-text - - obs-fold = CRLF 1*( SP / HTAB ) - ; obsolete line folding - ; see Section 3.2.4 - - token = 1*<any CHAR except CTLs or separators> - CHAR = <any US-ASCII character (octets 0 - 127)> - sep = "(" | ")" | "<" | ">" | "@" - | "," | ";" | ":" | "\" | <"> - | "/" | "[" | "]" | "?" | "=" - | "{" | "}" | SP | HT - */ - static char const* is_token = - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\1\0\1\1\1\1\1\0\0\1\1\0\1\1\0\1\1\1\1\1\1\1\1\1\1\0\0\0\0\0\0" - "\0\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\0\0\1\1" - "\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\1\0\1\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - - // name - BOOST_ALIGNMENT(16) static const char ranges1[] = - "\x00 " /* control chars and up to SP */ - "\"\"" /* 0x22 */ - "()" /* 0x28,0x29 */ - ",," /* 0x2c */ - "//" /* 0x2f */ - ":@" /* 0x3a-0x40 */ - "[]" /* 0x5b-0x5d */ - "{\377"; /* 0x7b-0xff */ - auto first = p; - bool found; - std::tie(p, found) = find_fast( - p, last, ranges1, sizeof(ranges1)-1); - if(! found && p >= last) - { - ec = error::need_more; - return; - } - for(;;) - { - if(*p == ':') - break; - if(! is_token[static_cast< - unsigned char>(*p)]) - { - ec = error::bad_field; - return; - } - ++p; - if(p >= last) - { - ec = error::need_more; - return; - } - } - if(p == first) - { - // empty name - ec = error::bad_field; - return; - } - name = make_string(first, p); - ++p; // eat ':' - char const* token_last = nullptr; - for(;;) - { - // eat leading ' ' and '\t' - for(;;++p) - { - if(p + 1 > last) - { - ec = error::need_more; - return; - } - if(! (*p == ' ' || *p == '\t')) - break; - } - // parse to CRLF - first = p; - p = parse_token_to_eol(p, last, token_last, ec); - if(ec) - return; - if(! p) - { - ec = error::bad_value; - return; - } - // Look 1 char past the CRLF to handle obs-fold. - if(p + 1 > last) - { - ec = error::need_more; - return; - } - token_last = - trim_back(token_last, first); - if(*p != ' ' && *p != '\t') - { - value = make_string(first, token_last); - return; - } - ++p; - if(token_last != first) - break; - } - buf.resize(0); - buf.append(first, token_last); - BOOST_ASSERT(! buf.empty()); - try - { - for(;;) - { - // eat leading ' ' and '\t' - for(;;++p) - { - if(p + 1 > last) - { - ec = error::need_more; - return; - } - if(! (*p == ' ' || *p == '\t')) - break; - } - // parse to CRLF - first = p; - p = parse_token_to_eol(p, last, token_last, ec); - if(ec) - return; - if(! p) - { - ec = error::bad_value; - return; - } - // Look 1 char past the CRLF to handle obs-fold. - if(p + 1 > last) - { - ec = error::need_more; - return; - } - token_last = trim_back(token_last, first); - if(first != token_last) - { - buf.push_back(' '); - buf.append(first, token_last); - } - if(*p != ' ' && *p != '\t') - { - value = {buf.data(), buf.size()}; - return; - } - ++p; - } - } - catch(std::length_error const&) - { - ec = error::header_limit; - return; - } - } - - void - parse_chunk_extensions( - char const*& it, - char const* last, - error_code& ec) - { - /* - chunk-ext = *( BWS ";" BWS chunk-ext-name [ BWS "=" BWS chunk-ext-val ] ) - BWS = *( SP / HTAB ) ; "Bad White Space" - chunk-ext-name = token - chunk-ext-val = token / quoted-string - token = 1*tchar - quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE - qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' / %x5D-7E ; ']'-'~' / obs-text - quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - obs-text = %x80-FF - - https://www.rfc-editor.org/errata_search.php?rfc=7230&eid=4667 - */ - loop: - if(it == last) - { - ec = error::need_more; - return; - } - if(*it != ' ' && *it != '\t' && *it != ';') - return; - // BWS - if(*it == ' ' || *it == '\t') - { - for(;;) - { - ++it; - if(it == last) - { - ec = error::need_more; - return; - } - if(*it != ' ' && *it != '\t') - break; - } - } - // ';' - if(*it != ';') - { - ec = error::bad_chunk_extension; - return; - } - semi: - ++it; // skip ';' - // BWS - for(;;) - { - if(it == last) - { - ec = error::need_more; - return; - } - if(*it != ' ' && *it != '\t') - break; - ++it; - } - // chunk-ext-name - if(! detail::is_token_char(*it)) - { - ec = error::bad_chunk_extension; - return; - } - for(;;) - { - ++it; - if(it == last) - { - ec = error::need_more; - return; - } - if(! detail::is_token_char(*it)) - break; - } - // BWS [ ";" / "=" ] - { - bool bws; - if(*it == ' ' || *it == '\t') - { - for(;;) - { - ++it; - if(it == last) - { - ec = error::need_more; - return; - } - if(*it != ' ' && *it != '\t') - break; - } - bws = true; - } - else - { - bws = false; - } - if(*it == ';') - goto semi; - if(*it != '=') - { - if(bws) - ec = error::bad_chunk_extension; - return; - } - ++it; // skip '=' - } - // BWS - for(;;) - { - if(it == last) - { - ec = error::need_more; - return; - } - if(*it != ' ' && *it != '\t') - break; - ++it; - } - // chunk-ext-val - if(*it != '"') - { - // token - if(! detail::is_token_char(*it)) - { - ec = error::bad_chunk_extension; - return; - } - for(;;) - { - ++it; - if(it == last) - { - ec = error::need_more; - return; - } - if(! detail::is_token_char(*it)) - break; - } - } - else - { - // quoted-string - for(;;) - { - ++it; - if(it == last) - { - ec = error::need_more; - return; - } - if(*it == '"') - break; - if(*it == '\\') - { - ++it; - if(it == last) - { - ec = error::need_more; - return; - } - } - } - ++it; - } - goto loop; - } -}; - -} // detail -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/detail/chunk_encode.hpp b/contrib/restricted/boost/boost/beast/http/detail/chunk_encode.hpp deleted file mode 100644 index cad48418d9..0000000000 --- a/contrib/restricted/boost/boost/beast/http/detail/chunk_encode.hpp +++ /dev/null @@ -1,247 +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_HTTP_DETAIL_CHUNK_ENCODE_HPP -#define BOOST_BEAST_HTTP_DETAIL_CHUNK_ENCODE_HPP - -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/http/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <algorithm> -#include <array> -#include <cstddef> -#include <memory> - -namespace boost { -namespace beast { -namespace http { -namespace detail { - -struct chunk_extensions -{ - virtual ~chunk_extensions() = default; - virtual boost::asio::const_buffer str() = 0; -}; - -template<class ChunkExtensions> -struct chunk_extensions_impl : chunk_extensions -{ - ChunkExtensions ext_; - - chunk_extensions_impl(ChunkExtensions&& ext) - : ext_(std::move(ext)) - { - } - - chunk_extensions_impl(ChunkExtensions const& ext) - : ext_(ext) - { - } - - boost::asio::const_buffer - str() override - { - auto const s = ext_.str(); - return {s.data(), s.size()}; - } -}; - -template<class T, class = void> -struct is_chunk_extensions : std::false_type {}; - -template<class T> -struct is_chunk_extensions<T, beast::detail::void_t<decltype( - std::declval<string_view&>() = std::declval<T&>().str(), - (void)0)>> : std::true_type -{ -}; - -//------------------------------------------------------------------------------ - -/** A buffer sequence containing a chunk-encoding header -*/ -class chunk_size -{ - template<class OutIter> - static - OutIter - to_hex(OutIter last, std::size_t n) - { - if(n == 0) - { - *--last = '0'; - return last; - } - while(n) - { - *--last = "0123456789abcdef"[n&0xf]; - n>>=4; - } - return last; - } - - struct sequence - { - boost::asio::const_buffer b; - char data[1 + 2 * sizeof(std::size_t)]; - - explicit - sequence(std::size_t n) - { - char* it0 = data + sizeof(data); - auto it = to_hex(it0, n); - b = {it, - static_cast<std::size_t>(it0 - it)}; - } - }; - - std::shared_ptr<sequence> sp_; - -public: - using value_type = boost::asio::const_buffer; - - using const_iterator = value_type const*; - - chunk_size(chunk_size const& other) = default; - - /** Construct a chunk header - - @param n The number of octets in this chunk. - */ - chunk_size(std::size_t n) - : sp_(std::make_shared<sequence>(n)) - { - } - - const_iterator - begin() const - { - return &sp_->b; - } - - const_iterator - end() const - { - return begin() + 1; - } -}; - -//------------------------------------------------------------------------------ - -/// Returns a buffer sequence holding a CRLF for chunk encoding -inline -boost::asio::const_buffer -chunk_crlf() -{ - return {"\r\n", 2}; -} - -/// Returns a buffer sequence holding a final chunk header -inline -boost::asio::const_buffer -chunk_last() -{ - return {"0\r\n", 3}; -} - -//------------------------------------------------------------------------------ - -template<class = void> -struct chunk_crlf_iter_type -{ - class value_type - { - char const s[2] = {'\r', '\n'}; - - public: - value_type() = default; - - operator - boost::asio::const_buffer() const - { - return {s, sizeof(s)}; - } - }; - static value_type value; -}; - -template<class T> -typename chunk_crlf_iter_type<T>::value_type -chunk_crlf_iter_type<T>::value; - -using chunk_crlf_iter = chunk_crlf_iter_type<void>; - -//------------------------------------------------------------------------------ - -template<class = void> -struct chunk_size0_iter_type -{ - class value_type - { - char const s[3] = {'0', '\r', '\n'}; - - public: - value_type() = default; - - operator - boost::asio::const_buffer() const - { - return {s, sizeof(s)}; - } - }; - static value_type value; -}; - -template<class T> -typename chunk_size0_iter_type<T>::value_type -chunk_size0_iter_type<T>::value; - -using chunk_size0_iter = chunk_size0_iter_type<void>; - -struct chunk_size0 -{ - using value_type = chunk_size0_iter::value_type; - - using const_iterator = value_type const*; - - const_iterator - begin() const - { - return &chunk_size0_iter::value; - } - - const_iterator - end() const - { - return begin() + 1; - } -}; - -//------------------------------------------------------------------------------ - -template<class T, - bool = is_fields<T>::value> -struct buffers_or_fields -{ - using type = typename - T::writer::const_buffers_type; -}; - -template<class T> -struct buffers_or_fields<T, false> -{ - using type = T; -}; - -} // detail -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/detail/rfc7230.hpp b/contrib/restricted/boost/boost/beast/http/detail/rfc7230.hpp deleted file mode 100644 index fac6790579..0000000000 --- a/contrib/restricted/boost/boost/beast/http/detail/rfc7230.hpp +++ /dev/null @@ -1,473 +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_HTTP_DETAIL_RFC7230_HPP -#define BOOST_BEAST_HTTP_DETAIL_RFC7230_HPP - -#include <boost/beast/core/string.hpp> -#include <iterator> -#include <utility> - -namespace boost { -namespace beast { -namespace http { -namespace detail { - -inline -bool -is_digit(char c) -{ - return c >= '0' && c <= '9'; -} - -inline -char -is_alpha(char c) -{ - static char constexpr tab[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 48 - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, // 80 - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, // 112 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240 - }; - BOOST_STATIC_ASSERT(sizeof(tab) == 256); - return tab[static_cast<unsigned char>(c)]; -} - -inline -char -is_text(char c) -{ - // TEXT = <any OCTET except CTLs, but including LWS> - static char constexpr tab[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240 - }; - BOOST_STATIC_ASSERT(sizeof(tab) == 256); - return tab[static_cast<unsigned char>(c)]; -} - -inline -char -is_token_char(char c) -{ - /* - tchar = "!" | "#" | "$" | "%" | "&" | - "'" | "*" | "+" | "-" | "." | - "^" | "_" | "`" | "|" | "~" | - DIGIT | ALPHA - */ - static char constexpr tab[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, // 112 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240 - }; - BOOST_STATIC_ASSERT(sizeof(tab) == 256); - return tab[static_cast<unsigned char>(c)]; -} - -inline -char -is_qdchar(char c) -{ - /* - qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' / %x5D-7E ; ']'-'~' / obs-text - */ - static char constexpr tab[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 80 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240 - }; - BOOST_STATIC_ASSERT(sizeof(tab) == 256); - return tab[static_cast<unsigned char>(c)]; -} - -inline -char -is_qpchar(char c) -{ - /* - quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - obs-text = %x80-FF - */ - static char constexpr tab[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240 - }; - BOOST_STATIC_ASSERT(sizeof(tab) == 256); - return tab[static_cast<unsigned char>(c)]; -} - -// converts to lower case, -// returns 0 if not a valid text char -// -inline -char -to_value_char(char c) -{ - // TEXT = <any OCTET except CTLs, but including LWS> - static unsigned char constexpr tab[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, // 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // 32 - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // 48 - 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, // 64 - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, 93, 94, 95, // 80 - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, // 96 - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 0, // 112 - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, // 128 - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, // 144 - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, // 160 - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, // 176 - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, // 192 - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, // 208 - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, // 224 - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 // 240 - }; - BOOST_STATIC_ASSERT(sizeof(tab) == 256); - return static_cast<char>(tab[static_cast<unsigned char>(c)]); -} - -// VFALCO TODO Make this return unsigned? -inline -std::int8_t -unhex(char c) -{ - static signed char constexpr tab[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 32 - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, // 48 - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 64 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 80 - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 96 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 112 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 144 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 160 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 176 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 192 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 208 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 224 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // 240 - }; - BOOST_STATIC_ASSERT(sizeof(tab) == 256); - return tab[static_cast<unsigned char>(c)]; -} - -template<class FwdIt> -inline -void -skip_ows(FwdIt& it, FwdIt const& end) -{ - while(it != end) - { - if(*it != ' ' && *it != '\t') - break; - ++it; - } -} - -template<class RanIt> -inline -void -skip_ows_rev( - RanIt& it, RanIt const& first) -{ - while(it != first) - { - auto const c = it[-1]; - if(c != ' ' && c != '\t') - break; - --it; - } -} - -// obs-fold = CRLF 1*( SP / HTAB ) -// return `false` on parse error -// -template<class FwdIt> -inline -bool -skip_obs_fold( - FwdIt& it, FwdIt const& last) -{ - for(;;) - { - if(*it != '\r') - return true; - if(++it == last) - return false; - if(*it != '\n') - return false; - if(++it == last) - return false; - if(*it != ' ' && *it != '\t') - return false; - for(;;) - { - if(++it == last) - return true; - if(*it != ' ' && *it != '\t') - return true; - } - } -} - -template<class FwdIt> -void -skip_token(FwdIt& it, FwdIt const& last) -{ - while(it != last && is_token_char(*it)) - ++it; -} - -inline -string_view -trim(string_view s) -{ - auto first = s.begin(); - auto last = s.end(); - skip_ows(first, last); - while(first != last) - { - auto const c = *std::prev(last); - if(c != ' ' && c != '\t') - break; - --last; - } - if(first == last) - return {}; - return {&*first, - static_cast<std::size_t>(last - first)}; -} - -struct param_iter -{ - using iter_type = string_view::const_iterator; - - iter_type it; - iter_type first; - iter_type last; - std::pair<string_view, string_view> v; - - bool - empty() const - { - return first == it; - } - - template<class = void> - void - increment(); -}; - -template<class> -void -param_iter:: -increment() -{ -/* - param-list = *( OWS ";" OWS param ) - param = token OWS [ "=" OWS ( token / quoted-string ) ] - quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE - qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' / %x5D-7E ; ']'-'~' / obs-text - quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - obs-text = %x80-FF -*/ - auto const err = - [&] - { - it = first; - }; - v.first = {}; - v.second = {}; - detail::skip_ows(it, last); - first = it; - if(it == last) - return err(); - if(*it != ';') - return err(); - ++it; - detail::skip_ows(it, last); - if(it == last) - return err(); - // param - if(! detail::is_token_char(*it)) - return err(); - auto const p0 = it; - skip_token(++it, last); - auto const p1 = it; - v.first = { &*p0, static_cast<std::size_t>(p1 - p0) }; - detail::skip_ows(it, last); - if(it == last) - return; - if(*it == ';') - return; - if(*it != '=') - return err(); - ++it; - detail::skip_ows(it, last); - if(it == last) - return; - if(*it == '"') - { - // quoted-string - auto const p2 = it; - ++it; - for(;;) - { - if(it == last) - return err(); - auto c = *it++; - if(c == '"') - break; - if(detail::is_qdchar(c)) - continue; - if(c != '\\') - return err(); - if(it == last) - return err(); - c = *it++; - if(! detail::is_qpchar(c)) - return err(); - } - v.second = { &*p2, static_cast<std::size_t>(it - p2) }; - } - else - { - // token - if(! detail::is_token_char(*it)) - return err(); - auto const p2 = it; - skip_token(++it, last); - v.second = { &*p2, static_cast<std::size_t>(it - p2) }; - } -} - -/* - #token = [ ( "," / token ) *( OWS "," [ OWS token ] ) ] -*/ -struct opt_token_list_policy -{ - using value_type = string_view; - - bool - operator()(value_type& v, - char const*& it, string_view s) const - { - v = {}; - auto need_comma = it != s.begin(); - for(;;) - { - detail::skip_ows(it, s.end()); - if(it == s.end()) - { - it = nullptr; - return true; - } - auto const c = *it; - if(detail::is_token_char(c)) - { - if(need_comma) - return false; - auto const p0 = it; - for(;;) - { - ++it; - if(it == s.end()) - break; - if(! detail::is_token_char(*it)) - break; - } - v = string_view{&*p0, - static_cast<std::size_t>(it - p0)}; - return true; - } - if(c != ',') - return false; - need_comma = false; - ++it; - } - } -}; - -} // detail -} // http -} // beast -} // boost - -#endif - diff --git a/contrib/restricted/boost/boost/beast/http/detail/type_traits.hpp b/contrib/restricted/boost/boost/beast/http/detail/type_traits.hpp deleted file mode 100644 index 1d0c991826..0000000000 --- a/contrib/restricted/boost/boost/beast/http/detail/type_traits.hpp +++ /dev/null @@ -1,218 +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_HTTP_DETAIL_TYPE_TRAITS_HPP -#define BOOST_BEAST_HTTP_DETAIL_TYPE_TRAITS_HPP - -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/optional.hpp> -#include <cstdint> - -namespace boost { -namespace beast { -namespace http { - -template<bool isRequest, class Fields> -struct header; - -template<bool, class, class> -struct message; - -template<bool isRequest,class Body, class Fields> -class parser; - -namespace detail { - -template<class T> -class is_header_impl -{ - template<bool b, class F> - static std::true_type check( - header<b, F> const*); - static std::false_type check(...); -public: - using type = decltype(check((T*)0)); -}; - -template<class T> -using is_header = typename is_header_impl<T>::type; - -template<class T> -struct is_parser : std::false_type {}; - -template<bool isRequest, class Body, class Fields> -struct is_parser<parser<isRequest, Body, Fields>> : std::true_type {}; - -struct fields_model -{ - struct writer; - - string_view method() const; - string_view reason() const; - string_view target() const; - -protected: - string_view get_method_impl() const; - string_view get_target_impl() const; - string_view get_reason_impl() const; - bool get_chunked_impl() const; - bool get_keep_alive_impl(unsigned) const; - bool has_content_length_impl() const; - void set_method_impl(string_view); - void set_target_impl(string_view); - void set_reason_impl(string_view); - void set_chunked_impl(bool); - void set_content_length_impl(boost::optional<std::uint64_t>); - void set_keep_alive_impl(unsigned, bool); -}; - -template<class T, class = beast::detail::void_t<>> -struct has_value_type : std::false_type {}; - -template<class T> -struct has_value_type<T, beast::detail::void_t< - typename T::value_type - > > : std::true_type {}; - -/** Determine if a @b Body type has a size - - This metafunction is equivalent to `std::true_type` if - Body contains a static member function called `size`. -*/ -template<class T, class = void> -struct is_body_sized : std::false_type {}; - -template<class T> -struct is_body_sized<T, beast::detail::void_t< - typename T::value_type, - decltype( - std::declval<std::uint64_t&>() = - T::size(std::declval<typename T::value_type const&>()), - (void)0)>> : std::true_type {}; - -template<class T> -struct is_fields_helper : T -{ - template<class U = is_fields_helper> - static auto f1(int) -> decltype( - std::declval<string_view&>() = std::declval<U const&>().get_method_impl(), - std::true_type()); - static auto f1(...) -> std::false_type; - using t1 = decltype(f1(0)); - - template<class U = is_fields_helper> - static auto f2(int) -> decltype( - std::declval<string_view&>() = std::declval<U const&>().get_target_impl(), - std::true_type()); - static auto f2(...) -> std::false_type; - using t2 = decltype(f2(0)); - - template<class U = is_fields_helper> - static auto f3(int) -> decltype( - std::declval<string_view&>() = std::declval<U const&>().get_reason_impl(), - std::true_type()); - static auto f3(...) -> std::false_type; - using t3 = decltype(f3(0)); - - template<class U = is_fields_helper> - static auto f4(int) -> decltype( - std::declval<bool&>() = std::declval<U const&>().get_chunked_impl(), - std::true_type()); - static auto f4(...) -> std::false_type; - using t4 = decltype(f4(0)); - - template<class U = is_fields_helper> - static auto f5(int) -> decltype( - std::declval<bool&>() = std::declval<U const&>().get_keep_alive_impl( - std::declval<unsigned>()), - std::true_type()); - static auto f5(...) -> std::false_type; - using t5 = decltype(f5(0)); - - template<class U = is_fields_helper> - static auto f6(int) -> decltype( - std::declval<bool&>() = std::declval<U const&>().has_content_length_impl(), - std::true_type()); - static auto f6(...) -> std::false_type; - using t6 = decltype(f6(0)); - - template<class U = is_fields_helper> - static auto f7(int) -> decltype( - void(std::declval<U&>().set_method_impl(std::declval<string_view>())), - std::true_type()); - static auto f7(...) -> std::false_type; - using t7 = decltype(f7(0)); - - template<class U = is_fields_helper> - static auto f8(int) -> decltype( - void(std::declval<U&>().set_target_impl(std::declval<string_view>())), - std::true_type()); - static auto f8(...) -> std::false_type; - using t8 = decltype(f8(0)); - - template<class U = is_fields_helper> - static auto f9(int) -> decltype( - void(std::declval<U&>().set_reason_impl(std::declval<string_view>())), - std::true_type()); - static auto f9(...) -> std::false_type; - using t9 = decltype(f9(0)); - - template<class U = is_fields_helper> - static auto f10(int) -> decltype( - void(std::declval<U&>().set_chunked_impl(std::declval<bool>())), - std::true_type()); - static auto f10(...) -> std::false_type; - using t10 = decltype(f10(0)); - - template<class U = is_fields_helper> - static auto f11(int) -> decltype( - void(std::declval<U&>().set_content_length_impl( - std::declval<boost::optional<std::uint64_t>>())), - std::true_type()); - static auto f11(...) -> std::false_type; - using t11 = decltype(f11(0)); - - template<class U = is_fields_helper> - static auto f12(int) -> decltype( - void(std::declval<U&>().set_keep_alive_impl( - std::declval<unsigned>(), - std::declval<bool>())), - std::true_type()); - static auto f12(...) -> std::false_type; - using t12 = decltype(f12(0)); - - using type = std::integral_constant<bool, - t1::value && t2::value && t3::value && - t4::value && t5::value && t6::value && - t7::value && t8::value && t9::value && - t10::value && t11::value && t12::value>; -}; - -template<class T> -using has_deprecated_body_writer = - std::integral_constant<bool, - std::is_constructible<typename T::writer, - message<true, T, detail::fields_model>&>::value && - std::is_constructible<typename T::writer, - message<false, T, detail::fields_model>&>::value>; - -template<class T> -using has_deprecated_body_reader = - std::integral_constant<bool, - std::is_constructible<typename T::reader, - message<true, T, detail::fields_model>&>::value && - std::is_constructible<typename T::reader, - message<false, T, detail::fields_model>&>::value>; - -} // detail -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/dynamic_body.hpp b/contrib/restricted/boost/boost/beast/http/dynamic_body.hpp deleted file mode 100644 index 9c3df8a1d2..0000000000 --- a/contrib/restricted/boost/boost/beast/http/dynamic_body.hpp +++ /dev/null @@ -1,30 +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_HTTP_DYNAMIC_BODY_HPP -#define BOOST_BEAST_HTTP_DYNAMIC_BODY_HPP - -#include <boost/beast/core/multi_buffer.hpp> -#include <boost/beast/http/basic_dynamic_body.hpp> - -namespace boost { -namespace beast { -namespace http { - -/** A dynamic message body represented by a @ref multi_buffer - - Meets the requirements of @b Body. -*/ -using dynamic_body = basic_dynamic_body<multi_buffer>; - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/empty_body.hpp b/contrib/restricted/boost/boost/beast/http/empty_body.hpp deleted file mode 100644 index d56c14b4ef..0000000000 --- a/contrib/restricted/boost/boost/beast/http/empty_body.hpp +++ /dev/null @@ -1,131 +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_HTTP_EMPTY_BODY_HPP -#define BOOST_BEAST_HTTP_EMPTY_BODY_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/optional.hpp> - -namespace boost { -namespace beast { -namespace http { - -/** An empty @b Body - - This body is used to represent messages which do not have a - message body. If this body is used with a parser, and the - parser encounters octets corresponding to a message body, - the parser will fail with the error @ref http::unexpected_body. - - The Content-Length of this body is always 0. -*/ -struct empty_body -{ - /** The type of container used for the body - - This determines the type of @ref message::body - when this body type is used with a message container. - */ - struct value_type - { - }; - - /** Returns the payload size of the body - - When this body is used with @ref message::prepare_payload, - the Content-Length will be set to the payload size, and - any chunked Transfer-Encoding will be removed. - */ - static - std::uint64_t - size(value_type) - { - return 0; - } - - /** The algorithm for parsing the body - - Meets the requirements of @b BodyReader. - */ -#if BOOST_BEAST_DOXYGEN - using reader = implementation_defined; -#else - struct reader - { - template<bool isRequest, class Fields> - explicit - reader(header<isRequest, Fields>&, value_type&) - { - } - - void - init(boost::optional<std::uint64_t> const&, error_code& ec) - { - ec.assign(0, ec.category()); - } - - template<class ConstBufferSequence> - std::size_t - put(ConstBufferSequence const&, - error_code& ec) - { - ec = error::unexpected_body; - return 0; - } - - void - finish(error_code& ec) - { - ec.assign(0, ec.category()); - } - }; -#endif - - /** The algorithm for serializing the body - - Meets the requirements of @b BodyWriter. - */ -#if BOOST_BEAST_DOXYGEN - using writer = implementation_defined; -#else - struct writer - { - using const_buffers_type = - boost::asio::const_buffer; - - template<bool isRequest, class Fields> - explicit - writer(header<isRequest, Fields> const&, value_type const&) - { - } - - void - init(error_code& ec) - { - ec.assign(0, ec.category()); - } - - boost::optional<std::pair<const_buffers_type, bool>> - get(error_code& ec) - { - ec.assign(0, ec.category()); - return boost::none; - } - }; -#endif -}; - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/error.hpp b/contrib/restricted/boost/boost/beast/http/error.hpp deleted file mode 100644 index b3d9fb1188..0000000000 --- a/contrib/restricted/boost/boost/beast/http/error.hpp +++ /dev/null @@ -1,156 +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_HTTP_ERROR_HPP -#define BOOST_BEAST_HTTP_ERROR_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> - -namespace boost { -namespace beast { -namespace http { - -/// Error codes returned from HTTP algorithms and operations. -enum class error -{ - /** The end of the stream was reached. - - This error is returned when attempting to read HTTP data, - and the stream returns the error `boost::asio::error::eof` - before any octets corresponding to a new HTTP message have - been received. - */ - end_of_stream = 1, - - /** The incoming message is incomplete. - - This happens when the end of stream is reached during - parsing and some octets have been received, but not the - entire message. - */ - partial_message, - - /** Additional buffers are required. - - This error is returned during parsing when additional - octets are needed. The caller should append more data - to the existing buffer and retry the parse operaetion. - */ - need_more, - - /** An unexpected body was encountered during parsing. - - This error is returned when attempting to parse body - octets into a message container which has the - @ref empty_body body type. - - @see @ref empty_body - */ - unexpected_body, - - /** Additional buffers are required. - - This error is returned under the following conditions: - - @li During serialization when using @ref buffer_body. - The caller should update the body to point to a new - buffer or indicate that there are no more octets in - the body. - - @li During parsing when using @ref buffer_body. - The caller should update the body to point to a new - storage area to receive additional body octets. - */ - need_buffer, - - /** The end of a chunk was reached - */ - end_of_chunk, - - /** Buffer maximum exceeded. - - This error is returned when reading HTTP content - into a dynamic buffer, and the operation would - exceed the maximum size of the buffer. - */ - buffer_overflow, - - /** Header limit exceeded. - - The parser detected an incoming message header which - exceeded a configured limit. - */ - header_limit, - - /** Body limit exceeded. - - The parser detected an incoming message body which - exceeded a configured limit. - */ - body_limit, - - /** A memory allocation failed. - - When basic_fields throws std::bad_alloc, it is - converted into this error by @ref parser. - */ - bad_alloc, - - // - // (parser errors) - // - - /// The line ending was malformed - bad_line_ending, - - /// The method is invalid. - bad_method, - - /// The request-target is invalid. - bad_target, - - /// The HTTP-version is invalid. - bad_version, - - /// The status-code is invalid. - bad_status, - - /// The reason-phrase is invalid. - bad_reason, - - /// The field name is invalid. - bad_field, - - /// The field value is invalid. - bad_value, - - /// The Content-Length is invalid. - bad_content_length, - - /// The Transfer-Encoding is invalid. - bad_transfer_encoding, - - /// The chunk syntax is invalid. - bad_chunk, - - /// The chunk extension is invalid. - bad_chunk_extension, - - /// An obs-fold exceeded an internal limit. - bad_obs_fold -}; - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/error.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/field.hpp b/contrib/restricted/boost/boost/beast/http/field.hpp deleted file mode 100644 index 09d9dfffdf..0000000000 --- a/contrib/restricted/boost/boost/beast/http/field.hpp +++ /dev/null @@ -1,410 +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_HTTP_FIELD_HPP -#define BOOST_BEAST_HTTP_FIELD_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/string.hpp> -#include <iosfwd> - -namespace boost { -namespace beast { -namespace http { - -enum class field : unsigned short -{ - unknown = 0, - - a_im, - accept, - accept_additions, - accept_charset, - accept_datetime, - accept_encoding, - accept_features, - accept_language, - accept_patch, - accept_post, - accept_ranges, - access_control, - access_control_allow_credentials, - access_control_allow_headers, - access_control_allow_methods, - access_control_allow_origin, - access_control_expose_headers, - access_control_max_age, - access_control_request_headers, - access_control_request_method, - age, - allow, - alpn, - also_control, - alt_svc, - alt_used, - alternate_recipient, - alternates, - apparently_to, - apply_to_redirect_ref, - approved, - archive, - archived_at, - article_names, - article_updates, - authentication_control, - authentication_info, - authentication_results, - authorization, - auto_submitted, - autoforwarded, - autosubmitted, - base, - bcc, - body, - c_ext, - c_man, - c_opt, - c_pep, - c_pep_info, - cache_control, - caldav_timezones, - cancel_key, - cancel_lock, - cc, - close, - comments, - compliance, - connection, - content_alternative, - content_base, - content_description, - content_disposition, - content_duration, - content_encoding, - content_features, - content_id, - content_identifier, - content_language, - content_length, - content_location, - content_md5, - content_range, - content_return, - content_script_type, - content_style_type, - content_transfer_encoding, - content_type, - content_version, - control, - conversion, - conversion_with_loss, - cookie, - cookie2, - cost, - dasl, - date, - date_received, - dav, - default_style, - deferred_delivery, - delivery_date, - delta_base, - depth, - derived_from, - destination, - differential_id, - digest, - discarded_x400_ipms_extensions, - discarded_x400_mts_extensions, - disclose_recipients, - disposition_notification_options, - disposition_notification_to, - distribution, - dkim_signature, - dl_expansion_history, - downgraded_bcc, - downgraded_cc, - downgraded_disposition_notification_to, - downgraded_final_recipient, - downgraded_from, - downgraded_in_reply_to, - downgraded_mail_from, - downgraded_message_id, - downgraded_original_recipient, - downgraded_rcpt_to, - downgraded_references, - downgraded_reply_to, - downgraded_resent_bcc, - downgraded_resent_cc, - downgraded_resent_from, - downgraded_resent_reply_to, - downgraded_resent_sender, - downgraded_resent_to, - downgraded_return_path, - downgraded_sender, - downgraded_to, - ediint_features, - eesst_version, - encoding, - encrypted, - errors_to, - etag, - expect, - expires, - expiry_date, - ext, - followup_to, - forwarded, - from, - generate_delivery_report, - getprofile, - hobareg, - host, - http2_settings, - if_, - if_match, - if_modified_since, - if_none_match, - if_range, - if_schedule_tag_match, - if_unmodified_since, - im, - importance, - in_reply_to, - incomplete_copy, - injection_date, - injection_info, - jabber_id, - keep_alive, - keywords, - label, - language, - last_modified, - latest_delivery_time, - lines, - link, - list_archive, - list_help, - list_id, - list_owner, - list_post, - list_subscribe, - list_unsubscribe, - list_unsubscribe_post, - location, - lock_token, - man, - max_forwards, - memento_datetime, - message_context, - message_id, - message_type, - meter, - method_check, - method_check_expires, - mime_version, - mmhs_acp127_message_identifier, - mmhs_authorizing_users, - mmhs_codress_message_indicator, - mmhs_copy_precedence, - mmhs_exempted_address, - mmhs_extended_authorisation_info, - mmhs_handling_instructions, - mmhs_message_instructions, - mmhs_message_type, - mmhs_originator_plad, - mmhs_originator_reference, - mmhs_other_recipients_indicator_cc, - mmhs_other_recipients_indicator_to, - mmhs_primary_precedence, - mmhs_subject_indicator_codes, - mt_priority, - negotiate, - newsgroups, - nntp_posting_date, - nntp_posting_host, - non_compliance, - obsoletes, - opt, - optional, - optional_www_authenticate, - ordering_type, - organization, - origin, - original_encoded_information_types, - original_from, - original_message_id, - original_recipient, - original_sender, - original_subject, - originator_return_address, - overwrite, - p3p, - path, - pep, - pep_info, - pics_label, - position, - posting_version, - pragma, - prefer, - preference_applied, - prevent_nondelivery_report, - priority, - privicon, - profileobject, - protocol, - protocol_info, - protocol_query, - protocol_request, - proxy_authenticate, - proxy_authentication_info, - proxy_authorization, - proxy_connection, - proxy_features, - proxy_instruction, - public_, - public_key_pins, - public_key_pins_report_only, - range, - received, - received_spf, - redirect_ref, - references, - referer, - referer_root, - relay_version, - reply_by, - reply_to, - require_recipient_valid_since, - resent_bcc, - resent_cc, - resent_date, - resent_from, - resent_message_id, - resent_reply_to, - resent_sender, - resent_to, - resolution_hint, - resolver_location, - retry_after, - return_path, - safe, - schedule_reply, - schedule_tag, - sec_websocket_accept, - sec_websocket_extensions, - sec_websocket_key, - sec_websocket_protocol, - sec_websocket_version, - security_scheme, - see_also, - sender, - sensitivity, - server, - set_cookie, - set_cookie2, - setprofile, - sio_label, - sio_label_history, - slug, - soapaction, - solicitation, - status_uri, - strict_transport_security, - subject, - subok, - subst, - summary, - supersedes, - surrogate_capability, - surrogate_control, - tcn, - te, - timeout, - title, - to, - topic, - trailer, - transfer_encoding, - ttl, - ua_color, - ua_media, - ua_pixels, - ua_resolution, - ua_windowpixels, - upgrade, - urgency, - uri, - user_agent, - variant_vary, - vary, - vbr_info, - version, - via, - want_digest, - warning, - www_authenticate, - x_archived_at, - x_device_accept, - x_device_accept_charset, - x_device_accept_encoding, - x_device_accept_language, - x_device_user_agent, - x_frame_options, - x_mittente, - x_pgp_sig, - x_ricevuta, - x_riferimento_message_id, - x_tiporicevuta, - x_trasporto, - x_verificasicurezza, - x400_content_identifier, - x400_content_return, - x400_content_type, - x400_mts_identifier, - x400_originator, - x400_received, - x400_recipients, - x400_trace, - xref, -}; - -/** Convert a field enum to a string. - - @param f The field to convert -*/ -string_view -to_string(field f); - -/** Attempt to convert a string to a field enum. - - The string comparison is case-insensitive. - - @return The corresponding field, or @ref field::unknown - if no known field matches. -*/ -field -string_to_field(string_view s); - -/// Write the text for a field name to an output stream. -inline -std::ostream& -operator<<(std::ostream& os, field f) -{ - return os << to_string(f); -} - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/field.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/fields.hpp b/contrib/restricted/boost/boost/beast/http/fields.hpp deleted file mode 100644 index e2f3847408..0000000000 --- a/contrib/restricted/boost/boost/beast/http/fields.hpp +++ /dev/null @@ -1,767 +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_HTTP_FIELDS_HPP -#define BOOST_BEAST_HTTP_FIELDS_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/string_param.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/detail/allocator.hpp> -#include <boost/beast/core/detail/empty_base_optimization.hpp> -#include <boost/beast/http/field.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/intrusive/list.hpp> -#include <boost/intrusive/set.hpp> -#include <boost/optional.hpp> -#include <algorithm> -#include <cctype> -#include <cstring> -#include <memory> -#include <string> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/** A container for storing HTTP header fields. - - This container is designed to store the field value pairs that make - up the fields and trailers in an HTTP message. Objects of this type - are iterable, with each element holding the field name and field - value. - - Field names are stored as-is, but comparisons are case-insensitive. - The container behaves as a `std::multiset`; there will be a separate - value for each occurrence of the same field name. When the container - is iterated the fields are presented in the order of insertion, with - fields having the same name following each other consecutively. - - Meets the requirements of @b Fields - - @tparam Allocator The allocator to use. This must meet the - requirements of @b Allocator. -*/ -template<class Allocator> -class basic_fields -#ifndef BOOST_BEAST_DOXYGEN - : private beast::detail::empty_base_optimization<Allocator> -#endif -{ - // Fancy pointers are not supported - static_assert(std::is_pointer<typename - std::allocator_traits<Allocator>::pointer>::value, - "Allocator must use regular pointers"); - - friend class fields_test; // for `header` - - static std::size_t constexpr max_static_buffer = 4096; - - using off_t = std::uint16_t; - -public: - /// The type of allocator used. - using allocator_type = Allocator; - - /// The type of element used to represent a field - class value_type - { - friend class basic_fields; - - boost::asio::const_buffer - buffer() const; - - value_type(field name, - string_view sname, string_view value); - - boost::intrusive::list_member_hook< - boost::intrusive::link_mode< - boost::intrusive::normal_link>> - list_hook_; - boost::intrusive::set_member_hook< - boost::intrusive::link_mode< - boost::intrusive::normal_link>> - set_hook_; - off_t off_; - off_t len_; - field f_; - - public: - /// Constructor (deleted) - value_type(value_type const&) = delete; - - /// Assignment (deleted) - value_type& operator=(value_type const&) = delete; - - /// Returns the field enum, which can be @ref field::unknown - field - name() const; - - /// Returns the field name as a string - string_view - name_string() const; - - /// Returns the value of the field - string_view - value() const; - }; - - /** A strictly less predicate for comparing keys, using a case-insensitive comparison. - - The case-comparison operation is defined only for low-ASCII characters. - */ - struct key_compare : beast::iless - { - /// Returns `true` if lhs is less than rhs using a strict ordering - template<class String> - bool - operator()( - String const& lhs, - value_type const& rhs) const noexcept - { - if(lhs.size() < rhs.name_string().size()) - return true; - if(lhs.size() > rhs.name_string().size()) - return false; - return iless::operator()(lhs, rhs.name_string()); - } - - /// Returns `true` if lhs is less than rhs using a strict ordering - template<class String> - bool - operator()( - value_type const& lhs, - String const& rhs) const noexcept - { - if(lhs.name_string().size() < rhs.size()) - return true; - if(lhs.name_string().size() > rhs.size()) - return false; - return iless::operator()(lhs.name_string(), rhs); - } - - /// Returns `true` if lhs is less than rhs using a strict ordering - bool - operator()( - value_type const& lhs, - value_type const& rhs) const noexcept - { - if(lhs.name_string().size() < rhs.name_string().size()) - return true; - if(lhs.name_string().size() > rhs.name_string().size()) - return false; - return iless::operator()(lhs.name_string(), rhs.name_string()); - } - }; - - /// The algorithm used to serialize the header -#if BOOST_BEAST_DOXYGEN - using writer = implementation_defined; -#else - class writer; -#endif - -private: - using list_t = typename boost::intrusive::make_list< - value_type, boost::intrusive::member_hook< - value_type, boost::intrusive::list_member_hook< - boost::intrusive::link_mode< - boost::intrusive::normal_link>>, - &value_type::list_hook_>, - boost::intrusive::constant_time_size< - false>>::type; - - using set_t = typename boost::intrusive::make_multiset< - value_type, boost::intrusive::member_hook<value_type, - boost::intrusive::set_member_hook< - boost::intrusive::link_mode< - boost::intrusive::normal_link>>, - &value_type::set_hook_>, - boost::intrusive::constant_time_size<true>, - boost::intrusive::compare<key_compare>>::type; - - using align_type = typename - boost::type_with_alignment<alignof(value_type)>::type; - - using rebind_type = typename - beast::detail::allocator_traits<Allocator>:: - template rebind_alloc<align_type>; - - using alloc_traits = - beast::detail::allocator_traits<rebind_type>; - - using size_type = typename - beast::detail::allocator_traits<Allocator>::size_type; - - -public: - /// Destructor - ~basic_fields(); - - /// Constructor. - basic_fields() = default; - - /** Constructor. - - @param alloc The allocator to use. - */ - explicit - basic_fields(Allocator const& alloc) noexcept; - - /** Move constructor. - - The state of the moved-from object is - as if constructed using the same allocator. - */ - basic_fields(basic_fields&&) noexcept; - - /** Move constructor. - - The state of the moved-from object is - as if constructed using the same allocator. - - @param alloc The allocator to use. - */ - basic_fields(basic_fields&&, Allocator const& alloc); - - /// Copy constructor. - basic_fields(basic_fields const&); - - /** Copy constructor. - - @param alloc The allocator to use. - */ - basic_fields(basic_fields const&, Allocator const& alloc); - - /// Copy constructor. - template<class OtherAlloc> - basic_fields(basic_fields<OtherAlloc> const&); - - /** Copy constructor. - - @param alloc The allocator to use. - */ - template<class OtherAlloc> - basic_fields(basic_fields<OtherAlloc> const&, - Allocator const& alloc); - - /** Move assignment. - - The state of the moved-from object is - as if constructed using the same allocator. - */ - basic_fields& operator=(basic_fields&&) noexcept( - alloc_traits::propagate_on_container_move_assignment::value); - - /// Copy assignment. - basic_fields& operator=(basic_fields const&); - - /// Copy assignment. - template<class OtherAlloc> - basic_fields& operator=(basic_fields<OtherAlloc> const&); - -public: - /// A constant iterator to the field sequence. -#if BOOST_BEAST_DOXYGEN - using const_iterator = implementation_defined; -#else - using const_iterator = typename list_t::const_iterator; -#endif - - /// A constant iterator to the field sequence. - using iterator = const_iterator; - - /// Return a copy of the allocator associated with the container. - allocator_type - get_allocator() const - { - return this->member(); - } - - //-------------------------------------------------------------------------- - // - // Element access - // - //-------------------------------------------------------------------------- - - /** Returns the value for a field, or throws an exception. - - If more than one field with the specified name exists, the - first field defined by insertion order is returned. - - @param name The name of the field. - - @return The field value. - - @throws std::out_of_range if the field is not found. - */ - string_view const - at(field name) const; - - /** Returns the value for a field, or throws an exception. - - If more than one field with the specified name exists, the - first field defined by insertion order is returned. - - @param name The name of the field. - - @return The field value. - - @throws std::out_of_range if the field is not found. - */ - string_view const - at(string_view name) const; - - /** Returns the value for a field, or `""` if it does not exist. - - If more than one field with the specified name exists, the - first field defined by insertion order is returned. - - @param name The name of the field. - */ - string_view const - operator[](field name) const; - - /** Returns the value for a case-insensitive matching header, or `""` if it does not exist. - - If more than one field with the specified name exists, the - first field defined by insertion order is returned. - - @param name The name of the field. - */ - string_view const - operator[](string_view name) const; - - //-------------------------------------------------------------------------- - // - // Iterators - // - //-------------------------------------------------------------------------- - - /// Return a const iterator to the beginning of the field sequence. - const_iterator - begin() const - { - return list_.cbegin(); - } - - /// Return a const iterator to the end of the field sequence. - const_iterator - end() const - { - return list_.cend(); - } - - /// Return a const iterator to the beginning of the field sequence. - const_iterator - cbegin() const - { - return list_.cbegin(); - } - - /// Return a const iterator to the end of the field sequence. - const_iterator - cend() const - { - return list_.cend(); - } - - //-------------------------------------------------------------------------- - // - // Capacity - // - //-------------------------------------------------------------------------- - -private: - // VFALCO Since the header and message derive from Fields, - // what does the expression m.empty() mean? Its confusing. - bool - empty() const - { - return list_.empty(); - } -public: - - //-------------------------------------------------------------------------- - // - // Modifiers - // - //-------------------------------------------------------------------------- - - /** Remove all fields from the container - - All references, pointers, or iterators referring to contained - elements are invalidated. All past-the-end iterators are also - invalidated. - - @par Postconditions: - @code - std::distance(this->begin(), this->end()) == 0 - @endcode - */ - void - clear(); - - /** Insert a field. - - If one or more fields with the same name already exist, - the new field will be inserted after the last field with - the matching name, in serialization order. - - @param name The field name. - - @param value The value of the field, as a @ref string_param - */ - void - insert(field name, string_param const& value); - - /** Insert a field. - - If one or more fields with the same name already exist, - the new field will be inserted after the last field with - the matching name, in serialization order. - - @param name The field name. - - @param value The value of the field, as a @ref string_param - */ - void - insert(string_view name, string_param const& value); - - /** Insert a field. - - If one or more fields with the same name already exist, - the new field will be inserted after the last field with - the matching name, in serialization order. - - @param name The field name. - - @param name_string The literal text corresponding to the - field name. If `name != field::unknown`, then this value - must be equal to `to_string(name)` using a case-insensitive - comparison, otherwise the behavior is undefined. - - @param value The value of the field, as a @ref string_param - */ - void - insert(field name, string_view name_string, - string_param const& value); - - /** Set a field value, removing any other instances of that field. - - First removes any values with matching field names, then - inserts the new field value. - - @param name The field name. - - @param value The value of the field, as a @ref string_param - - @return The field value. - */ - void - set(field name, string_param const& value); - - /** Set a field value, removing any other instances of that field. - - First removes any values with matching field names, then - inserts the new field value. - - @param name The field name. - - @param value The value of the field, as a @ref string_param - */ - void - set(string_view name, string_param const& value); - - /** Remove a field. - - References and iterators to the erased elements are - invalidated. Other references and iterators are not - affected. - - @param pos An iterator to the element to remove. - - @return An iterator following the last removed element. - If the iterator refers to the last element, the end() - iterator is returned. - */ - const_iterator - erase(const_iterator pos); - - /** Remove all fields with the specified name. - - All fields with the same field name are erased from the - container. - References and iterators to the erased elements are - invalidated. Other references and iterators are not - affected. - - @param name The field name. - - @return The number of fields removed. - */ - std::size_t - erase(field name); - - /** Remove all fields with the specified name. - - All fields with the same field name are erased from the - container. - References and iterators to the erased elements are - invalidated. Other references and iterators are not - affected. - - @param name The field name. - - @return The number of fields removed. - */ - std::size_t - erase(string_view name); - - /** Return a buffer sequence representing the trailers. - - This function returns a buffer sequence holding the - serialized representation of the trailer fields promised - in the Accept field. Before calling this function the - Accept field must contain the exact trailer fields - desired. Each field must also exist. - */ - - - /// Swap this container with another - void - swap(basic_fields& other); - - /// Swap two field containers - template<class Alloc> - friend - void - swap(basic_fields<Alloc>& lhs, basic_fields<Alloc>& rhs); - - //-------------------------------------------------------------------------- - // - // Lookup - // - //-------------------------------------------------------------------------- - - /** Return the number of fields with the specified name. - - @param name The field name. - */ - std::size_t - count(field name) const; - - /** Return the number of fields with the specified name. - - @param name The field name. - */ - std::size_t - count(string_view name) const; - - /** Returns an iterator to the case-insensitive matching field. - - If more than one field with the specified name exists, the - first field defined by insertion order is returned. - - @param name The field name. - - @return An iterator to the matching field, or `end()` if - no match was found. - */ - const_iterator - find(field name) const; - - /** Returns an iterator to the case-insensitive matching field name. - - If more than one field with the specified name exists, the - first field defined by insertion order is returned. - - @param name The field name. - - @return An iterator to the matching field, or `end()` if - no match was found. - */ - const_iterator - find(string_view name) const; - - /** Returns a range of iterators to the fields with the specified name. - - @param name The field name. - - @return A range of iterators to fields with the same name, - otherwise an empty range. - */ - std::pair<const_iterator, const_iterator> - equal_range(field name) const; - - /** Returns a range of iterators to the fields with the specified name. - - @param name The field name. - - @return A range of iterators to fields with the same name, - otherwise an empty range. - */ - std::pair<const_iterator, const_iterator> - equal_range(string_view name) const; - - //-------------------------------------------------------------------------- - // - // Observers - // - //-------------------------------------------------------------------------- - - /// Returns a copy of the key comparison function - key_compare - key_comp() const - { - return key_compare{}; - } - -protected: - /** Returns the request-method string. - - @note Only called for requests. - */ - string_view - get_method_impl() const; - - /** Returns the request-target string. - - @note Only called for requests. - */ - string_view - get_target_impl() const; - - /** Returns the response reason-phrase string. - - @note Only called for responses. - */ - string_view - get_reason_impl() const; - - /** Returns the chunked Transfer-Encoding setting - */ - bool - get_chunked_impl() const; - - /** Returns the keep-alive setting - */ - bool - get_keep_alive_impl(unsigned version) const; - - /** Returns `true` if the Content-Length field is present. - */ - bool - has_content_length_impl() const; - - /** Set or clear the method string. - - @note Only called for requests. - */ - void - set_method_impl(string_view s); - - /** Set or clear the target string. - - @note Only called for requests. - */ - void - set_target_impl(string_view s); - - /** Set or clear the reason string. - - @note Only called for responses. - */ - void - set_reason_impl(string_view s); - - /** Adjusts the chunked Transfer-Encoding value - */ - void - set_chunked_impl(bool value); - - /** Sets or clears the Content-Length field - */ - void - set_content_length_impl( - boost::optional<std::uint64_t> const& value); - - /** Adjusts the Connection field - */ - void - set_keep_alive_impl( - unsigned version, bool keep_alive); - -private: - template<class OtherAlloc> - friend class basic_fields; - - value_type& - new_element(field name, - string_view sname, string_view value); - - void - delete_element(value_type& e); - - void - set_element(value_type& e); - - void - realloc_string(string_view& dest, string_view s); - - void - realloc_target( - string_view& dest, string_view s); - - template<class OtherAlloc> - void - copy_all(basic_fields<OtherAlloc> const&); - - void - clear_all(); - - void - delete_list(); - - void - move_assign(basic_fields&, std::true_type); - - void - move_assign(basic_fields&, std::false_type); - - void - copy_assign(basic_fields const&, std::true_type); - - void - copy_assign(basic_fields const&, std::false_type); - - void - swap(basic_fields& other, std::true_type); - - void - swap(basic_fields& other, std::false_type); - - set_t set_; - list_t list_; - string_view method_; - string_view target_or_reason_; -}; - -/// A typical HTTP header fields container -using fields = basic_fields<std::allocator<char>>; - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/fields.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/file_body.hpp b/contrib/restricted/boost/boost/beast/http/file_body.hpp deleted file mode 100644 index 42e7a15330..0000000000 --- a/contrib/restricted/boost/boost/beast/http/file_body.hpp +++ /dev/null @@ -1,35 +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_HTTP_FILE_BODY_HPP -#define BOOST_BEAST_HTTP_FILE_BODY_HPP - -#include <boost/beast/core/file.hpp> -#include <boost/beast/http/basic_file_body.hpp> -#include <boost/assert.hpp> -#include <boost/optional.hpp> -#include <algorithm> -#include <cstdio> -#include <cstdint> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/// A message body represented by a file on the filesystem. -using file_body = basic_file_body<file>; - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/file_body_win32.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/basic_parser.ipp b/contrib/restricted/boost/boost/beast/http/impl/basic_parser.ipp deleted file mode 100644 index 39ad3cc68e..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/basic_parser.ipp +++ /dev/null @@ -1,928 +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_HTTP_IMPL_BASIC_PARSER_IPP -#define BOOST_BEAST_HTTP_IMPL_BASIC_PARSER_IPP - -#include <boost/beast/core/static_string.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/clamp.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/rfc7230.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/make_unique.hpp> -#include <algorithm> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -template<bool isRequest, class Derived> -template<class OtherDerived> -basic_parser<isRequest, Derived>:: -basic_parser(basic_parser< - isRequest, OtherDerived>&& other) - : body_limit_(other.body_limit_) - , len_(other.len_) - , buf_(std::move(other.buf_)) - , buf_len_(other.buf_len_) - , skip_(other.skip_) - , header_limit_(other.header_limit_) - , status_(other.status_) - , state_(other.state_) - , f_(other.f_) -{ -} - -template<bool isRequest, class Derived> -bool -basic_parser<isRequest, Derived>:: -keep_alive() const -{ - BOOST_ASSERT(is_header_done()); - if(f_ & flagHTTP11) - { - if(f_ & flagConnectionClose) - return false; - } - else - { - if(! (f_ & flagConnectionKeepAlive)) - return false; - } - return (f_ & flagNeedEOF) == 0; -} - -template<bool isRequest, class Derived> -boost::optional<std::uint64_t> -basic_parser<isRequest, Derived>:: -content_length() const -{ - BOOST_ASSERT(is_header_done()); - if(! (f_ & flagContentLength)) - return boost::none; - return len_; -} - -template<bool isRequest, class Derived> -void -basic_parser<isRequest, Derived>:: -skip(bool v) -{ - BOOST_ASSERT(! got_some()); - if(v) - f_ |= flagSkipBody; - else - f_ &= ~flagSkipBody; -} - -template<bool isRequest, class Derived> -template<class ConstBufferSequence> -std::size_t -basic_parser<isRequest, Derived>:: -put(ConstBufferSequence const& buffers, - error_code& ec) -{ - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - auto const p = boost::asio::buffer_sequence_begin(buffers); - auto const last = boost::asio::buffer_sequence_end(buffers); - if(p == last) - { - ec.assign(0, ec.category()); - return 0; - } - if(std::next(p) == last) - { - // single buffer - return put(boost::asio::const_buffer(*p), ec); - } - auto const size = buffer_size(buffers); - if(size <= max_stack_buffer) - return put_from_stack(size, buffers, ec); - if(size > buf_len_) - { - // reallocate - buf_ = boost::make_unique_noinit<char[]>(size); - buf_len_ = size; - } - // flatten - buffer_copy(boost::asio::buffer( - buf_.get(), buf_len_), buffers); - return put(boost::asio::const_buffer{ - buf_.get(), buf_len_}, ec); -} - -template<bool isRequest, class Derived> -std::size_t -basic_parser<isRequest, Derived>:: -put(boost::asio::const_buffer const& buffer, - error_code& ec) -{ - BOOST_ASSERT(state_ != state::complete); - using boost::asio::buffer_size; - auto p = reinterpret_cast< - char const*>(buffer.data()); - auto n = buffer.size(); - auto const p0 = p; - auto const p1 = p0 + n; - ec.assign(0, ec.category()); -loop: - switch(state_) - { - case state::nothing_yet: - if(n == 0) - { - ec = error::need_more; - return 0; - } - state_ = state::start_line; - BOOST_FALLTHROUGH; - - case state::start_line: - { - maybe_need_more(p, n, ec); - if(ec) - goto done; - parse_start_line(p, p + (std::min<std::size_t>)( - header_limit_, n), ec, is_request{}); - if(ec) - { - if(ec == error::need_more) - { - if(n >= header_limit_) - { - ec = error::header_limit; - goto done; - } - if(p + 3 <= p1) - skip_ = static_cast< - std::size_t>(p1 - p - 3); - } - goto done; - } - BOOST_ASSERT(! is_done()); - n = static_cast<std::size_t>(p1 - p); - if(p >= p1) - { - ec = error::need_more; - goto done; - } - BOOST_FALLTHROUGH; - } - - case state::fields: - maybe_need_more(p, n, ec); - if(ec) - goto done; - parse_fields(p, p + (std::min<std::size_t>)( - header_limit_, n), ec); - if(ec) - { - if(ec == error::need_more) - { - if(n >= header_limit_) - { - ec = error::header_limit; - goto done; - } - if(p + 3 <= p1) - skip_ = static_cast< - std::size_t>(p1 - p - 3); - } - goto done; - } - finish_header(ec, is_request{}); - break; - - case state::body0: - BOOST_ASSERT(! skip_); - impl().on_body_init_impl(content_length(), ec); - if(ec) - goto done; - state_ = state::body; - BOOST_FALLTHROUGH; - - case state::body: - BOOST_ASSERT(! skip_); - parse_body(p, n, ec); - if(ec) - goto done; - break; - - case state::body_to_eof0: - BOOST_ASSERT(! skip_); - impl().on_body_init_impl(content_length(), ec); - if(ec) - goto done; - state_ = state::body_to_eof; - BOOST_FALLTHROUGH; - - case state::body_to_eof: - BOOST_ASSERT(! skip_); - parse_body_to_eof(p, n, ec); - if(ec) - goto done; - break; - - case state::chunk_header0: - impl().on_body_init_impl(content_length(), ec); - if(ec) - goto done; - state_ = state::chunk_header; - BOOST_FALLTHROUGH; - - case state::chunk_header: - parse_chunk_header(p, n, ec); - if(ec) - goto done; - break; - - case state::chunk_body: - parse_chunk_body(p, n, ec); - if(ec) - goto done; - break; - - case state::complete: - ec.assign(0, ec.category()); - goto done; - } - if(p < p1 && ! is_done() && eager()) - { - n = static_cast<std::size_t>(p1 - p); - goto loop; - } -done: - return static_cast<std::size_t>(p - p0); -} - -template<bool isRequest, class Derived> -void -basic_parser<isRequest, Derived>:: -put_eof(error_code& ec) -{ - BOOST_ASSERT(got_some()); - if( state_ == state::start_line || - state_ == state::fields) - { - ec = error::partial_message; - return; - } - if(f_ & (flagContentLength | flagChunked)) - { - if(state_ != state::complete) - { - ec = error::partial_message; - return; - } - ec.assign(0, ec.category()); - return; - } - impl().on_finish_impl(ec); - if(ec) - return; - state_ = state::complete; -} - -template<bool isRequest, class Derived> -template<class ConstBufferSequence> -std::size_t -basic_parser<isRequest, Derived>:: -put_from_stack(std::size_t size, - ConstBufferSequence const& buffers, - error_code& ec) -{ - char buf[max_stack_buffer]; - using boost::asio::buffer; - using boost::asio::buffer_copy; - buffer_copy(buffer(buf, sizeof(buf)), buffers); - return put(boost::asio::const_buffer{ - buf, size}, ec); -} - -template<bool isRequest, class Derived> -inline -void -basic_parser<isRequest, Derived>:: -maybe_need_more( - char const* p, std::size_t n, - error_code& ec) -{ - if(skip_ == 0) - return; - if( n > header_limit_) - n = header_limit_; - if(n < skip_ + 4) - { - ec = error::need_more; - return; - } - auto const term = - find_eom(p + skip_, p + n); - if(! term) - { - skip_ = n - 3; - if(skip_ + 4 > header_limit_) - { - ec = error::header_limit; - return; - } - ec = error::need_more; - return; - } - skip_ = 0; -} - -template<bool isRequest, class Derived> -inline -void -basic_parser<isRequest, Derived>:: -parse_start_line( - char const*& in, char const* last, - error_code& ec, std::true_type) -{ -/* - request-line = method SP request-target SP HTTP-version CRLF - method = token -*/ - auto p = in; - - string_view method; - parse_method(p, last, method, ec); - if(ec) - return; - - string_view target; - parse_target(p, last, target, ec); - if(ec) - return; - - int version = 0; - parse_version(p, last, version, ec); - if(ec) - return; - if(version < 10 || version > 11) - { - ec = error::bad_version; - return; - } - - if(p + 2 > last) - { - ec = error::need_more; - return; - } - if(p[0] != '\r' || p[1] != '\n') - { - ec = error::bad_version; - return; - } - p += 2; - - if(version >= 11) - f_ |= flagHTTP11; - - impl().on_request_impl(string_to_verb(method), - method, target, version, ec); - if(ec) - return; - - in = p; - state_ = state::fields; -} - -template<bool isRequest, class Derived> -inline -void -basic_parser<isRequest, Derived>:: -parse_start_line( - char const*& in, char const* last, - error_code& ec, std::false_type) -{ -/* - status-line = HTTP-version SP status-code SP reason-phrase CRLF - status-code = 3*DIGIT - reason-phrase = *( HTAB / SP / VCHAR / obs-text ) -*/ - auto p = in; - - int version = 0; - parse_version(p, last, version, ec); - if(ec) - return; - if(version < 10 || version > 11) - { - ec = error::bad_version; - return; - } - - // SP - if(p + 1 > last) - { - ec = error::need_more; - return; - } - if(*p++ != ' ') - { - ec = error::bad_version; - return; - } - - parse_status(p, last, status_, ec); - if(ec) - return; - - // parse reason CRLF - string_view reason; - parse_reason(p, last, reason, ec); - if(ec) - return; - - if(version >= 11) - f_ |= flagHTTP11; - - impl().on_response_impl( - status_, reason, version, ec); - if(ec) - return; - - in = p; - state_ = state::fields; -} - -template<bool isRequest, class Derived> -void -basic_parser<isRequest, Derived>:: -parse_fields(char const*& in, - char const* last, error_code& ec) -{ - string_view name; - string_view value; - // https://stackoverflow.com/questions/686217/maximum-on-http-header-values - static_string<max_obs_fold> buf; - auto p = in; - for(;;) - { - if(p + 2 > last) - { - ec = error::need_more; - return; - } - if(p[0] == '\r') - { - if(p[1] != '\n') - ec = error::bad_line_ending; - in = p + 2; - return; - } - parse_field(p, last, name, value, buf, ec); - if(ec) - return; - auto const f = string_to_field(name); - do_field(f, value, ec); - if(ec) - return; - impl().on_field_impl(f, name, value, ec); - if(ec) - return; - in = p; - } -} - -template<bool isRequest, class Derived> -inline -void -basic_parser<isRequest, Derived>:: -finish_header(error_code& ec, std::true_type) -{ - // RFC 7230 section 3.3 - // https://tools.ietf.org/html/rfc7230#section-3.3 - - if(f_ & flagSkipBody) - { - state_ = state::complete; - } - else if(f_ & flagContentLength) - { - if(len_ > body_limit_) - { - ec = error::body_limit; - return; - } - if(len_ > 0) - { - f_ |= flagHasBody; - state_ = state::body0; - } - else - { - state_ = state::complete; - } - } - else if(f_ & flagChunked) - { - f_ |= flagHasBody; - state_ = state::chunk_header0; - } - else - { - len_ = 0; - state_ = state::complete; - } - - impl().on_header_impl(ec); - if(ec) - return; - if(state_ == state::complete) - { - impl().on_finish_impl(ec); - if(ec) - return; - } -} - -template<bool isRequest, class Derived> -inline -void -basic_parser<isRequest, Derived>:: -finish_header(error_code& ec, std::false_type) -{ - // RFC 7230 section 3.3 - // https://tools.ietf.org/html/rfc7230#section-3.3 - - if( (f_ & flagSkipBody) || // e.g. response to a HEAD request - status_ / 100 == 1 || // 1xx e.g. Continue - status_ == 204 || // No Content - status_ == 304) // Not Modified - { - // VFALCO Content-Length may be present, but we - // treat the message as not having a body. - // https://github.com/boostorg/beast/issues/692 - state_ = state::complete; - } - else if(f_ & flagContentLength) - { - if(len_ > body_limit_) - { - ec = error::body_limit; - return; - } - if(len_ > 0) - { - f_ |= flagHasBody; - state_ = state::body0; - } - else - { - state_ = state::complete; - } - } - else if(f_ & flagChunked) - { - f_ |= flagHasBody; - state_ = state::chunk_header0; - } - else - { - f_ |= flagHasBody; - f_ |= flagNeedEOF; - state_ = state::body_to_eof0; - } - - impl().on_header_impl(ec); - if(ec) - return; - if(state_ == state::complete) - { - impl().on_finish_impl(ec); - if(ec) - return; - } -} - -template<bool isRequest, class Derived> -inline -void -basic_parser<isRequest, Derived>:: -parse_body(char const*& p, - std::size_t n, error_code& ec) -{ - n = impl().on_body_impl(string_view{p, - beast::detail::clamp(len_, n)}, ec); - p += n; - len_ -= n; - if(ec) - return; - if(len_ > 0) - return; - impl().on_finish_impl(ec); - if(ec) - return; - state_ = state::complete; -} - -template<bool isRequest, class Derived> -inline -void -basic_parser<isRequest, Derived>:: -parse_body_to_eof(char const*& p, - std::size_t n, error_code& ec) -{ - if(n > body_limit_) - { - ec = error::body_limit; - return; - } - body_limit_ = body_limit_ - n; - n = impl().on_body_impl(string_view{p, n}, ec); - p += n; - if(ec) - return; -} - -template<bool isRequest, class Derived> -void -basic_parser<isRequest, Derived>:: -parse_chunk_header(char const*& p0, - std::size_t n, error_code& ec) -{ -/* - chunked-body = *chunk last-chunk trailer-part CRLF - - chunk = chunk-size [ chunk-ext ] CRLF chunk-data CRLF - last-chunk = 1*("0") [ chunk-ext ] CRLF - trailer-part = *( header-field CRLF ) - - chunk-size = 1*HEXDIG - chunk-data = 1*OCTET ; a sequence of chunk-size octets - chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) - chunk-ext-name = token - chunk-ext-val = token / quoted-string -*/ - - auto p = p0; - auto const pend = p + n; - char const* eol; - - if(! (f_ & flagFinalChunk)) - { - if(n < skip_ + 2) - { - ec = error::need_more; - return; - } - if(f_ & flagExpectCRLF) - { - // Treat the last CRLF in a chunk as - // part of the next chunk, so p can - // be parsed in one call instead of two. - if(! parse_crlf(p)) - { - ec = error::bad_chunk; - return; - } - } - eol = find_eol(p0 + skip_, pend, ec); - if(ec) - return; - if(! eol) - { - ec = error::need_more; - skip_ = n - 1; - return; - } - skip_ = static_cast< - std::size_t>(eol - 2 - p0); - - std::uint64_t size; - if(! parse_hex(p, size)) - { - ec = error::bad_chunk; - return; - } - if(size != 0) - { - if(size > body_limit_) - { - ec = error::body_limit; - return; - } - body_limit_ -= size; - auto const start = p; - parse_chunk_extensions(p, pend, ec); - if(ec) - return; - if(p != eol -2 ) - { - ec = error::bad_chunk_extension; - return; - } - auto const ext = make_string(start, p); - impl().on_chunk_header_impl(size, ext, ec); - if(ec) - return; - len_ = size; - skip_ = 2; - p0 = eol; - f_ |= flagExpectCRLF; - state_ = state::chunk_body; - return; - } - - f_ |= flagFinalChunk; - } - else - { - BOOST_ASSERT(n >= 5); - if(f_ & flagExpectCRLF) - BOOST_VERIFY(parse_crlf(p)); - std::uint64_t size; - BOOST_VERIFY(parse_hex(p, size)); - eol = find_eol(p, pend, ec); - BOOST_ASSERT(! ec); - } - - auto eom = find_eom(p0 + skip_, pend); - if(! eom) - { - BOOST_ASSERT(n >= 3); - skip_ = n - 3; - ec = error::need_more; - return; - } - - auto const start = p; - parse_chunk_extensions(p, pend, ec); - if(ec) - return; - if(p != eol - 2) - { - ec = error::bad_chunk_extension; - return; - } - auto const ext = make_string(start, p); - impl().on_chunk_header_impl(0, ext, ec); - if(ec) - return; - p = eol; - parse_fields(p, eom, ec); - if(ec) - return; - BOOST_ASSERT(p == eom); - p0 = eom; - - impl().on_finish_impl(ec); - if(ec) - return; - state_ = state::complete; -} - -template<bool isRequest, class Derived> -inline -void -basic_parser<isRequest, Derived>:: -parse_chunk_body(char const*& p, - std::size_t n, error_code& ec) -{ - n = impl().on_chunk_body_impl( - len_, string_view{p, - beast::detail::clamp(len_, n)}, ec); - p += n; - len_ -= n; - if(len_ == 0) - state_ = state::chunk_header; -} - -template<bool isRequest, class Derived> -void -basic_parser<isRequest, Derived>:: -do_field(field f, - string_view value, error_code& ec) -{ - // Connection - if(f == field::connection || - f == field::proxy_connection) - { - auto const list = opt_token_list{value}; - if(! validate_list(list)) - { - // VFALCO Should this be a field specific error? - ec = error::bad_value; - return; - } - for(auto const& s : list) - { - if(iequals({"close", 5}, s)) - { - f_ |= flagConnectionClose; - continue; - } - - if(iequals({"keep-alive", 10}, s)) - { - f_ |= flagConnectionKeepAlive; - continue; - } - - if(iequals({"upgrade", 7}, s)) - { - f_ |= flagConnectionUpgrade; - continue; - } - } - ec.assign(0, ec.category()); - return; - } - - // Content-Length - if(f == field::content_length) - { - if(f_ & flagContentLength) - { - // duplicate - ec = error::bad_content_length; - return; - } - - if(f_ & flagChunked) - { - // conflicting field - ec = error::bad_content_length; - return; - } - - std::uint64_t v; - if(! parse_dec( - value.begin(), value.end(), v)) - { - ec = error::bad_content_length; - return; - } - - ec.assign(0, ec.category()); - len_ = v; - f_ |= flagContentLength; - return; - } - - // Transfer-Encoding - if(f == field::transfer_encoding) - { - if(f_ & flagChunked) - { - // duplicate - ec = error::bad_transfer_encoding; - return; - } - - if(f_ & flagContentLength) - { - // conflicting field - ec = error::bad_transfer_encoding; - return; - } - - ec.assign(0, ec.category()); - auto const v = token_list{value}; - auto const p = std::find_if(v.begin(), v.end(), - [&](typename token_list::value_type const& s) - { - return iequals({"chunked", 7}, s); - }); - if(p == v.end()) - return; - if(std::next(p) != v.end()) - return; - len_ = 0; - f_ |= flagChunked; - return; - } - - // Upgrade - if(f == field::upgrade) - { - ec.assign(0, ec.category()); - f_ |= flagUpgrade; - return; - } - - ec.assign(0, ec.category()); -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/chunk_encode.ipp b/contrib/restricted/boost/boost/beast/http/impl/chunk_encode.ipp deleted file mode 100644 index 51296041f7..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/chunk_encode.ipp +++ /dev/null @@ -1,707 +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_HTTP_IMPL_CHUNK_ENCODE_IPP -#define BOOST_BEAST_HTTP_IMPL_CHUNK_ENCODE_IPP - -#include <boost/beast/core/detail/varint.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/detail/rfc7230.hpp> -#include <algorithm> - -namespace boost { -namespace beast { -namespace http { - -inline -chunk_header:: -chunk_header(std::size_t size) - : view_( - size, - boost::asio::const_buffer{nullptr, 0}, - chunk_crlf{}) -{ - BOOST_ASSERT(size > 0); -} - -inline -chunk_header:: -chunk_header( - std::size_t size, - string_view extensions) - : view_( - size, - boost::asio::const_buffer{ - extensions.data(), extensions.size()}, - chunk_crlf{}) -{ - BOOST_ASSERT(size > 0); -} - -template<class ChunkExtensions, class> -chunk_header:: -chunk_header( - std::size_t size, - ChunkExtensions&& extensions) - : exts_(std::make_shared<detail::chunk_extensions_impl< - typename std::decay<ChunkExtensions>::type>>( - std::forward<ChunkExtensions>(extensions))) - , view_( - size, - exts_->str(), - chunk_crlf{}) -{ - static_assert( - detail::is_chunk_extensions<ChunkExtensions>::value, - "ChunkExtensions requirements not met"); - BOOST_ASSERT(size > 0); -} - -template<class ChunkExtensions, class Allocator, class> -chunk_header:: -chunk_header( - std::size_t size, - ChunkExtensions&& extensions, - Allocator const& allocator) - : exts_(std::allocate_shared<detail::chunk_extensions_impl< - typename std::decay<ChunkExtensions>::type>>(allocator, - std::forward<ChunkExtensions>(extensions))) - , view_( - size, - exts_->str(), - chunk_crlf{}) -{ - static_assert( - detail::is_chunk_extensions<ChunkExtensions>::value, - "ChunkExtensions requirements not met"); - BOOST_ASSERT(size > 0); -} - -//------------------------------------------------------------------------------ - -template<class ConstBufferSequence> -chunk_body<ConstBufferSequence>:: -chunk_body(ConstBufferSequence const& buffers) - : view_( - boost::asio::buffer_size(buffers), - boost::asio::const_buffer{nullptr, 0}, - chunk_crlf{}, - buffers, - chunk_crlf{}) -{ -} - -template<class ConstBufferSequence> -chunk_body<ConstBufferSequence>:: -chunk_body( - ConstBufferSequence const& buffers, - string_view extensions) - : view_( - boost::asio::buffer_size(buffers), - boost::asio::const_buffer{ - extensions.data(), extensions.size()}, - chunk_crlf{}, - buffers, - chunk_crlf{}) -{ -} - -template<class ConstBufferSequence> -template<class ChunkExtensions, class> -chunk_body<ConstBufferSequence>:: -chunk_body( - ConstBufferSequence const& buffers, - ChunkExtensions&& extensions) - : exts_(std::make_shared<detail::chunk_extensions_impl< - typename std::decay<ChunkExtensions>::type>>( - std::forward<ChunkExtensions>(extensions))) - , view_( - boost::asio::buffer_size(buffers), - exts_->str(), - chunk_crlf{}, - buffers, - chunk_crlf{}) -{ -} - -template<class ConstBufferSequence> -template<class ChunkExtensions, class Allocator, class> -chunk_body<ConstBufferSequence>:: -chunk_body( - ConstBufferSequence const& buffers, - ChunkExtensions&& extensions, - Allocator const& allocator) - : exts_(std::allocate_shared<detail::chunk_extensions_impl< - typename std::decay<ChunkExtensions>::type>>(allocator, - std::forward<ChunkExtensions>(extensions))) - , view_( - boost::asio::buffer_size(buffers), - exts_->str(), - chunk_crlf{}, - buffers, - chunk_crlf{}) -{ -} - -//------------------------------------------------------------------------------ - -template<class Trailer> -template<class Allocator> -auto -chunk_last<Trailer>:: -prepare(Trailer const& trailer, Allocator const& allocator) -> - buffers_type -{ - auto sp = std::allocate_shared<typename - Trailer::writer>(allocator, trailer); - sp_ = sp; - return sp->get(); -} - -template<class Trailer> -auto -chunk_last<Trailer>:: -prepare(Trailer const& trailer, std::true_type) -> - buffers_type -{ - auto sp = std::make_shared< - typename Trailer::writer>(trailer); - sp_ = sp; - return sp->get(); -} - -template<class Trailer> -auto -chunk_last<Trailer>:: -prepare(Trailer const& trailer, std::false_type) -> - buffers_type -{ - return trailer; -} - -template<class Trailer> -chunk_last<Trailer>:: -chunk_last() - : view_( - detail::chunk_size0{}, - Trailer{}) -{ -} - -template<class Trailer> -chunk_last<Trailer>:: -chunk_last(Trailer const& trailer) - : view_( - detail::chunk_size0{}, - prepare(trailer, is_fields<Trailer>{})) -{ -} - -template<class Trailer> -template<class DeducedTrailer, class Allocator, class> -chunk_last<Trailer>:: -chunk_last( - DeducedTrailer const& trailer, Allocator const& allocator) - : view_( - detail::chunk_size0{}, - prepare(trailer, allocator)) -{ -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -class basic_chunk_extensions<Allocator>::const_iterator -{ - friend class basic_chunk_extensions; - - using iter_type = char const*; - - iter_type it_; - typename basic_chunk_extensions::value_type value_; - - explicit - const_iterator(iter_type it) - : it_(it) - { - } - - void - increment(); - -public: - using value_type = typename - basic_chunk_extensions::value_type; - using pointer = value_type const*; - using reference = value_type const&; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::forward_iterator_tag; - - const_iterator() = default; - const_iterator(const_iterator&& other) = default; - const_iterator(const_iterator const& other) = default; - const_iterator& operator=(const_iterator&& other) = default; - const_iterator& operator=(const_iterator const& other) = default; - - bool - operator==(const_iterator const& other) const - { - return it_ == other.it_; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*(); - - pointer - operator->() - { - return &(**this); - } - - const_iterator& - operator++() - { - increment(); - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - increment(); - return temp; - } -}; - -template<class Allocator> -void -basic_chunk_extensions<Allocator>:: -const_iterator:: -increment() -{ - using beast::detail::varint_read; - auto n = varint_read(it_); - it_ += n; - n = varint_read(it_); - it_ += n; -} - -template<class Allocator> -auto -basic_chunk_extensions<Allocator>:: -const_iterator:: -operator*() -> - reference -{ - using beast::detail::varint_read; - auto it = it_; - auto n = varint_read(it); - value_.first = string_view{it, n}; - it += n; - n = varint_read(it); - value_.second = string_view{it, n}; - return value_; -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -template<class FwdIt> -FwdIt -basic_chunk_extensions<Allocator>:: -do_parse(FwdIt it, FwdIt last, error_code& ec) -{ -/* - chunk-ext = *( BWS ";" BWS chunk-ext-name [ BWS "=" BWS chunk-ext-val ] ) - BWS = *( SP / HTAB ) ; "Bad White Space" - chunk-ext-name = token - chunk-ext-val = token / quoted-string - token = 1*tchar - quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE - qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' / %x5D-7E ; ']'-'~' / obs-text - quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - obs-text = %x80-FF - - https://www.rfc-editor.org/errata_search.php?rfc=7230&eid=4667 -*/ - using beast::detail::varint_size; - using beast::detail::varint_write; - using CharT = char; - using Traits = std::char_traits<CharT>; - range_.reserve(static_cast<std::size_t>( - std::distance(it, last) * 1.2)); - range_.resize(0); - auto const emit_string = - [this](FwdIt from, FwdIt to) - { - auto const len = - std::distance(from, to); - auto const offset = range_.size(); - range_.resize( - offset + - varint_size(len) + - len); - auto dest = &range_[offset]; - varint_write(dest, len); - Traits::copy(dest, from, len); - }; - auto const emit_string_plus_empty = - [this](FwdIt from, FwdIt to) - { - auto const len = - std::distance(from, to); - auto const offset = range_.size(); - range_.resize( - offset + - varint_size(len) + - len + - varint_size(0)); - auto dest = &range_[offset]; - varint_write(dest, len); - Traits::copy(dest, from, len); - dest += len; - varint_write(dest, 0); - }; - auto const emit_empty_string = - [this] - { - auto const offset = range_.size(); - range_.resize(offset + varint_size(0)); - auto dest = &range_[offset]; - varint_write(dest, 0); - }; -loop: - if(it == last) - { - ec.assign(0, ec.category()); - return it; - } - // BWS - if(*it == ' ' || *it == '\t') - { - for(;;) - { - ++it; - if(it == last) - { - ec = error::bad_chunk_extension; - return it; - } - if(*it != ' ' && *it != '\t') - break; - } - } - // ';' - if(*it != ';') - { - ec = error::bad_chunk_extension; - return it; - } -semi: - ++it; // skip ';' - // BWS - for(;;) - { - if(it == last) - { - ec = error::bad_chunk_extension; - return it; - } - if(*it != ' ' && *it != '\t') - break; - ++it; - } - // chunk-ext-name - { - if(! detail::is_token_char(*it)) - { - ec = error::bad_chunk_extension; - return it; - } - auto const first = it; - for(;;) - { - ++it; - if(it == last) - { - emit_string_plus_empty(first, it); - return it; - } - if(! detail::is_token_char(*it)) - break; - } - emit_string(first, it); - } - // BWS [ ";" / "=" ] - for(;;) - { - if(*it != ' ' && *it != '\t') - break; - ++it; - if(it == last) - { - ec = error::bad_chunk_extension; - return it; - } - } - if(*it == ';') - { - emit_empty_string(); - goto semi; - } - if(*it != '=') - { - ec = error::bad_chunk_extension; - return it; - } - ++it; // skip '=' - // BWS - for(;;) - { - if(it == last) - { - ec = error::bad_chunk_extension; - return it; - } - if(*it != ' ' && *it != '\t') - break; - ++it; - } - // chunk-ext-val - if(*it != '"') - { - // token - if(! detail::is_token_char(*it)) - { - ec = error::bad_chunk_extension; - return it; - } - auto const first = it; - for(;;) - { - ++it; - if(it == last) - break; - if(! detail::is_token_char(*it)) - break; - } - emit_string(first, it); - if(it == last) - return it; - } - else - { - // quoted-string - auto const first = ++it; // skip DQUOTE - // first pass, count chars - std::size_t len = 0; - for(;;) - { - if(it == last) - { - ec = error::bad_chunk_extension; - return it; - } - if(*it == '"') - break; - if(*it == '\\') - { - ++it; - if(it == last) - { - ec = error::bad_chunk_extension; - return it; - } - } - ++len; - ++it; - } - // now build the string - auto const offset = range_.size(); - range_.resize( - offset + - varint_size(len) + - len); - auto dest = &range_[offset]; - varint_write(dest, len); - it = first; - for(;;) - { - BOOST_ASSERT(it != last); - if(*it == '"') - break; - if(*it == '\\') - { - ++it; - BOOST_ASSERT(it != last); - } - Traits::assign(*dest++, *it++); - } - ++it; // skip DQUOTE - } - goto loop; -} - -template<class Allocator> -void -basic_chunk_extensions<Allocator>:: -do_insert(string_view name, string_view value) -{ -/* - chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) - chunk-ext-name = token - chunk-ext-val = token / quoted-string - token = 1*tchar - quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE - qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' / %x5D-7E ; ']'-'~' / obs-text - quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - obs-text = %x80-FF -*/ - if(value.empty()) - { - s_.reserve(1 + name.size()); - s_.push_back(';'); - s_.append(name.data(), name.size()); - return; - } - - bool is_token = true; - for(auto const c : value) - { - if(! detail::is_token_char(c)) - { - is_token = false; - break; - } - } - if(is_token) - { - // token - s_.reserve(1 + name.size() + 1 + value.size()); - s_.push_back(';'); - s_.append(name.data(), name.size()); - s_.push_back('='); - s_.append(value.data(), value.size()); - } - else - { - // quoted-string - s_.reserve( - 1 + name.size() + 1 + - 1 + value.size() + 20 + 1); - s_.push_back(';'); - s_.append(name.data(), name.size()); - s_.append("=\"", 2); - for(auto const c : value) - { - if(c == '\\') - s_.append(R"(\\)", 2); - else if(c == '\"') - s_.append(R"(\")", 2); - else - s_.push_back(c); - } - s_.push_back('"'); - } -} - -template<class Allocator> -void -basic_chunk_extensions<Allocator>:: -parse(string_view s, error_code& ec) -{ - do_parse(s.data(), s.data() + s.size(), ec); - if(! ec) - { - s_.clear(); - for(auto const& v : *this) - do_insert(v.first, v.second); - } -} - -template<class Allocator> -void -basic_chunk_extensions<Allocator>:: -insert(string_view name) -{ - do_insert(name, {}); - - using beast::detail::varint_size; - using beast::detail::varint_write; - auto const offset = range_.size(); - range_.resize( - offset + - varint_size(name.size()) + - name.size() + - varint_size(0)); - auto dest = &range_[offset]; - varint_write(dest, name.size()); - std::memcpy(dest, name.data(), name.size()); - dest += name.size(); - varint_write(dest, 0); -} - -template<class Allocator> -void -basic_chunk_extensions<Allocator>:: -insert(string_view name, string_view value) -{ - do_insert(name, value); - - using beast::detail::varint_size; - using beast::detail::varint_write; - auto const offset = range_.size(); - range_.resize( - offset + - varint_size(name.size()) + - name.size() + - varint_size(value.size()) + - value.size()); - auto dest = &range_[offset]; - varint_write(dest, name.size()); - std::memcpy(dest, name.data(), name.size()); - dest += name.size(); - varint_write(dest, value.size()); - std::memcpy(dest, value.data(), value.size()); -} - -template<class Allocator> -inline -auto -basic_chunk_extensions<Allocator>:: -begin() const -> - const_iterator -{ - return const_iterator{range_.data()}; -} - -template<class Allocator> -inline -auto -basic_chunk_extensions<Allocator>:: -end() const -> - const_iterator -{ - return const_iterator{ - range_.data() + range_.size()}; -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/error.ipp b/contrib/restricted/boost/boost/beast/http/impl/error.ipp deleted file mode 100644 index 45075f5c18..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/error.ipp +++ /dev/null @@ -1,120 +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_HTTP_IMPL_ERROR_IPP -#define BOOST_BEAST_HTTP_IMPL_ERROR_IPP - -#include <type_traits> - -namespace boost { - -namespace system { -template<> -struct is_error_code_enum<beast::http::error> -{ - static bool const value = true; -}; -} // system - -namespace beast { -namespace http { -namespace detail { - -class http_error_category : public error_category -{ -public: - const char* - name() const noexcept override - { - return "beast.http"; - } - - std::string - message(int ev) const override - { - switch(static_cast<error>(ev)) - { - case error::end_of_stream: return "end of stream"; - case error::partial_message: return "partial message"; - case error::need_more: return "need more"; - case error::unexpected_body: return "unexpected body"; - case error::need_buffer: return "need buffer"; - case error::end_of_chunk: return "end of chunk"; - case error::buffer_overflow: return "buffer overflow"; - case error::header_limit: return "header limit exceeded"; - case error::body_limit: return "body limit exceeded"; - case error::bad_alloc: return "bad alloc"; - case error::bad_line_ending: return "bad line ending"; - case error::bad_method: return "bad method"; - case error::bad_target: return "bad target"; - case error::bad_version: return "bad version"; - case error::bad_status: return "bad status"; - case error::bad_reason: return "bad reason"; - case error::bad_field: return "bad field"; - case error::bad_value: return "bad value"; - case error::bad_content_length: return "bad Content-Length"; - case error::bad_transfer_encoding: return "bad Transfer-Encoding"; - case error::bad_chunk: return "bad chunk"; - case error::bad_chunk_extension: return "bad chunk extension"; - case error::bad_obs_fold: return "bad obs-fold"; - - default: - return "beast.http error"; - } - } - - error_condition - default_error_condition( - int ev) const noexcept override - { - return error_condition{ev, *this}; - } - - bool - equivalent(int ev, - error_condition const& condition - ) const noexcept override - { - return condition.value() == ev && - &condition.category() == this; - } - - bool - equivalent(error_code const& error, - int ev) const noexcept override - { - return error.value() == ev && - &error.category() == this; - } -}; - -inline -error_category const& -get_http_error_category() -{ - static http_error_category const cat{}; - return cat; -} - -} // detail - -inline -error_code -make_error_code(error ev) -{ - return error_code{ - static_cast<std::underlying_type<error>::type>(ev), - detail::get_http_error_category()}; -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/field.ipp b/contrib/restricted/boost/boost/beast/http/impl/field.ipp deleted file mode 100644 index 467a40aeee..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/field.ipp +++ /dev/null @@ -1,562 +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_HTTP_IMPL_FIELD_IPP -#define BOOST_BEAST_HTTP_IMPL_FIELD_IPP - -#include <boost/beast/core/string.hpp> -#include <algorithm> -#include <array> -#include <unordered_map> -#include <vector> -#include <boost/assert.hpp> - -namespace boost { -namespace beast { -namespace http { - -namespace detail { - -struct field_table -{ - using array_type = - std::array<string_view, 353>; - - struct hash - { - std::size_t - operator()(string_view s) const - { - auto const n = s.size(); - return - beast::detail::ascii_tolower(s[0]) * - beast::detail::ascii_tolower(s[n/2]) ^ - beast::detail::ascii_tolower(s[n-1]); // hist[] = 331, 10, max_load_factor = 0.15f - } - }; - - struct iequal - { - // assumes inputs have equal length - bool - operator()( - string_view lhs, - string_view rhs) const - { - auto p1 = lhs.data(); - auto p2 = rhs.data(); - auto pend = lhs.end(); - char a, b; - while(p1 < pend) - { - a = *p1++; - b = *p2++; - if(a != b) - goto slow; - } - return true; - - while(p1 < pend) - { - slow: - if( beast::detail::ascii_tolower(a) != - beast::detail::ascii_tolower(b)) - return false; - a = *p1++; - b = *p2++; - } - return true; - } - }; - - using map_type = std::unordered_map< - string_view, field, hash, iequal>; - - array_type by_name_; - std::vector<map_type> by_size_; -/* - From: - - https://www.iana.org/assignments/message-headers/message-headers.xhtml -*/ - field_table() - : by_name_({{ - "<unknown-field>", - "A-IM", - "Accept", - "Accept-Additions", - "Accept-Charset", - "Accept-Datetime", - "Accept-Encoding", - "Accept-Features", - "Accept-Language", - "Accept-Patch", - "Accept-Post", - "Accept-Ranges", - "Access-Control", - "Access-Control-Allow-Credentials", - "Access-Control-Allow-Headers", - "Access-Control-Allow-Methods", - "Access-Control-Allow-Origin", - "Access-Control-Expose-Headers", - "Access-Control-Max-Age", - "Access-Control-Request-Headers", - "Access-Control-Request-Method", - "Age", - "Allow", - "ALPN", - "Also-Control", - "Alt-Svc", - "Alt-Used", - "Alternate-Recipient", - "Alternates", - "Apparently-To", - "Apply-To-Redirect-Ref", - "Approved", - "Archive", - "Archived-At", - "Article-Names", - "Article-Updates", - "Authentication-Control", - "Authentication-Info", - "Authentication-Results", - "Authorization", - "Auto-Submitted", - "Autoforwarded", - "Autosubmitted", - "Base", - "Bcc", - "Body", - "C-Ext", - "C-Man", - "C-Opt", - "C-PEP", - "C-PEP-Info", - "Cache-Control", - "CalDAV-Timezones", - "Cancel-Key", - "Cancel-Lock", - "Cc", - "Close", - "Comments", - "Compliance", - "Connection", - "Content-Alternative", - "Content-Base", - "Content-Description", - "Content-Disposition", - "Content-Duration", - "Content-Encoding", - "Content-features", - "Content-ID", - "Content-Identifier", - "Content-Language", - "Content-Length", - "Content-Location", - "Content-MD5", - "Content-Range", - "Content-Return", - "Content-Script-Type", - "Content-Style-Type", - "Content-Transfer-Encoding", - "Content-Type", - "Content-Version", - "Control", - "Conversion", - "Conversion-With-Loss", - "Cookie", - "Cookie2", - "Cost", - "DASL", - "Date", - "Date-Received", - "DAV", - "Default-Style", - "Deferred-Delivery", - "Delivery-Date", - "Delta-Base", - "Depth", - "Derived-From", - "Destination", - "Differential-ID", - "Digest", - "Discarded-X400-IPMS-Extensions", - "Discarded-X400-MTS-Extensions", - "Disclose-Recipients", - "Disposition-Notification-Options", - "Disposition-Notification-To", - "Distribution", - "DKIM-Signature", - "DL-Expansion-History", - "Downgraded-Bcc", - "Downgraded-Cc", - "Downgraded-Disposition-Notification-To", - "Downgraded-Final-Recipient", - "Downgraded-From", - "Downgraded-In-Reply-To", - "Downgraded-Mail-From", - "Downgraded-Message-Id", - "Downgraded-Original-Recipient", - "Downgraded-Rcpt-To", - "Downgraded-References", - "Downgraded-Reply-To", - "Downgraded-Resent-Bcc", - "Downgraded-Resent-Cc", - "Downgraded-Resent-From", - "Downgraded-Resent-Reply-To", - "Downgraded-Resent-Sender", - "Downgraded-Resent-To", - "Downgraded-Return-Path", - "Downgraded-Sender", - "Downgraded-To", - "EDIINT-Features", - "Eesst-Version", - "Encoding", - "Encrypted", - "Errors-To", - "ETag", - "Expect", - "Expires", - "Expiry-Date", - "Ext", - "Followup-To", - "Forwarded", - "From", - "Generate-Delivery-Report", - "GetProfile", - "Hobareg", - "Host", - "HTTP2-Settings", - "If", - "If-Match", - "If-Modified-Since", - "If-None-Match", - "If-Range", - "If-Schedule-Tag-Match", - "If-Unmodified-Since", - "IM", - "Importance", - "In-Reply-To", - "Incomplete-Copy", - "Injection-Date", - "Injection-Info", - "Jabber-ID", - "Keep-Alive", - "Keywords", - "Label", - "Language", - "Last-Modified", - "Latest-Delivery-Time", - "Lines", - "Link", - "List-Archive", - "List-Help", - "List-ID", - "List-Owner", - "List-Post", - "List-Subscribe", - "List-Unsubscribe", - "List-Unsubscribe-Post", - "Location", - "Lock-Token", - "Man", - "Max-Forwards", - "Memento-Datetime", - "Message-Context", - "Message-ID", - "Message-Type", - "Meter", - "Method-Check", - "Method-Check-Expires", - "MIME-Version", - "MMHS-Acp127-Message-Identifier", - "MMHS-Authorizing-Users", - "MMHS-Codress-Message-Indicator", - "MMHS-Copy-Precedence", - "MMHS-Exempted-Address", - "MMHS-Extended-Authorisation-Info", - "MMHS-Handling-Instructions", - "MMHS-Message-Instructions", - "MMHS-Message-Type", - "MMHS-Originator-PLAD", - "MMHS-Originator-Reference", - "MMHS-Other-Recipients-Indicator-CC", - "MMHS-Other-Recipients-Indicator-To", - "MMHS-Primary-Precedence", - "MMHS-Subject-Indicator-Codes", - "MT-Priority", - "Negotiate", - "Newsgroups", - "NNTP-Posting-Date", - "NNTP-Posting-Host", - "Non-Compliance", - "Obsoletes", - "Opt", - "Optional", - "Optional-WWW-Authenticate", - "Ordering-Type", - "Organization", - "Origin", - "Original-Encoded-Information-Types", - "Original-From", - "Original-Message-ID", - "Original-Recipient", - "Original-Sender", - "Original-Subject", - "Originator-Return-Address", - "Overwrite", - "P3P", - "Path", - "PEP", - "Pep-Info", - "PICS-Label", - "Position", - "Posting-Version", - "Pragma", - "Prefer", - "Preference-Applied", - "Prevent-NonDelivery-Report", - "Priority", - "Privicon", - "ProfileObject", - "Protocol", - "Protocol-Info", - "Protocol-Query", - "Protocol-Request", - "Proxy-Authenticate", - "Proxy-Authentication-Info", - "Proxy-Authorization", - "Proxy-Connection", - "Proxy-Features", - "Proxy-Instruction", - "Public", - "Public-Key-Pins", - "Public-Key-Pins-Report-Only", - "Range", - "Received", - "Received-SPF", - "Redirect-Ref", - "References", - "Referer", - "Referer-Root", - "Relay-Version", - "Reply-By", - "Reply-To", - "Require-Recipient-Valid-Since", - "Resent-Bcc", - "Resent-Cc", - "Resent-Date", - "Resent-From", - "Resent-Message-ID", - "Resent-Reply-To", - "Resent-Sender", - "Resent-To", - "Resolution-Hint", - "Resolver-Location", - "Retry-After", - "Return-Path", - "Safe", - "Schedule-Reply", - "Schedule-Tag", - "Sec-WebSocket-Accept", - "Sec-WebSocket-Extensions", - "Sec-WebSocket-Key", - "Sec-WebSocket-Protocol", - "Sec-WebSocket-Version", - "Security-Scheme", - "See-Also", - "Sender", - "Sensitivity", - "Server", - "Set-Cookie", - "Set-Cookie2", - "SetProfile", - "SIO-Label", - "SIO-Label-History", - "SLUG", - "SoapAction", - "Solicitation", - "Status-URI", - "Strict-Transport-Security", - "Subject", - "SubOK", - "Subst", - "Summary", - "Supersedes", - "Surrogate-Capability", - "Surrogate-Control", - "TCN", - "TE", - "Timeout", - "Title", - "To", - "Topic", - "Trailer", - "Transfer-Encoding", - "TTL", - "UA-Color", - "UA-Media", - "UA-Pixels", - "UA-Resolution", - "UA-Windowpixels", - "Upgrade", - "Urgency", - "URI", - "User-Agent", - "Variant-Vary", - "Vary", - "VBR-Info", - "Version", - "Via", - "Want-Digest", - "Warning", - "WWW-Authenticate", - "X-Archived-At", - "X-Device-Accept", - "X-Device-Accept-Charset", - "X-Device-Accept-Encoding", - "X-Device-Accept-Language", - "X-Device-User-Agent", - "X-Frame-Options", - "X-Mittente", - "X-PGP-Sig", - "X-Ricevuta", - "X-Riferimento-Message-ID", - "X-TipoRicevuta", - "X-Trasporto", - "X-VerificaSicurezza", - "X400-Content-Identifier", - "X400-Content-Return", - "X400-Content-Type", - "X400-MTS-Identifier", - "X400-Originator", - "X400-Received", - "X400-Recipients", - "X400-Trace", - "Xref" - }}) - { - // find the longest field length - std::size_t high = 0; - for(auto const& s : by_name_) - if(high < s.size()) - high = s.size(); - // build by_size map - // skip field::unknown - by_size_.resize(high + 1); - for(auto& map : by_size_) - map.max_load_factor(.15f); - for(std::size_t i = 1; - i < by_name_.size(); ++i) - { - auto const& s = by_name_[i]; - by_size_[s.size()].emplace( - s, static_cast<field>(i)); - } - -#if 0 - // This snippet calculates the performance - // of the hash function and map settings - { - std::vector<std::size_t> hist; - for(auto const& map : by_size_) - { - for(std::size_t i = 0; i < map.bucket_count(); ++i) - { - auto const n = map.bucket_size(i); - if(n > 0) - { - if(hist.size() < n) - hist.resize(n); - ++hist[n-1]; - } - } - } - } -#endif - } - - field - string_to_field(string_view s) const - { - if(s.size() >= by_size_.size()) - return field::unknown; - auto const& map = by_size_[s.size()]; - if(map.empty()) - return field::unknown; - auto it = map.find(s); - if(it == map.end()) - return field::unknown; - return it->second; - } - - // - // Deprecated - // - - using const_iterator = - array_type::const_iterator; - - std::size_t - size() const - { - return by_name_.size(); - } - - const_iterator - begin() const - { - return by_name_.begin(); - } - - const_iterator - end() const - { - return by_name_.end(); - } -}; - -inline -field_table const& -get_field_table() -{ - static field_table const tab; - return tab; -} - -template<class = void> -string_view -to_string(field f) -{ - auto const& v = get_field_table(); - BOOST_ASSERT(static_cast<unsigned>(f) < v.size()); - return v.begin()[static_cast<unsigned>(f)]; -} - -} // detail - -inline -string_view -to_string(field f) -{ - return detail::to_string(f); -} - -inline -field -string_to_field(string_view s) -{ - return detail::get_field_table().string_to_field(s); -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/fields.ipp b/contrib/restricted/boost/boost/beast/http/impl/fields.ipp deleted file mode 100644 index 24e3012e3a..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/fields.ipp +++ /dev/null @@ -1,1393 +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_HTTP_IMPL_FIELDS_IPP -#define BOOST_BEAST_HTTP_IMPL_FIELDS_IPP - -#include <boost/beast/core/buffers_cat.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/static_string.hpp> -#include <boost/beast/core/detail/buffers_ref.hpp> -#include <boost/beast/http/verb.hpp> -#include <boost/beast/http/rfc7230.hpp> -#include <boost/beast/http/status.hpp> -#include <boost/beast/http/chunk_encode.hpp> -#include <boost/throw_exception.hpp> -#include <stdexcept> -#include <string> - -#if defined(BOOST_LIBSTDCXX_VERSION) && BOOST_LIBSTDCXX_VERSION < 60000 - // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56437 -#ifndef BOOST_BEAST_HTTP_NO_FIELDS_BASIC_STRING_ALLOCATOR -#define BOOST_BEAST_HTTP_NO_FIELDS_BASIC_STRING_ALLOCATOR -#endif -#endif - -namespace boost { -namespace beast { -namespace http { - -template<class Allocator> -class basic_fields<Allocator>::writer -{ -public: - using iter_type = typename list_t::const_iterator; - - struct field_iterator - { - iter_type it_; - - using value_type = boost::asio::const_buffer; - using pointer = value_type const*; - using reference = value_type const; - using difference_type = std::ptrdiff_t; - using iterator_category = - std::bidirectional_iterator_tag; - - field_iterator() = default; - field_iterator(field_iterator&& other) = default; - field_iterator(field_iterator const& other) = default; - field_iterator& operator=(field_iterator&& other) = default; - field_iterator& operator=(field_iterator const& other) = default; - - explicit - field_iterator(iter_type it) - : it_(it) - { - } - - bool - operator==(field_iterator const& other) const - { - return it_ == other.it_; - } - - bool - operator!=(field_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - return it_->buffer(); - } - - field_iterator& - operator++() - { - ++it_; - return *this; - } - - field_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - - field_iterator& - operator--() - { - --it_; - return *this; - } - - field_iterator - operator--(int) - { - auto temp = *this; - --(*this); - return temp; - } - }; - - class field_range - { - field_iterator first_; - field_iterator last_; - - public: - using const_iterator = - field_iterator; - - using value_type = - typename const_iterator::value_type; - - field_range(iter_type first, iter_type last) - : first_(first) - , last_(last) - { - } - - const_iterator - begin() const - { - return first_; - } - - const_iterator - end() const - { - return last_; - } - }; - - using view_type = buffers_cat_view< - boost::asio::const_buffer, - boost::asio::const_buffer, - boost::asio::const_buffer, - field_range, - chunk_crlf>; - - basic_fields const& f_; - boost::optional<view_type> view_; - char buf_[13]; - -public: - using const_buffers_type = - beast::detail::buffers_ref<view_type>; - - writer(basic_fields const& f, - unsigned version, verb v); - - writer(basic_fields const& f, - unsigned version, unsigned code); - - writer(basic_fields const& f); - - const_buffers_type - get() const - { - return const_buffers_type(*view_); - } -}; - -template<class Allocator> -basic_fields<Allocator>::writer:: -writer(basic_fields const& f) - : f_(f) -{ - view_.emplace( - boost::asio::const_buffer{nullptr, 0}, - boost::asio::const_buffer{nullptr, 0}, - boost::asio::const_buffer{nullptr, 0}, - field_range(f_.list_.begin(), f_.list_.end()), - chunk_crlf()); -} - -template<class Allocator> -basic_fields<Allocator>::writer:: -writer(basic_fields const& f, - unsigned version, verb v) - : f_(f) -{ -/* - request - "<method>" - " <target>" - " HTTP/X.Y\r\n" (11 chars) -*/ - string_view sv; - if(v == verb::unknown) - sv = f_.get_method_impl(); - else - sv = to_string(v); - - // target_or_reason_ has a leading SP - - buf_[0] = ' '; - buf_[1] = 'H'; - buf_[2] = 'T'; - buf_[3] = 'T'; - buf_[4] = 'P'; - buf_[5] = '/'; - buf_[6] = '0' + static_cast<char>(version / 10); - buf_[7] = '.'; - buf_[8] = '0' + static_cast<char>(version % 10); - buf_[9] = '\r'; - buf_[10]= '\n'; - - view_.emplace( - boost::asio::const_buffer{sv.data(), sv.size()}, - boost::asio::const_buffer{ - f_.target_or_reason_.data(), - f_.target_or_reason_.size()}, - boost::asio::const_buffer{buf_, 11}, - field_range(f_.list_.begin(), f_.list_.end()), - chunk_crlf()); -} - -template<class Allocator> -basic_fields<Allocator>::writer:: -writer(basic_fields const& f, - unsigned version, unsigned code) - : f_(f) -{ -/* - response - "HTTP/X.Y ### " (13 chars) - "<reason>" - "\r\n" -*/ - buf_[0] = 'H'; - buf_[1] = 'T'; - buf_[2] = 'T'; - buf_[3] = 'P'; - buf_[4] = '/'; - buf_[5] = '0' + static_cast<char>(version / 10); - buf_[6] = '.'; - buf_[7] = '0' + static_cast<char>(version % 10); - buf_[8] = ' '; - buf_[9] = '0' + static_cast<char>(code / 100); - buf_[10]= '0' + static_cast<char>((code / 10) % 10); - buf_[11]= '0' + static_cast<char>(code % 10); - buf_[12]= ' '; - - string_view sv; - if(! f_.target_or_reason_.empty()) - sv = f_.target_or_reason_; - else - sv = obsolete_reason(static_cast<status>(code)); - - view_.emplace( - boost::asio::const_buffer{buf_, 13}, - boost::asio::const_buffer{sv.data(), sv.size()}, - boost::asio::const_buffer{"\r\n", 2}, - field_range(f_.list_.begin(), f_.list_.end()), - chunk_crlf{}); -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -basic_fields<Allocator>:: -value_type:: -value_type( - field name, - string_view sname, - string_view value) - : off_(static_cast<off_t>(sname.size() + 2)) - , len_(static_cast<off_t>(value.size())) - , f_(name) -{ - //BOOST_ASSERT(name == field::unknown || - // iequals(sname, to_string(name))); - char* p = reinterpret_cast<char*>(this + 1); - p[off_-2] = ':'; - p[off_-1] = ' '; - p[off_ + len_] = '\r'; - p[off_ + len_ + 1] = '\n'; - sname.copy(p, sname.size()); - value.copy(p + off_, value.size()); -} - -template<class Allocator> -inline -field -basic_fields<Allocator>:: -value_type:: -name() const -{ - return f_; -} - -template<class Allocator> -inline -string_view -basic_fields<Allocator>:: -value_type:: -name_string() const -{ - return {reinterpret_cast< - char const*>(this + 1), - static_cast<std::size_t>(off_ - 2)}; -} - -template<class Allocator> -inline -string_view -basic_fields<Allocator>:: -value_type:: -value() const -{ - return {reinterpret_cast< - char const*>(this + 1) + off_, - static_cast<std::size_t>(len_)}; -} - -template<class Allocator> -inline -boost::asio::const_buffer -basic_fields<Allocator>:: -value_type:: -buffer() const -{ - return boost::asio::const_buffer{ - reinterpret_cast<char const*>(this + 1), - static_cast<std::size_t>(off_) + len_ + 2}; -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -basic_fields<Allocator>:: -~basic_fields() -{ - delete_list(); - realloc_string(method_, {}); - realloc_string( - target_or_reason_, {}); -} - -template<class Allocator> -basic_fields<Allocator>:: -basic_fields(Allocator const& alloc) noexcept - : beast::detail::empty_base_optimization<Allocator>(alloc) -{ -} - -template<class Allocator> -basic_fields<Allocator>:: -basic_fields(basic_fields&& other) noexcept - : beast::detail::empty_base_optimization<Allocator>( - std::move(other.member())) - , set_(std::move(other.set_)) - , list_(std::move(other.list_)) - , method_(other.method_) - , target_or_reason_(other.target_or_reason_) -{ - other.method_ = {}; - other.target_or_reason_ = {}; -} - -template<class Allocator> -basic_fields<Allocator>:: -basic_fields(basic_fields&& other, Allocator const& alloc) - : beast::detail::empty_base_optimization<Allocator>(alloc) -{ - if(this->member() != other.member()) - { - copy_all(other); - other.clear_all(); - } - else - { - set_ = std::move(other.set_); - list_ = std::move(other.list_); - method_ = other.method_; - target_or_reason_ = other.target_or_reason_; - } -} - -template<class Allocator> -basic_fields<Allocator>:: -basic_fields(basic_fields const& other) - : beast::detail::empty_base_optimization<Allocator>(alloc_traits:: - select_on_container_copy_construction(other.member())) -{ - copy_all(other); -} - -template<class Allocator> -basic_fields<Allocator>:: -basic_fields(basic_fields const& other, - Allocator const& alloc) - : beast::detail::empty_base_optimization<Allocator>(alloc) -{ - copy_all(other); -} - -template<class Allocator> -template<class OtherAlloc> -basic_fields<Allocator>:: -basic_fields(basic_fields<OtherAlloc> const& other) -{ - copy_all(other); -} - -template<class Allocator> -template<class OtherAlloc> -basic_fields<Allocator>:: -basic_fields(basic_fields<OtherAlloc> const& other, - Allocator const& alloc) - : beast::detail::empty_base_optimization<Allocator>(alloc) -{ - copy_all(other); -} - -template<class Allocator> -auto -basic_fields<Allocator>:: -operator=(basic_fields&& other) noexcept( - alloc_traits::propagate_on_container_move_assignment::value) - -> basic_fields& -{ - static_assert(is_nothrow_move_assignable<Allocator>::value, - "Allocator must be noexcept assignable."); - if(this == &other) - return *this; - move_assign(other, std::integral_constant<bool, - alloc_traits:: propagate_on_container_move_assignment::value>{}); - return *this; -} - -template<class Allocator> -auto -basic_fields<Allocator>:: -operator=(basic_fields const& other) -> - basic_fields& -{ - copy_assign(other, std::integral_constant<bool, - alloc_traits::propagate_on_container_copy_assignment::value>{}); - return *this; -} - -template<class Allocator> -template<class OtherAlloc> -auto -basic_fields<Allocator>:: -operator=(basic_fields<OtherAlloc> const& other) -> - basic_fields& -{ - clear_all(); - copy_all(other); - return *this; -} - -//------------------------------------------------------------------------------ -// -// Element access -// -//------------------------------------------------------------------------------ - -template<class Allocator> -string_view const -basic_fields<Allocator>:: -at(field name) const -{ - BOOST_ASSERT(name != field::unknown); - auto const it = find(name); - if(it == end()) - BOOST_THROW_EXCEPTION(std::out_of_range{ - "field not found"}); - return it->value(); -} - -template<class Allocator> -string_view const -basic_fields<Allocator>:: -at(string_view name) const -{ - auto const it = find(name); - if(it == end()) - BOOST_THROW_EXCEPTION(std::out_of_range{ - "field not found"}); - return it->value(); -} - -template<class Allocator> -string_view const -basic_fields<Allocator>:: -operator[](field name) const -{ - BOOST_ASSERT(name != field::unknown); - auto const it = find(name); - if(it == end()) - return {}; - return it->value(); -} - -template<class Allocator> -string_view const -basic_fields<Allocator>:: -operator[](string_view name) const -{ - auto const it = find(name); - if(it == end()) - return {}; - return it->value(); -} - -//------------------------------------------------------------------------------ -// -// Modifiers -// -//------------------------------------------------------------------------------ - -template<class Allocator> -void -basic_fields<Allocator>:: -clear() -{ - delete_list(); - set_.clear(); - list_.clear(); -} - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -insert(field name, string_param const& value) -{ - BOOST_ASSERT(name != field::unknown); - insert(name, to_string(name), value); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -insert(string_view sname, string_param const& value) -{ - auto const name = - string_to_field(sname); - insert(name, sname, value); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -insert(field name, - string_view sname, string_param const& value) -{ - auto& e = new_element(name, sname, - static_cast<string_view>(value)); - auto const before = - set_.upper_bound(sname, key_compare{}); - if(before == set_.begin()) - { - BOOST_ASSERT(count(sname) == 0); - set_.insert_before(before, e); - list_.push_back(e); - return; - } - auto const last = std::prev(before); - // VFALCO is it worth comparing `field name` first? - if(! iequals(sname, last->name_string())) - { - BOOST_ASSERT(count(sname) == 0); - set_.insert_before(before, e); - list_.push_back(e); - return; - } - // keep duplicate fields together in the list - set_.insert_before(before, e); - list_.insert(++list_.iterator_to(*last), e); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -set(field name, string_param const& value) -{ - BOOST_ASSERT(name != field::unknown); - set_element(new_element(name, to_string(name), - static_cast<string_view>(value))); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -set(string_view sname, string_param const& value) -{ - set_element(new_element( - string_to_field(sname), sname, - static_cast<string_view>(value))); -} - -template<class Allocator> -auto -basic_fields<Allocator>:: -erase(const_iterator pos) -> - const_iterator -{ - auto next = pos; - auto& e = *next++; - set_.erase(e); - list_.erase(pos); - delete_element(const_cast<value_type&>(e)); - return next; -} - -template<class Allocator> -std::size_t -basic_fields<Allocator>:: -erase(field name) -{ - BOOST_ASSERT(name != field::unknown); - return erase(to_string(name)); -} - -template<class Allocator> -std::size_t -basic_fields<Allocator>:: -erase(string_view name) -{ - std::size_t n =0; - set_.erase_and_dispose(name, key_compare{}, - [&](value_type* e) - { - ++n; - list_.erase(list_.iterator_to(*e)); - delete_element(*e); - }); - return n; -} - -template<class Allocator> -void -basic_fields<Allocator>:: -swap(basic_fields<Allocator>& other) -{ - swap(other, std::integral_constant<bool, - alloc_traits::propagate_on_container_swap::value>{}); -} - -template<class Allocator> -void -swap( - basic_fields<Allocator>& lhs, - basic_fields<Allocator>& rhs) -{ - lhs.swap(rhs); -} - -//------------------------------------------------------------------------------ -// -// Lookup -// -//------------------------------------------------------------------------------ - -template<class Allocator> -inline -std::size_t -basic_fields<Allocator>:: -count(field name) const -{ - BOOST_ASSERT(name != field::unknown); - return count(to_string(name)); -} - -template<class Allocator> -std::size_t -basic_fields<Allocator>:: -count(string_view name) const -{ - return set_.count(name, key_compare{}); -} - -template<class Allocator> -inline -auto -basic_fields<Allocator>:: -find(field name) const -> - const_iterator -{ - BOOST_ASSERT(name != field::unknown); - return find(to_string(name)); -} - -template<class Allocator> -auto -basic_fields<Allocator>:: -find(string_view name) const -> - const_iterator -{ - auto const it = set_.find( - name, key_compare{}); - if(it == set_.end()) - return list_.end(); - return list_.iterator_to(*it); -} - -template<class Allocator> -inline -auto -basic_fields<Allocator>:: -equal_range(field name) const -> - std::pair<const_iterator, const_iterator> -{ - BOOST_ASSERT(name != field::unknown); - return equal_range(to_string(name)); -} - -template<class Allocator> -auto -basic_fields<Allocator>:: -equal_range(string_view name) const -> - std::pair<const_iterator, const_iterator> -{ - auto result = - set_.equal_range(name, key_compare{}); - if(result.first == result.second) - return {list_.end(), list_.end()}; - return { - list_.iterator_to(*result.first), - ++list_.iterator_to(*(--result.second))}; -} - -//------------------------------------------------------------------------------ - -namespace detail { - -// Filter a token list -// -template<class String, class Pred> -void -filter_token_list( - String& s, - string_view value, - Pred&& 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->data(), it->size()); - while(++it != last) - { - if(! pred(*it)) - { - s.append(", "); - s.append(it->data(), it->size()); - } - } -} - -// Filter the last item in a token list -template<class String, class Pred> -void -filter_token_list_last( - String& s, - string_view value, - Pred&& 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->data(), it->size()); - return; - } - s.append(it->data(), it->size()); - for(;;) - { - it = next; - next = std::next(it); - if(next == te.end()) - { - if(! pred(*it)) - { - s.append(", "); - s.append(it->data(), it->size()); - } - return; - } - s.append(", "); - s.append(it->data(), it->size()); - } - } -} - -template<class String> -void -keep_alive_impl( - String& s, string_view value, - unsigned version, bool keep_alive) -{ - if(version < 11) - { - if(keep_alive) - { - // remove close - filter_token_list(s, value, - [](string_view s) - { - return iequals(s, "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, - [](string_view s) - { - return - iequals(s, "close") || - iequals(s, "keep-alive"); - }); - } - } - else - { - if(keep_alive) - { - // remove close and keep-alive - filter_token_list(s, value, - [](string_view s) - { - return - iequals(s, "close") || - iequals(s, "keep-alive"); - }); - } - else - { - // remove keep-alive - filter_token_list(s, value, - [](string_view s) - { - return iequals(s, "keep-alive"); - }); - // add close - if(s.empty()) - s.append("close"); - else if(! token_list{value}.exists("close")) - s.append(", close"); - } - } -} - -} // detail - -//------------------------------------------------------------------------------ - -// Fields - -template<class Allocator> -inline -string_view -basic_fields<Allocator>:: -get_method_impl() const -{ - return method_; -} - -template<class Allocator> -inline -string_view -basic_fields<Allocator>:: -get_target_impl() const -{ - if(target_or_reason_.empty()) - return target_or_reason_; - return { - target_or_reason_.data() + 1, - target_or_reason_.size() - 1}; -} - -template<class Allocator> -inline -string_view -basic_fields<Allocator>:: -get_reason_impl() const -{ - return target_or_reason_; -} - -template<class Allocator> -bool -basic_fields<Allocator>:: -get_chunked_impl() const -{ - auto const te = token_list{ - (*this)[field::transfer_encoding]}; - for(auto it = te.begin(); it != te.end();) - { - auto const next = std::next(it); - if(next == te.end()) - return iequals(*it, "chunked"); - it = next; - } - return false; -} - -template<class Allocator> -bool -basic_fields<Allocator>:: -get_keep_alive_impl(unsigned version) const -{ - auto const it = find(field::connection); - if(version < 11) - { - if(it == end()) - return false; - return token_list{ - it->value()}.exists("keep-alive"); - } - if(it == end()) - return true; - return ! token_list{ - it->value()}.exists("close"); -} - -template<class Allocator> -bool -basic_fields<Allocator>:: -has_content_length_impl() const -{ - return count(field::content_length) > 0; -} - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -set_method_impl(string_view s) -{ - realloc_string(method_, s); -} - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -set_target_impl(string_view s) -{ - realloc_target( - target_or_reason_, s); -} - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -set_reason_impl(string_view s) -{ - realloc_string( - target_or_reason_, s); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -set_chunked_impl(bool value) -{ - auto it = find(field::transfer_encoding); - if(value) - { - // append "chunked" - if(it == end()) - { - set(field::transfer_encoding, "chunked"); - return; - } - auto const te = token_list{it->value()}; - for(auto itt = te.begin();;) - { - auto const next = std::next(itt); - if(next == te.end()) - { - if(iequals(*itt, "chunked")) - return; // already set - break; - } - itt = next; - } - static_string<max_static_buffer> buf; - if(it->value().size() <= buf.size() + 9) - { - buf.append(it->value().data(), it->value().size()); - buf.append(", chunked", 9); - set(field::transfer_encoding, buf); - } - else - { - #ifdef BOOST_BEAST_HTTP_NO_FIELDS_BASIC_STRING_ALLOCATOR - // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56437 - std::string s; - #else - using A = - typename beast::detail::allocator_traits< - Allocator>::template rebind_alloc<char>; - std::basic_string< - char, - std::char_traits<char>, - A> s{A{this->member()}}; - #endif - s.reserve(it->value().size() + 9); - s.append(it->value().data(), it->value().size()); - s.append(", chunked", 9); - set(field::transfer_encoding, s); - } - return; - } - // filter "chunked" - if(it == end()) - return; - try - { - static_string<max_static_buffer> buf; - detail::filter_token_list_last(buf, it->value(), - [](string_view s) - { - return iequals(s, "chunked"); - }); - if(! buf.empty()) - set(field::transfer_encoding, buf); - else - erase(field::transfer_encoding); - } - catch(std::length_error const&) - { - #ifdef BOOST_BEAST_HTTP_NO_FIELDS_BASIC_STRING_ALLOCATOR - // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56437 - std::string s; - #else - using A = - typename beast::detail::allocator_traits< - Allocator>::template rebind_alloc<char>; - std::basic_string< - char, - std::char_traits<char>, - A> s{A{this->member()}}; - #endif - s.reserve(it->value().size()); - detail::filter_token_list_last(s, it->value(), - [](string_view s) - { - return iequals(s, "chunked"); - }); - if(! s.empty()) - set(field::transfer_encoding, s); - else - erase(field::transfer_encoding); - } -} - -template<class Allocator> -void -basic_fields<Allocator>:: -set_content_length_impl( - boost::optional<std::uint64_t> const& value) -{ - if(! value) - erase(field::content_length); - else - set(field::content_length, *value); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -set_keep_alive_impl( - unsigned version, bool keep_alive) -{ - // VFALCO What about Proxy-Connection ? - auto const value = (*this)[field::connection]; - try - { - static_string<max_static_buffer> buf; - detail::keep_alive_impl( - buf, value, version, keep_alive); - if(buf.empty()) - erase(field::connection); - else - set(field::connection, buf); - } - catch(std::length_error const&) - { - #ifdef BOOST_BEAST_HTTP_NO_FIELDS_BASIC_STRING_ALLOCATOR - // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56437 - std::string s; - #else - using A = - typename beast::detail::allocator_traits< - Allocator>::template rebind_alloc<char>; - std::basic_string< - char, - std::char_traits<char>, - A> s{A{this->member()}}; - #endif - s.reserve(value.size()); - detail::keep_alive_impl( - s, value, version, keep_alive); - if(s.empty()) - erase(field::connection); - else - set(field::connection, s); - } -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -auto -basic_fields<Allocator>:: -new_element(field name, - string_view sname, string_view value) -> - value_type& -{ - if(sname.size() + 2 > - (std::numeric_limits<off_t>::max)()) - BOOST_THROW_EXCEPTION(std::length_error{ - "field name too large"}); - if(value.size() + 2 > - (std::numeric_limits<off_t>::max)()) - BOOST_THROW_EXCEPTION(std::length_error{ - "field value too large"}); - value = detail::trim(value); - std::uint16_t const off = - static_cast<off_t>(sname.size() + 2); - std::uint16_t const len = - static_cast<off_t>(value.size()); - auto a = rebind_type{this->member()}; - auto const p = alloc_traits::allocate(a, - (sizeof(value_type) + off + len + 2 + sizeof(align_type) - 1) / - sizeof(align_type)); - // VFALCO allocator can't call the constructor because its private - //alloc_traits::construct(a, p, name, sname, value); - new(p) value_type{name, sname, value}; - return *reinterpret_cast<value_type*>(p); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -delete_element(value_type& e) -{ - auto a = rebind_type{this->member()}; - auto const n = - (sizeof(value_type) + e.off_ + e.len_ + 2 + sizeof(align_type) - 1) / - sizeof(align_type); - //alloc_traits::destroy(a, &e); - e.~value_type(); - alloc_traits::deallocate(a, - reinterpret_cast<align_type*>(&e), n); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -set_element(value_type& e) -{ - auto it = set_.lower_bound( - e.name_string(), key_compare{}); - if(it == set_.end() || ! iequals( - e.name_string(), it->name_string())) - { - set_.insert_before(it, e); - list_.push_back(e); - return; - } - for(;;) - { - auto next = it; - ++next; - set_.erase(it); - list_.erase(list_.iterator_to(*it)); - delete_element(*it); - it = next; - if(it == set_.end() || - ! iequals(e.name_string(), it->name_string())) - break; - } - set_.insert_before(it, e); - list_.push_back(e); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -realloc_string(string_view& dest, string_view s) -{ - if(dest.empty() && s.empty()) - return; - auto a = typename beast::detail::allocator_traits< - Allocator>::template rebind_alloc< - char>(this->member()); - char* p = nullptr; - if(! s.empty()) - { - p = a.allocate(s.size()); - s.copy(p, s.size()); - } - if(! dest.empty()) - a.deallocate(const_cast<char*>( - dest.data()), dest.size()); - if(p) - dest = {p, s.size()}; - else - dest = {}; -} - -template<class Allocator> -void -basic_fields<Allocator>:: -realloc_target( - string_view& dest, string_view s) -{ - // The target string are stored with an - // extra space at the beginning to help - // the writer class. - if(dest.empty() && s.empty()) - return; - auto a = typename beast::detail::allocator_traits< - Allocator>::template rebind_alloc< - char>(this->member()); - char* p = nullptr; - if(! s.empty()) - { - p = a.allocate(1 + s.size()); - p[0] = ' '; - s.copy(p + 1, s.size()); - } - if(! dest.empty()) - a.deallocate(const_cast<char*>( - dest.data()), dest.size()); - if(p) - dest = {p, 1 + s.size()}; - else - dest = {}; -} - -template<class Allocator> -template<class OtherAlloc> -void -basic_fields<Allocator>:: -copy_all(basic_fields<OtherAlloc> const& other) -{ - for(auto const& e : other.list_) - insert(e.name(), e.name_string(), e.value()); - realloc_string(method_, other.method_); - realloc_string(target_or_reason_, - other.target_or_reason_); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -clear_all() -{ - clear(); - realloc_string(method_, {}); - realloc_string(target_or_reason_, {}); -} - -template<class Allocator> -void -basic_fields<Allocator>:: -delete_list() -{ - for(auto it = list_.begin(); it != list_.end();) - delete_element(*it++); -} - -//------------------------------------------------------------------------------ - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -move_assign(basic_fields& other, std::true_type) -{ - clear_all(); - set_ = std::move(other.set_); - list_ = std::move(other.list_); - method_ = other.method_; - target_or_reason_ = other.target_or_reason_; - other.method_ = {}; - other.target_or_reason_ = {}; - this->member() = other.member(); -} - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -move_assign(basic_fields& other, std::false_type) -{ - clear_all(); - if(this->member() != other.member()) - { - copy_all(other); - other.clear_all(); - } - else - { - set_ = std::move(other.set_); - list_ = std::move(other.list_); - method_ = other.method_; - target_or_reason_ = other.target_or_reason_; - other.method_ = {}; - other.target_or_reason_ = {}; - } -} - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -copy_assign(basic_fields const& other, std::true_type) -{ - clear_all(); - this->member() = other.member(); - copy_all(other); -} - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -copy_assign(basic_fields const& other, std::false_type) -{ - clear_all(); - copy_all(other); -} - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -swap(basic_fields& other, std::true_type) -{ - using std::swap; - swap(this->member(), other.member()); - swap(set_, other.set_); - swap(list_, other.list_); - swap(method_, other.method_); - swap(target_or_reason_, other.target_or_reason_); -} - -template<class Allocator> -inline -void -basic_fields<Allocator>:: -swap(basic_fields& other, std::false_type) -{ - BOOST_ASSERT(this->member() == other.member()); - using std::swap; - swap(set_, other.set_); - swap(list_, other.list_); - swap(method_, other.method_); - swap(target_or_reason_, other.target_or_reason_); -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/file_body_win32.ipp b/contrib/restricted/boost/boost/beast/http/impl/file_body_win32.ipp deleted file mode 100644 index 627401f531..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/file_body_win32.ipp +++ /dev/null @@ -1,595 +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_HTTP_IMPL_FILE_BODY_WIN32_IPP -#define BOOST_BEAST_HTTP_IMPL_FILE_BODY_WIN32_IPP - -#if BOOST_BEAST_USE_WIN32_FILE - -#include <boost/beast/core/bind_handler.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/clamp.hpp> -#include <boost/beast/http/serializer.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/async_result.hpp> -#include <boost/asio/basic_stream_socket.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/asio/windows/overlapped_ptr.hpp> -#include <boost/make_unique.hpp> -#include <boost/smart_ptr/make_shared_array.hpp> -#include <boost/winapi/basic_types.hpp> -#include <boost/winapi/get_last_error.hpp> -#include <algorithm> -#include <cstring> - -namespace boost { -namespace beast { -namespace http { - -namespace detail { -template<class, class, bool, class> -class write_some_win32_op; -} // detail - -template<> -struct basic_file_body<file_win32> -{ - using file_type = file_win32; - - class writer; - class reader; - - //-------------------------------------------------------------------------- - - class value_type - { - friend class writer; - friend class reader; - friend struct basic_file_body<file_win32>; - - template<class, class, bool, class> - friend class detail::write_some_win32_op; - template< - class Protocol, bool isRequest, class Fields> - friend - std::size_t - write_some( - boost::asio::basic_stream_socket<Protocol>& sock, - serializer<isRequest, - basic_file_body<file_win32>, Fields>& sr, - error_code& ec); - - file_win32 file_; - std::uint64_t size_ = 0; // cached file size - std::uint64_t first_; // starting offset of the range - std::uint64_t last_; // ending offset of the range - - public: - ~value_type() = default; - value_type() = default; - value_type(value_type&& other) = default; - value_type& operator=(value_type&& other) = default; - - bool - is_open() const - { - return file_.is_open(); - } - - std::uint64_t - size() const - { - return size_; - } - - void - close(); - - void - open(char const* path, file_mode mode, error_code& ec); - - void - reset(file_win32&& file, error_code& ec); - }; - - //-------------------------------------------------------------------------- - - class writer - { - template<class, class, bool, class> - friend class detail::write_some_win32_op; - template< - class Protocol, bool isRequest, class Fields> - friend - std::size_t - write_some( - boost::asio::basic_stream_socket<Protocol>& sock, - serializer<isRequest, - basic_file_body<file_win32>, Fields>& sr, - error_code& ec); - - value_type& body_; // The body we are reading from - std::uint64_t pos_; // The current position in the file - char buf_[4096]; // Small buffer for reading - - public: - using const_buffers_type = - boost::asio::const_buffer; - - template<bool isRequest, class Fields> - writer(header<isRequest, Fields>&, value_type& b) - : body_(b) - { - } - - void - init(error_code&) - { - BOOST_ASSERT(body_.file_.is_open()); - pos_ = body_.first_; - } - - boost::optional<std::pair<const_buffers_type, bool>> - get(error_code& ec) - { - std::size_t const n = (std::min)(sizeof(buf_), - beast::detail::clamp(body_.last_ - pos_)); - if(n == 0) - { - ec.assign(0, ec.category()); - return boost::none; - } - auto const nread = body_.file_.read(buf_, n, ec); - if(ec) - return boost::none; - BOOST_ASSERT(nread != 0); - pos_ += nread; - ec.assign(0, ec.category()); - return {{ - {buf_, nread}, // buffer to return. - pos_ < body_.last_}}; // `true` if there are more buffers. - } - }; - - //-------------------------------------------------------------------------- - - class reader - { - value_type& body_; - - public: - template<bool isRequest, class Fields> - explicit - reader(header<isRequest, Fields>&, value_type& b) - : body_(b) - { - } - - void - init(boost::optional< - std::uint64_t> const& content_length, - error_code& ec) - { - // VFALCO We could reserve space in the file - boost::ignore_unused(content_length); - BOOST_ASSERT(body_.file_.is_open()); - ec.assign(0, ec.category()); - } - - template<class ConstBufferSequence> - std::size_t - put(ConstBufferSequence const& buffers, - error_code& ec) - { - std::size_t nwritten = 0; - for(auto buffer : beast::detail::buffers_range(buffers)) - { - nwritten += body_.file_.write( - buffer.data(), buffer.size(), ec); - if(ec) - return nwritten; - } - ec.assign(0, ec.category()); - return nwritten; - } - - void - finish(error_code& ec) - { - ec.assign(0, ec.category()); - } - }; - - //-------------------------------------------------------------------------- - - static - std::uint64_t - size(value_type const& body) - { - return body.size(); - } -}; - -//------------------------------------------------------------------------------ - -inline -void -basic_file_body<file_win32>:: -value_type:: -close() -{ - error_code ignored; - file_.close(ignored); -} - -inline -void -basic_file_body<file_win32>:: -value_type:: -open(char const* path, file_mode mode, error_code& ec) -{ - file_.open(path, mode, ec); - if(ec) - return; - size_ = file_.size(ec); - if(ec) - { - close(); - return; - } - first_ = 0; - last_ = size_; -} - -inline -void -basic_file_body<file_win32>:: -value_type:: -reset(file_win32&& file, error_code& ec) -{ - if(file_.is_open()) - { - error_code ignored; - file_.close(ignored); - } - file_ = std::move(file); - if(file_.is_open()) - { - size_ = file_.size(ec); - if(ec) - { - close(); - return; - } - first_ = 0; - last_ = size_; - } -} - -//------------------------------------------------------------------------------ - -namespace detail { - -template<class Unsigned> -inline -boost::winapi::DWORD_ -lowPart(Unsigned n) -{ - return static_cast< - boost::winapi::DWORD_>( - n & 0xffffffff); -} - -template<class Unsigned> -inline -boost::winapi::DWORD_ -highPart(Unsigned n, std::true_type) -{ - return static_cast< - boost::winapi::DWORD_>( - (n>>32)&0xffffffff); -} - -template<class Unsigned> -inline -boost::winapi::DWORD_ -highPart(Unsigned, std::false_type) -{ - return 0; -} - -template<class Unsigned> -inline -boost::winapi::DWORD_ -highPart(Unsigned n) -{ - return highPart(n, std::integral_constant< - bool, (sizeof(Unsigned)>4)>{}); -} - -class null_lambda -{ -public: - template<class ConstBufferSequence> - void - operator()(error_code&, - ConstBufferSequence const&) const - { - BOOST_ASSERT(false); - } -}; - -//------------------------------------------------------------------------------ - -#if BOOST_ASIO_HAS_WINDOWS_OVERLAPPED_PTR - -template< - class Protocol, class Handler, - bool isRequest, class Fields> -class write_some_win32_op -{ - boost::asio::basic_stream_socket<Protocol>& sock_; - serializer<isRequest, - basic_file_body<file_win32>, Fields>& sr_; - std::size_t bytes_transferred_ = 0; - Handler h_; - bool header_ = false; - -public: - write_some_win32_op(write_some_win32_op&&) = default; - write_some_win32_op(write_some_win32_op const&) = delete; - - template<class DeducedHandler> - write_some_win32_op( - DeducedHandler&& h, - boost::asio::basic_stream_socket<Protocol>& s, - serializer<isRequest, - basic_file_body<file_win32>,Fields>& sr) - : sock_(s) - , sr_(sr) - , 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< - boost::asio::basic_stream_socket<Protocol>&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, sock_.get_executor()); - } - - void - operator()(); - - void - operator()( - error_code ec, - std::size_t bytes_transferred = 0); - - friend - bool asio_handler_is_continuation(write_some_win32_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_some_win32_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->h_)); - } -}; - -template< - class Protocol, class Handler, - bool isRequest, class Fields> -void -write_some_win32_op< - Protocol, Handler, isRequest, Fields>:: -operator()() -{ - if(! sr_.is_header_done()) - { - header_ = true; - sr_.split(true); - return detail::async_write_some_impl( - sock_, sr_, std::move(*this)); - } - if(sr_.get().chunked()) - { - return detail::async_write_some_impl( - sock_, sr_, std::move(*this)); - } - auto& w = sr_.writer_impl(); - boost::winapi::DWORD_ const nNumberOfBytesToWrite = - static_cast<boost::winapi::DWORD_>( - (std::min<std::uint64_t>)( - (std::min<std::uint64_t>)(w.body_.last_ - w.pos_, sr_.limit()), - (std::numeric_limits<boost::winapi::DWORD_>::max)())); - boost::asio::windows::overlapped_ptr overlapped{ - sock_.get_executor().context(), std::move(*this)}; - // Note that we have moved *this, so we cannot access - // the handler since it is now moved-from. We can still - // access simple things like references and built-in types. - auto& ov = *overlapped.get(); - ov.Offset = lowPart(w.pos_); - ov.OffsetHigh = highPart(w.pos_); - auto const bSuccess = ::TransmitFile( - sock_.native_handle(), - sr_.get().body().file_.native_handle(), - nNumberOfBytesToWrite, - 0, - overlapped.get(), - nullptr, - 0); - auto const dwError = boost::winapi::GetLastError(); - if(! bSuccess && dwError != - boost::winapi::ERROR_IO_PENDING_) - { - // VFALCO This needs review, is 0 the right number? - // completed immediately (with error?) - overlapped.complete(error_code{static_cast<int>(dwError), - system_category()}, 0); - return; - } - overlapped.release(); -} - -template< - class Protocol, class Handler, - bool isRequest, class Fields> -void -write_some_win32_op< - Protocol, Handler, isRequest, Fields>:: -operator()( - error_code ec, std::size_t bytes_transferred) -{ - bytes_transferred_ += bytes_transferred; - if(! ec) - { - if(header_) - { - header_ = false; - return (*this)(); - } - auto& w = sr_.writer_impl(); - w.pos_ += bytes_transferred; - BOOST_ASSERT(w.pos_ <= w.body_.last_); - if(w.pos_ >= w.body_.last_) - { - sr_.next(ec, null_lambda{}); - BOOST_ASSERT(! ec); - BOOST_ASSERT(sr_.is_done()); - } - } - h_(ec, bytes_transferred_); -} - -#endif - -} // detail - -//------------------------------------------------------------------------------ - -template<class Protocol, bool isRequest, class Fields> -std::size_t -write_some( - boost::asio::basic_stream_socket<Protocol>& sock, - serializer<isRequest, - basic_file_body<file_win32>, Fields>& sr, - error_code& ec) -{ - if(! sr.is_header_done()) - { - sr.split(true); - auto const bytes_transferred = - detail::write_some_impl(sock, sr, ec); - if(ec) - return bytes_transferred; - return bytes_transferred; - } - if(sr.get().chunked()) - { - auto const bytes_transferred = - detail::write_some_impl(sock, sr, ec); - if(ec) - return bytes_transferred; - return bytes_transferred; - } - auto& w = sr.writer_impl(); - w.body_.file_.seek(w.pos_, ec); - if(ec) - return 0; - boost::winapi::DWORD_ const nNumberOfBytesToWrite = - static_cast<boost::winapi::DWORD_>( - (std::min<std::uint64_t>)( - (std::min<std::uint64_t>)(w.body_.last_ - w.pos_, sr.limit()), - (std::numeric_limits<boost::winapi::DWORD_>::max)())); - auto const bSuccess = ::TransmitFile( - sock.native_handle(), - w.body_.file_.native_handle(), - nNumberOfBytesToWrite, - 0, - nullptr, - nullptr, - 0); - if(! bSuccess) - { - ec.assign(static_cast<int>( - boost::winapi::GetLastError()), - system_category()); - return 0; - } - w.pos_ += nNumberOfBytesToWrite; - BOOST_ASSERT(w.pos_ <= w.body_.last_); - if(w.pos_ < w.body_.last_) - { - ec.assign(0, ec.category()); - } - else - { - sr.next(ec, detail::null_lambda{}); - BOOST_ASSERT(! ec); - BOOST_ASSERT(sr.is_done()); - } - return nNumberOfBytesToWrite; -} - -#if BOOST_ASIO_HAS_WINDOWS_OVERLAPPED_PTR - -template< - class Protocol, - bool isRequest, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write_some( - boost::asio::basic_stream_socket<Protocol>& sock, - serializer<isRequest, - basic_file_body<file_win32>, Fields>& sr, - WriteHandler&& handler) -{ - BOOST_BEAST_HANDLER_INIT( - WriteHandler, void(error_code, std::size_t)); - detail::write_some_win32_op< - Protocol, - BOOST_ASIO_HANDLER_TYPE(WriteHandler, - void(error_code, std::size_t)), - isRequest, Fields>{ - std::move(init.completion_handler), sock, sr}(); - return init.result.get(); -} - -#endif - -} // http -} // beast -} // boost - -#endif - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/message.ipp b/contrib/restricted/boost/boost/beast/http/impl/message.ipp deleted file mode 100644 index 64d96eb6f1..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/message.ipp +++ /dev/null @@ -1,437 +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_HTTP_IMPL_MESSAGE_IPP -#define BOOST_BEAST_HTTP_IMPL_MESSAGE_IPP - -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/assert.hpp> -#include <boost/throw_exception.hpp> -#include <stdexcept> - -namespace boost { -namespace beast { -namespace http { - -template<class Fields> -template<class Arg1, class... ArgN, class> -header<true, Fields>:: -header(Arg1&& arg1, ArgN&&... argn) - : Fields(std::forward<Arg1>(arg1), - std::forward<ArgN>(argn)...) -{ -} - -template<class Fields> -inline -verb -header<true, Fields>:: -method() const -{ - return method_; -} - -template<class Fields> -void -header<true, Fields>:: -method(verb v) -{ - if(v == verb::unknown) - BOOST_THROW_EXCEPTION( - std::invalid_argument{"unknown method"}); - method_ = v; - this->set_method_impl({}); -} - -template<class Fields> -string_view -header<true, Fields>:: -method_string() const -{ - if(method_ != verb::unknown) - return to_string(method_); - return this->get_method_impl(); -} - -template<class Fields> -void -header<true, Fields>:: -method_string(string_view s) -{ - method_ = string_to_verb(s); - if(method_ != verb::unknown) - this->set_method_impl({}); - else - this->set_method_impl(s); -} - -template<class Fields> -inline -string_view -header<true, Fields>:: -target() const -{ - return this->get_target_impl(); -} - -template<class Fields> -inline -void -header<true, Fields>:: -target(string_view s) -{ - this->set_target_impl(s); -} - -template<class Fields> -void -swap( - header<true, Fields>& h1, - header<true, Fields>& h2) -{ - using std::swap; - swap( - static_cast<Fields&>(h1), - static_cast<Fields&>(h2)); - swap(h1.version_, h2.version_); - swap(h1.method_, h2.method_); -} - -//------------------------------------------------------------------------------ - -template<class Fields> -template<class Arg1, class... ArgN, class> -header<false, Fields>:: -header(Arg1&& arg1, ArgN&&... argn) - : Fields(std::forward<Arg1>(arg1), - std::forward<ArgN>(argn)...) -{ -} - -template<class Fields> -inline -status -header<false, Fields>:: -result() const -{ - return int_to_status( - static_cast<int>(result_)); -} - -template<class Fields> -inline -void -header<false, Fields>:: -result(status v) -{ - result_ = v; -} - -template<class Fields> -inline -void -header<false, Fields>:: -result(unsigned v) -{ - if(v > 999) - BOOST_THROW_EXCEPTION( - std::invalid_argument{ - "invalid status-code"}); - result_ = static_cast<status>(v); -} - -template<class Fields> -inline -unsigned -header<false, Fields>:: -result_int() const -{ - return static_cast<unsigned>(result_); -} - -template<class Fields> -string_view -header<false, Fields>:: -reason() const -{ - auto const s = this->get_reason_impl(); - if(! s.empty()) - return s; - return obsolete_reason(result_); -} - -template<class Fields> -inline -void -header<false, Fields>:: -reason(string_view s) -{ - this->set_reason_impl(s); -} - -template<class Fields> -void -swap( - header<false, Fields>& h1, - header<false, Fields>& h2) -{ - using std::swap; - swap( - static_cast<Fields&>(h1), - static_cast<Fields&>(h2)); - swap(h1.version_, h2.version_); - swap(h1.result_, h2.result_); -} - -//------------------------------------------------------------------------------ - -template<bool isRequest, class Body, class Fields> -template<class... BodyArgs> -message<isRequest, Body, Fields>:: -message(header_type&& h, BodyArgs&&... body_args) - : header_type(std::move(h)) - , beast::detail::empty_base_optimization< - typename Body::value_type>( - std::forward<BodyArgs>(body_args)...) -{ -} - -template<bool isRequest, class Body, class Fields> -template<class... BodyArgs> -message<isRequest, Body, Fields>:: -message(header_type const& h, BodyArgs&&... body_args) - : header_type(h) - , beast::detail::empty_base_optimization< - typename Body::value_type>( - std::forward<BodyArgs>(body_args)...) -{ -} - -template<bool isRequest, class Body, class Fields> -template<class Version, class> -message<isRequest, Body, Fields>:: -message(verb method, string_view target, Version version) - : header_type(method, target, version) -{ -} - -template<bool isRequest, class Body, class Fields> -template<class Version, class BodyArg, class> -message<isRequest, Body, Fields>:: -message(verb method, string_view target, - Version version, BodyArg&& body_arg) - : header_type(method, target, version) - , beast::detail::empty_base_optimization< - typename Body::value_type>( - std::forward<BodyArg>(body_arg)) -{ -} - -template<bool isRequest, class Body, class Fields> -template<class Version, class BodyArg, class FieldsArg, class> -message<isRequest, Body, Fields>:: -message( - verb method, string_view target, Version version, - BodyArg&& body_arg, - FieldsArg&& fields_arg) - : header_type(method, target, version, - std::forward<FieldsArg>(fields_arg)) - , beast::detail::empty_base_optimization< - typename Body::value_type>( - std::forward<BodyArg>(body_arg)) -{ -} - -template<bool isRequest, class Body, class Fields> -template<class Version, class> -message<isRequest, Body, Fields>:: -message(status result, Version version) - : header_type(result, version) -{ -} - -template<bool isRequest, class Body, class Fields> -template<class Version, class BodyArg, class> -message<isRequest, Body, Fields>:: -message(status result, Version version, - BodyArg&& body_arg) - : header_type(result, version) - , beast::detail::empty_base_optimization< - typename Body::value_type>( - std::forward<BodyArg>(body_arg)) -{ -} - -template<bool isRequest, class Body, class Fields> -template<class Version, class BodyArg, class FieldsArg, class> -message<isRequest, Body, Fields>:: -message(status result, Version version, - BodyArg&& body_arg, FieldsArg&& fields_arg) - : header_type(result, version, - std::forward<FieldsArg>(fields_arg)) - , beast::detail::empty_base_optimization< - typename Body::value_type>( - std::forward<BodyArg>(body_arg)) -{ -} - -template<bool isRequest, class Body, class Fields> -message<isRequest, Body, Fields>:: -message(std::piecewise_construct_t) -{ -} - -template<bool isRequest, class Body, class Fields> -template<class... BodyArgs> -message<isRequest, Body, Fields>:: -message(std::piecewise_construct_t, - std::tuple<BodyArgs...> body_args) - : message(std::piecewise_construct, - body_args, - beast::detail::make_index_sequence< - sizeof...(BodyArgs)>{}) -{ -} - -template<bool isRequest, class Body, class Fields> -template<class... BodyArgs, class... FieldsArgs> -message<isRequest, Body, Fields>:: -message(std::piecewise_construct_t, - std::tuple<BodyArgs...> body_args, - std::tuple<FieldsArgs...> fields_args) - : message(std::piecewise_construct, - body_args, - fields_args, - beast::detail::make_index_sequence< - sizeof...(BodyArgs)>{}, - beast::detail::make_index_sequence< - sizeof...(FieldsArgs)>{}) -{ -} - -template<bool isRequest, class Body, class Fields> -void -message<isRequest, Body, Fields>:: -chunked(bool value) -{ - this->set_chunked_impl(value); - this->set_content_length_impl(boost::none); -} - -template<bool isRequest, class Body, class Fields> -void -message<isRequest, Body, Fields>:: -content_length( - boost::optional<std::uint64_t> const& value) -{ - this->set_content_length_impl(value); - this->set_chunked_impl(false); -} - -template<bool isRequest, class Body, class Fields> -boost::optional<std::uint64_t> -message<isRequest, Body, Fields>:: -payload_size() const -{ - return payload_size(detail::is_body_sized<Body>{}); -} - -template<bool isRequest, class Body, class Fields> -bool -message<isRequest, Body, Fields>:: -need_eof(std::false_type) const -{ - // VFALCO Do we need a way to let the caller say "the body is intentionally skipped"? - if( this->result() == status::no_content || - this->result() == status::not_modified || - to_status_class(this->result()) == - status_class::informational || - has_content_length() || - chunked()) - return ! keep_alive(); - return true; -} - -template<bool isRequest, class Body, class Fields> -void -message<isRequest, Body, Fields>:: -prepare_payload(std::true_type) -{ - auto const n = payload_size(); - if(this->method() == verb::trace && (! n || *n > 0)) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "invalid request body"}); - if(n) - { - if(*n > 0 || - this->method() == verb::options || - this->method() == verb::put || - this->method() == verb::post) - { - this->content_length(n); - } - else - { - this->chunked(false); - } - } - else if(this->version() == 11) - { - this->chunked(true); - } - else - { - this->chunked(false); - } -} - -template<bool isRequest, class Body, class Fields> -void -message<isRequest, Body, Fields>:: -prepare_payload(std::false_type) -{ - auto const n = payload_size(); - if( (! n || *n > 0) && ( - (status_class(this->result()) == status_class::informational || - this->result() == status::no_content || - this->result() == status::not_modified))) - { - // The response body MUST be empty for this case - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "invalid response body"}); - } - if(n) - this->content_length(n); - else if(this->version() == 11) - this->chunked(true); - else - this->chunked(false); -} - -//------------------------------------------------------------------------------ - -template<bool isRequest, class Body, class Fields> -void -swap( - message<isRequest, Body, Fields>& m1, - message<isRequest, Body, Fields>& m2) -{ - using std::swap; - swap( - static_cast<header<isRequest, Fields>&>(m1), - static_cast<header<isRequest, Fields>&>(m2)); - swap(m1.body(), m2.body()); -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/parser.ipp b/contrib/restricted/boost/boost/beast/http/impl/parser.ipp deleted file mode 100644 index 8a6cab30af..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/parser.ipp +++ /dev/null @@ -1,136 +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_HTTP_IMPL_PARSER_IPP -#define BOOST_BEAST_HTTP_IMPL_PARSER_IPP - -#include <boost/throw_exception.hpp> -#include <stdexcept> - -namespace boost { -namespace beast { -namespace http { - -template<bool isRequest, class Body, class Allocator> -parser<isRequest, Body, Allocator>:: -parser() - : parser{detail::has_deprecated_body_reader<Body>{}} -{ -} - -template<bool isRequest, class Body, class Allocator> -parser<isRequest, Body, Allocator>:: -parser(std::true_type) - : rd_(m_) -{ -#ifndef BOOST_BEAST_ALLOW_DEPRECATED - // Deprecated BodyReader Concept (v1.66) - static_assert(sizeof(Body) == 0, - BOOST_BEAST_DEPRECATION_STRING); -#endif -} - -template<bool isRequest, class Body, class Allocator> -parser<isRequest, Body, Allocator>:: -parser(std::false_type) - : rd_(m_.base(), m_.body()) -{ -} - -template<bool isRequest, class Body, class Allocator> -template<class Arg1, class... ArgN, class> -parser<isRequest, Body, Allocator>:: -parser(Arg1&& arg1, ArgN&&... argn) - : parser(std::forward<Arg1>(arg1), - detail::has_deprecated_body_reader<Body>{}, - std::forward<ArgN>(argn)...) -{ -} - -// VFALCO arg1 comes before `true_type` to make -// the signature unambiguous. -template<bool isRequest, class Body, class Allocator> -template<class Arg1, class... ArgN, class> -parser<isRequest, Body, Allocator>:: -parser(Arg1&& arg1, std::true_type, ArgN&&... argn) - : m_(std::forward<Arg1>(arg1), - std::forward<ArgN>(argn)...) - , rd_(m_) -{ - m_.clear(); -#ifndef BOOST_BEAST_ALLOW_DEPRECATED - /* Deprecated BodyWriter Concept (v1.66) */ - static_assert(sizeof(Body) == 0, - BOOST_BEAST_DEPRECATION_STRING); -#endif // BOOST_BEAST_ALLOW_DEPRECATED -} - -// VFALCO arg1 comes before `false_type` to make -// the signature unambiguous. -template<bool isRequest, class Body, class Allocator> -template<class Arg1, class... ArgN, class> -parser<isRequest, Body, Allocator>:: -parser(Arg1&& arg1, std::false_type, ArgN&&... argn) - : m_(std::forward<Arg1>(arg1), - std::forward<ArgN>(argn)...) - , rd_(m_.base(), m_.body()) -{ - m_.clear(); -} - -template<bool isRequest, class Body, class Allocator> -template<class OtherBody, class... Args, class> -parser<isRequest, Body, Allocator>:: -parser( - parser<isRequest, OtherBody, Allocator>&& other, - Args&&... args) - : parser(detail::has_deprecated_body_reader<Body>{}, - std::move(other), std::forward<Args>(args)...) -{ -} - -template<bool isRequest, class Body, class Allocator> -template<class OtherBody, class... Args, class> -parser<isRequest, Body, Allocator>:: -parser(std::true_type, - parser<isRequest, OtherBody, Allocator>&& other, - Args&&... args) - : base_type(std::move(other)) - , m_(other.release(), std::forward<Args>(args)...) - , rd_(m_) -{ - if(other.rd_inited_) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "moved-from parser has a body"}); -#ifndef BOOST_BEAST_ALLOW_DEPRECATED - // Deprecated BodyReader Concept (v1.66) - static_assert(sizeof(Body) == 0, - BOOST_BEAST_DEPRECATION_STRING); -#endif -} - -template<bool isRequest, class Body, class Allocator> -template<class OtherBody, class... Args, class> -parser<isRequest, Body, Allocator>:: -parser(std::false_type, parser<isRequest, OtherBody, Allocator>&& other, - Args&&... args) - : base_type(std::move(other)) - , m_(other.release(), std::forward<Args>(args)...) - , rd_(m_.base(), m_.body()) -{ - if(other.rd_inited_) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "moved-from parser has a body"}); -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/read.ipp b/contrib/restricted/boost/boost/beast/http/impl/read.ipp deleted file mode 100644 index 28ff0a3c44..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/read.ipp +++ /dev/null @@ -1,838 +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_HTTP_IMPL_READ_IPP_HPP -#define BOOST_BEAST_HTTP_IMPL_READ_IPP_HPP - -#include <boost/beast/http/type_traits.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/parser.hpp> -#include <boost/beast/http/read.hpp> -#include <boost/beast/core/bind_handler.hpp> -#include <boost/beast/core/handler_ptr.hpp> -#include <boost/beast/core/read_size.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/coroutine.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/asio/post.hpp> -#include <boost/assert.hpp> -#include <boost/config.hpp> -#include <boost/optional.hpp> -#include <boost/throw_exception.hpp> - -namespace boost { -namespace beast { -namespace http { - -namespace detail { - -//------------------------------------------------------------------------------ - -template<class Stream, class DynamicBuffer, - bool isRequest, class Derived, class Handler> -class read_some_op - : public boost::asio::coroutine -{ - Stream& s_; - DynamicBuffer& b_; - basic_parser<isRequest, Derived>& p_; - std::size_t bytes_transferred_ = 0; - Handler h_; - bool cont_ = false; - -public: - read_some_op(read_some_op&&) = default; - read_some_op(read_some_op const&) = delete; - - template<class DeducedHandler> - read_some_op(DeducedHandler&& h, Stream& s, - DynamicBuffer& b, basic_parser<isRequest, Derived>& p) - : s_(s) - , b_(b) - , p_(p) - , 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<Stream&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, s_.get_executor()); - } - - void - operator()( - error_code ec, - std::size_t bytes_transferred = 0, - bool cont = true); - - friend - bool asio_handler_is_continuation(read_some_op* op) - { - using boost::asio::asio_handler_is_continuation; - return op->cont_ ? true : - asio_handler_is_continuation( - std::addressof(op->h_)); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, read_some_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->h_)); - } -}; - -template<class Stream, class DynamicBuffer, - bool isRequest, class Derived, class Handler> -void -read_some_op<Stream, DynamicBuffer, - isRequest, Derived, Handler>:: -operator()( - error_code ec, - std::size_t bytes_transferred, - bool cont) -{ - cont_ = cont; - boost::optional<typename - DynamicBuffer::mutable_buffers_type> mb; - BOOST_ASIO_CORO_REENTER(*this) - { - if(b_.size() == 0) - goto do_read; - for(;;) - { - // parse - { - auto const used = p_.put(b_.data(), ec); - bytes_transferred_ += used; - b_.consume(used); - } - if(ec != http::error::need_more) - break; - - do_read: - try - { - mb.emplace(b_.prepare( - read_size_or_throw(b_, 65536))); - } - catch(std::length_error const&) - { - ec = error::buffer_overflow; - break; - } - BOOST_ASIO_CORO_YIELD - s_.async_read_some(*mb, std::move(*this)); - if(ec == boost::asio::error::eof) - { - BOOST_ASSERT(bytes_transferred == 0); - if(p_.got_some()) - { - // caller sees EOF on next read - ec.assign(0, ec.category()); - p_.put_eof(ec); - if(ec) - goto upcall; - BOOST_ASSERT(p_.is_done()); - goto upcall; - } - ec = error::end_of_stream; - break; - } - if(ec) - break; - b_.commit(bytes_transferred); - } - - upcall: - if(! cont_) - return boost::asio::post( - s_.get_executor(), - bind_handler(std::move(h_), - ec, bytes_transferred_)); - h_(ec, bytes_transferred_); - } -} - -//------------------------------------------------------------------------------ - -struct parser_is_done -{ - template<bool isRequest, class Derived> - bool - operator()(basic_parser< - isRequest, Derived> const& p) const - { - return p.is_done(); - } -}; - -struct parser_is_header_done -{ - template<bool isRequest, class Derived> - bool - operator()(basic_parser< - isRequest, Derived> const& p) const - { - return p.is_header_done(); - } -}; - -template<class Stream, class DynamicBuffer, - bool isRequest, class Derived, class Condition, - class Handler> -class read_op - : public boost::asio::coroutine -{ - Stream& s_; - DynamicBuffer& b_; - basic_parser<isRequest, Derived>& p_; - std::size_t bytes_transferred_ = 0; - Handler h_; - bool cont_ = false; - -public: - read_op(read_op&&) = default; - read_op(read_op const&) = delete; - - template<class DeducedHandler> - read_op(DeducedHandler&& h, Stream& s, - DynamicBuffer& b, basic_parser<isRequest, - Derived>& p) - : s_(s) - , b_(b) - , p_(p) - , 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<Stream&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, s_.get_executor()); - } - - void - operator()( - error_code ec, - std::size_t bytes_transferred = 0, - bool cont = true); - - friend - bool asio_handler_is_continuation(read_op* op) - { - using boost::asio::asio_handler_is_continuation; - return op->cont_ ? true : - asio_handler_is_continuation( - std::addressof(op->h_)); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, read_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->h_)); - } -}; - -template<class Stream, class DynamicBuffer, - bool isRequest, class Derived, class Condition, - class Handler> -void -read_op<Stream, DynamicBuffer, - isRequest, Derived, Condition, Handler>:: -operator()( - error_code ec, - std::size_t bytes_transferred, - bool cont) -{ - cont_ = cont; - BOOST_ASIO_CORO_REENTER(*this) - { - if(Condition{}(p_)) - { - BOOST_ASIO_CORO_YIELD - boost::asio::post(s_.get_executor(), - bind_handler(std::move(*this), ec)); - goto upcall; - } - for(;;) - { - BOOST_ASIO_CORO_YIELD - async_read_some( - s_, b_, p_, std::move(*this)); - if(ec) - goto upcall; - bytes_transferred_ += bytes_transferred; - if(Condition{}(p_)) - goto upcall; - } - upcall: - h_(ec, bytes_transferred_); - } -} - -//------------------------------------------------------------------------------ - -template<class Stream, class DynamicBuffer, - bool isRequest, class Body, class Allocator, - class Handler> -class read_msg_op - : public boost::asio::coroutine -{ - using parser_type = - parser<isRequest, Body, Allocator>; - - using message_type = - typename parser_type::value_type; - - struct data - { - Stream& s; - DynamicBuffer& b; - message_type& m; - parser_type p; - std::size_t bytes_transferred = 0; - bool cont = false; - - data(Handler const&, Stream& s_, - DynamicBuffer& b_, message_type& m_) - : s(s_) - , b(b_) - , m(m_) - , p(std::move(m)) - { - p.eager(true); - } - }; - - handler_ptr<data, Handler> d_; - -public: - read_msg_op(read_msg_op&&) = default; - read_msg_op(read_msg_op const&) = delete; - - template<class DeducedHandler, class... Args> - read_msg_op(DeducedHandler&& h, Stream& s, Args&&... args) - : d_(std::forward<DeducedHandler>(h), - s, std::forward<Args>(args)...) - { - } - - using allocator_type = - boost::asio::associated_allocator_t<Handler>; - - allocator_type - get_allocator() const noexcept - { - return (boost::asio::get_associated_allocator)(d_.handler()); - } - - using executor_type = boost::asio::associated_executor_t< - Handler, decltype(std::declval<Stream&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - d_.handler(), d_->s.get_executor()); - } - - void - operator()( - error_code ec, - std::size_t bytes_transferred = 0, - bool cont = true); - - friend - bool asio_handler_is_continuation(read_msg_op* op) - { - using boost::asio::asio_handler_is_continuation; - return op->d_->cont ? true : - asio_handler_is_continuation( - std::addressof(op->d_.handler())); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, read_msg_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->d_.handler())); - } -}; - -template<class Stream, class DynamicBuffer, - bool isRequest, class Body, class Allocator, - class Handler> -void -read_msg_op<Stream, DynamicBuffer, - isRequest, Body, Allocator, Handler>:: -operator()( - error_code ec, - std::size_t bytes_transferred, - bool cont) -{ - auto& d = *d_; - d.cont = cont; - BOOST_ASIO_CORO_REENTER(*this) - { - for(;;) - { - BOOST_ASIO_CORO_YIELD - async_read_some( - d.s, d.b, d.p, std::move(*this)); - if(ec) - goto upcall; - d.bytes_transferred += - bytes_transferred; - if(d.p.is_done()) - { - d.m = d.p.release(); - goto upcall; - } - } - upcall: - bytes_transferred = d.bytes_transferred; - d_.invoke(ec, bytes_transferred); - } -} - -} // detail - -//------------------------------------------------------------------------------ - -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read_some( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser) -{ - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - BOOST_ASSERT(! parser.is_done()); - error_code ec; - auto const bytes_transferred = - read_some(stream, buffer, parser, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read_some( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - error_code& ec) -{ - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - BOOST_ASSERT(! parser.is_done()); - std::size_t bytes_transferred = 0; - if(buffer.size() == 0) - goto do_read; - for(;;) - { - // invoke parser - { - auto const n = parser.put(buffer.data(), ec); - bytes_transferred += n; - buffer.consume(n); - if(! ec) - break; - if(ec != http::error::need_more) - break; - } - do_read: - boost::optional<typename - DynamicBuffer::mutable_buffers_type> b; - try - { - b.emplace(buffer.prepare( - read_size_or_throw(buffer, 65536))); - } - catch(std::length_error const&) - { - ec = error::buffer_overflow; - return bytes_transferred; - } - auto const n = stream.read_some(*b, ec); - if(ec == boost::asio::error::eof) - { - BOOST_ASSERT(n == 0); - if(parser.got_some()) - { - // caller sees EOF on next read - parser.put_eof(ec); - if(ec) - break; - BOOST_ASSERT(parser.is_done()); - break; - } - ec = error::end_of_stream; - break; - } - if(ec) - break; - buffer.commit(n); - } - return bytes_transferred; -} - -template< - class AsyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived, - class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -async_read_some( - AsyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - ReadHandler&& handler) -{ - static_assert(is_async_read_stream<AsyncReadStream>::value, - "AsyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - BOOST_ASSERT(! parser.is_done()); - BOOST_BEAST_HANDLER_INIT( - ReadHandler, void(error_code, std::size_t)); - detail::read_some_op<AsyncReadStream, - DynamicBuffer, isRequest, Derived, BOOST_ASIO_HANDLER_TYPE( - ReadHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), stream, buffer, parser}( - {}, 0, false); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read_header( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser) -{ - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - error_code ec; - auto const bytes_transferred = - read_header(stream, buffer, parser, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read_header( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - error_code& ec) -{ - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - parser.eager(false); - if(parser.is_header_done()) - { - ec.assign(0, ec.category()); - return 0; - } - std::size_t bytes_transferred = 0; - do - { - bytes_transferred += read_some( - stream, buffer, parser, ec); - if(ec) - return bytes_transferred; - } - while(! parser.is_header_done()); - return bytes_transferred; -} - -template< - class AsyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived, - class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -async_read_header( - AsyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - ReadHandler&& handler) -{ - static_assert(is_async_read_stream<AsyncReadStream>::value, - "AsyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - parser.eager(false); - BOOST_BEAST_HANDLER_INIT( - ReadHandler, void(error_code, std::size_t)); - detail::read_op<AsyncReadStream, DynamicBuffer, - isRequest, Derived, detail::parser_is_header_done, - BOOST_ASIO_HANDLER_TYPE(ReadHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), stream, - buffer, parser}({}, 0, false); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser) -{ - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - error_code ec; - auto const bytes_transferred = - read(stream, buffer, parser, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - error_code& ec) -{ - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - parser.eager(true); - if(parser.is_done()) - { - ec.assign(0, ec.category()); - return 0; - } - std::size_t bytes_transferred = 0; - do - { - bytes_transferred += read_some( - stream, buffer, parser, ec); - if(ec) - return bytes_transferred; - } - while(! parser.is_done()); - return bytes_transferred; -} - -template< - class AsyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived, - class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -async_read( - AsyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - ReadHandler&& handler) -{ - static_assert(is_async_read_stream<AsyncReadStream>::value, - "AsyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - parser.eager(true); - BOOST_BEAST_HANDLER_INIT( - ReadHandler, void(error_code, std::size_t)); - detail::read_op<AsyncReadStream, DynamicBuffer, - isRequest, Derived, detail::parser_is_done, - BOOST_ASIO_HANDLER_TYPE(ReadHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), stream, buffer, parser}( - {}, 0, false); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Body, class Allocator> -std::size_t -read( - SyncReadStream& stream, - DynamicBuffer& buffer, - message<isRequest, Body, basic_fields<Allocator>>& msg) -{ - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_reader<Body>::value, - "BodyReader requirements not met"); - error_code ec; - auto const bytes_transferred = - read(stream, buffer, msg, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Body, class Allocator> -std::size_t -read( - SyncReadStream& stream, - DynamicBuffer& buffer, - message<isRequest, Body, basic_fields<Allocator>>& msg, - error_code& ec) -{ - static_assert(is_sync_read_stream<SyncReadStream>::value, - "SyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_reader<Body>::value, - "BodyReader requirements not met"); - parser<isRequest, Body, Allocator> p{std::move(msg)}; - p.eager(true); - auto const bytes_transferred = - read(stream, buffer, p.base(), ec); - if(ec) - return bytes_transferred; - msg = p.release(); - return bytes_transferred; -} - -template< - class AsyncReadStream, - class DynamicBuffer, - bool isRequest, class Body, class Allocator, - class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -async_read( - AsyncReadStream& stream, - DynamicBuffer& buffer, - message<isRequest, Body, basic_fields<Allocator>>& msg, - ReadHandler&& handler) -{ - static_assert(is_async_read_stream<AsyncReadStream>::value, - "AsyncReadStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_reader<Body>::value, - "BodyReader requirements not met"); - BOOST_BEAST_HANDLER_INIT( - ReadHandler, void(error_code, std::size_t)); - detail::read_msg_op< - AsyncReadStream, - DynamicBuffer, - isRequest, Body, Allocator, - BOOST_ASIO_HANDLER_TYPE( - ReadHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), stream, buffer, msg}( - {}, 0, false); - return init.result.get(); -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/rfc7230.ipp b/contrib/restricted/boost/boost/beast/http/impl/rfc7230.ipp deleted file mode 100644 index 96ec902ceb..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/rfc7230.ipp +++ /dev/null @@ -1,572 +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_HTTP_IMPL_RFC7230_IPP -#define BOOST_BEAST_HTTP_IMPL_RFC7230_IPP - -#include <boost/beast/http/detail/rfc7230.hpp> -#include <iterator> - -namespace boost { -namespace beast { -namespace http { - -class param_list::const_iterator -{ - using iter_type = string_view::const_iterator; - - std::string s_; - detail::param_iter pi_; - -public: - using value_type = param_list::value_type; - using pointer = value_type const*; - using reference = value_type const&; - using difference_type = std::ptrdiff_t; - using iterator_category = std::input_iterator_tag; - - const_iterator() = default; - - bool - operator==(const_iterator const& other) const - { - return - other.pi_.it == pi_.it && - other.pi_.last == pi_.last && - other.pi_.first == pi_.first; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - return pi_.v; - } - - pointer - operator->() const - { - return &*(*this); - } - - const_iterator& - operator++() - { - increment(); - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - -private: - friend class param_list; - - const_iterator(iter_type first, iter_type last) - { - pi_.it = first; - pi_.first = first; - pi_.last = last; - increment(); - } - - template<class = void> - static - std::string - unquote(string_view sr); - - template<class = void> - void - increment(); -}; - -inline -auto -param_list:: -begin() const -> - const_iterator -{ - return const_iterator{s_.begin(), s_.end()}; -} - -inline -auto -param_list:: -end() const -> - const_iterator -{ - return const_iterator{s_.end(), s_.end()}; -} - -inline -auto -param_list:: -cbegin() const -> - const_iterator -{ - return const_iterator{s_.begin(), s_.end()}; -} - -inline -auto -param_list:: -cend() const -> - const_iterator -{ - return const_iterator{s_.end(), s_.end()}; -} - -template<class> -std::string -param_list::const_iterator:: -unquote(string_view sr) -{ - std::string s; - s.reserve(sr.size()); - auto it = sr.begin() + 1; - auto end = sr.end() - 1; - while(it != end) - { - if(*it == '\\') - ++it; - s.push_back(*it); - ++it; - } - return s; -} - -template<class> -void -param_list::const_iterator:: -increment() -{ - s_.clear(); - pi_.increment(); - if(pi_.empty()) - { - pi_.it = pi_.last; - pi_.first = pi_.last; - } - else if(! pi_.v.second.empty() && - pi_.v.second.front() == '"') - { - s_ = unquote(pi_.v.second); - pi_.v.second = string_view{ - s_.data(), s_.size()}; - } -} - -//------------------------------------------------------------------------------ - -class ext_list::const_iterator -{ - ext_list::value_type v_; - iter_type it_; - iter_type first_; - iter_type last_; - -public: - using value_type = ext_list::value_type; - using pointer = value_type const*; - using reference = value_type const&; - using difference_type = std::ptrdiff_t; - using iterator_category = std::forward_iterator_tag; - - const_iterator() = default; - - bool - operator==(const_iterator const& other) const - { - return - other.it_ == it_ && - other.first_ == first_ && - other.last_ == last_; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - return v_; - } - - pointer - operator->() const - { - return &*(*this); - } - - const_iterator& - operator++() - { - increment(); - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - -private: - friend class ext_list; - - const_iterator(iter_type begin, iter_type end) - { - it_ = begin; - first_ = begin; - last_ = end; - increment(); - } - - template<class = void> - void - increment(); -}; - -inline -auto -ext_list:: -begin() const -> - const_iterator -{ - return const_iterator{s_.begin(), s_.end()}; -} - -inline -auto -ext_list:: -end() const -> - const_iterator -{ - return const_iterator{s_.end(), s_.end()}; -} - -inline -auto -ext_list:: -cbegin() const -> - const_iterator -{ - return const_iterator{s_.begin(), s_.end()}; -} - -inline -auto -ext_list:: -cend() const -> - const_iterator -{ - return const_iterator{s_.end(), s_.end()}; -} - -template<class T> -auto -ext_list:: -find(T const& s) -> - const_iterator -{ - return std::find_if(begin(), end(), - [&s](value_type const& v) - { - return iequals(s, v.first); - }); -} - -template<class T> -bool -ext_list:: -exists(T const& s) -{ - return find(s) != end(); -} - -template<class> -void -ext_list::const_iterator:: -increment() -{ - /* - ext-list = *( "," OWS ) ext *( OWS "," [ OWS ext ] ) - ext = token param-list - param-list = *( OWS ";" OWS param ) - param = token OWS "=" OWS ( token / quoted-string ) - - chunked;a=b;i=j,gzip;windowBits=12 - x,y - ,,,,,chameleon - */ - auto const err = - [&] - { - it_ = last_; - first_ = last_; - }; - auto need_comma = it_ != first_; - v_.first = {}; - first_ = it_; - for(;;) - { - detail::skip_ows(it_, last_); - if(it_ == last_) - return err(); - auto const c = *it_; - if(detail::is_token_char(c)) - { - if(need_comma) - return err(); - auto const p0 = it_; - for(;;) - { - ++it_; - if(it_ == last_) - break; - if(! detail::is_token_char(*it_)) - break; - } - v_.first = string_view{&*p0, - static_cast<std::size_t>(it_ - p0)}; - detail::param_iter pi; - pi.it = it_; - pi.first = it_; - pi.last = last_; - for(;;) - { - pi.increment(); - if(pi.empty()) - break; - } - v_.second = param_list{string_view{&*it_, - static_cast<std::size_t>(pi.it - it_)}}; - it_ = pi.it; - return; - } - if(c != ',') - return err(); - need_comma = false; - ++it_; - } -} - -//------------------------------------------------------------------------------ - -class token_list::const_iterator -{ - token_list::value_type v_; - iter_type it_; - iter_type first_; - iter_type last_; - -public: - using value_type = token_list::value_type; - using pointer = value_type const*; - using reference = value_type const&; - using difference_type = std::ptrdiff_t; - using iterator_category = std::forward_iterator_tag; - - const_iterator() = default; - - bool - operator==(const_iterator const& other) const - { - return - other.it_ == it_ && - other.first_ == first_ && - other.last_ == last_; - } - - bool - operator!=(const_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - return v_; - } - - pointer - operator->() const - { - return &*(*this); - } - - const_iterator& - operator++() - { - increment(); - return *this; - } - - const_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - -private: - friend class token_list; - - const_iterator(iter_type begin, iter_type end) - { - it_ = begin; - first_ = begin; - last_ = end; - increment(); - } - - template<class = void> - void - increment(); -}; - -inline -auto -token_list:: -begin() const -> - const_iterator -{ - return const_iterator{s_.begin(), s_.end()}; -} - -inline -auto -token_list:: -end() const -> - const_iterator -{ - return const_iterator{s_.end(), s_.end()}; -} - -inline -auto -token_list:: -cbegin() const -> - const_iterator -{ - return const_iterator{s_.begin(), s_.end()}; -} - -inline -auto -token_list:: -cend() const -> - const_iterator -{ - return const_iterator{s_.end(), s_.end()}; -} - -template<class> -void -token_list::const_iterator:: -increment() -{ - /* - token-list = *( "," OWS ) token *( OWS "," [ OWS ext ] ) - */ - auto const err = - [&] - { - it_ = last_; - first_ = last_; - }; - auto need_comma = it_ != first_; - v_ = {}; - first_ = it_; - for(;;) - { - detail::skip_ows(it_, last_); - if(it_ == last_) - return err(); - auto const c = *it_; - if(detail::is_token_char(c)) - { - if(need_comma) - return err(); - auto const p0 = it_; - for(;;) - { - ++it_; - if(it_ == last_) - break; - if(! detail::is_token_char(*it_)) - break; - } - v_ = string_view{&*p0, - static_cast<std::size_t>(it_ - p0)}; - return; - } - if(c != ',') - return err(); - need_comma = false; - ++it_; - } -} - -template<class T> -bool -token_list:: -exists(T const& s) -{ - return std::find_if(begin(), end(), - [&s](value_type const& v) - { - return iequals(s, v); - } - ) != end(); -} - -template<class Policy> -bool -validate_list(detail::basic_parsed_list< - Policy> const& list) -{ - auto const last = list.end(); - auto it = list.begin(); - if(it.error()) - return false; - while(it != last) - { - ++it; - if(it.error()) - return false; - if(it == last) - break; - } - return true; -} - -} // http -} // beast -} // boost - -#endif - diff --git a/contrib/restricted/boost/boost/beast/http/impl/serializer.ipp b/contrib/restricted/boost/boost/beast/http/impl/serializer.ipp deleted file mode 100644 index b37856567f..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/serializer.ipp +++ /dev/null @@ -1,454 +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_HTTP_IMPL_SERIALIZER_IPP -#define BOOST_BEAST_HTTP_IMPL_SERIALIZER_IPP - -#include <boost/beast/core/detail/buffers_ref.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/status.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/assert.hpp> -#include <ostream> - -namespace boost { -namespace beast { -namespace http { - -template< - bool isRequest, class Body, class Fields> -void -serializer<isRequest, Body, Fields>:: -fwrinit(std::true_type) -{ - fwr_.emplace(m_, m_.version(), m_.method()); -} - -template< - bool isRequest, class Body, class Fields> -void -serializer<isRequest, Body, Fields>:: -fwrinit(std::false_type) -{ - fwr_.emplace(m_, m_.version(), m_.result_int()); -} - -template< - bool isRequest, class Body, class Fields> -template<std::size_t I, class Visit> -inline -void -serializer<isRequest, Body, Fields>:: -do_visit(error_code& ec, Visit& visit) -{ - pv_.template emplace<I>(limit_, v_.template get<I>()); - visit(ec, beast::detail::make_buffers_ref( - pv_.template get<I>())); -} - -//------------------------------------------------------------------------------ - -template< - bool isRequest, class Body, class Fields> -serializer<isRequest, Body, Fields>:: -serializer(value_type& m, std::true_type) - : m_(m) - , wr_(m_) -{ -#ifndef BOOST_BEAST_ALLOW_DEPRECATED - // Deprecated BodyWriter Concept (v1.66) - static_assert(sizeof(Body) == 0, - BOOST_BEAST_DEPRECATION_STRING); -#endif -} - -template< - bool isRequest, class Body, class Fields> -serializer<isRequest, Body, Fields>:: -serializer(value_type& m, std::false_type) - : m_(m) - , wr_(m_.base(), m_.body()) -{ -} - -template< - bool isRequest, class Body, class Fields> -serializer<isRequest, Body, Fields>:: -serializer(value_type& m) - : serializer(m, detail::has_deprecated_body_writer<Body>{}) -{ -} - -template< - bool isRequest, class Body, class Fields> -template<class Visit> -void -serializer<isRequest, Body, Fields>:: -next(error_code& ec, Visit&& visit) -{ - using boost::asio::buffer_size; - switch(s_) - { - case do_construct: - { - fwrinit(std::integral_constant<bool, - isRequest>{}); - if(m_.chunked()) - goto go_init_c; - s_ = do_init; - BOOST_FALLTHROUGH; - } - - case do_init: - { - wr_.init(ec); - if(ec) - return; - if(split_) - goto go_header_only; - auto result = wr_.get(ec); - if(ec == error::need_more) - goto go_header_only; - if(ec) - return; - if(! result) - goto go_header_only; - more_ = result->second; - v_.template emplace<2>( - boost::in_place_init, - fwr_->get(), - result->first); - s_ = do_header; - BOOST_FALLTHROUGH; - } - - case do_header: - do_visit<2>(ec, visit); - break; - - go_header_only: - v_.template emplace<1>(fwr_->get()); - s_ = do_header_only; - BOOST_FALLTHROUGH; - case do_header_only: - do_visit<1>(ec, visit); - break; - - case do_body: - s_ = do_body + 1; - BOOST_FALLTHROUGH; - - case do_body + 1: - { - auto result = wr_.get(ec); - if(ec) - return; - if(! result) - goto go_complete; - more_ = result->second; - v_.template emplace<3>(result->first); - s_ = do_body + 2; - BOOST_FALLTHROUGH; - } - - case do_body + 2: - do_visit<3>(ec, visit); - break; - - //---------------------------------------------------------------------- - - go_init_c: - s_ = do_init_c; - BOOST_FALLTHROUGH; - case do_init_c: - { - wr_.init(ec); - if(ec) - return; - if(split_) - goto go_header_only_c; - auto result = wr_.get(ec); - if(ec == error::need_more) - goto go_header_only_c; - if(ec) - return; - if(! result) - goto go_header_only_c; - more_ = result->second; - if(! more_) - { - // do it all in one buffer - v_.template emplace<7>( - boost::in_place_init, - fwr_->get(), - buffer_size(result->first), - boost::asio::const_buffer{nullptr, 0}, - chunk_crlf{}, - result->first, - chunk_crlf{}, - detail::chunk_last(), - boost::asio::const_buffer{nullptr, 0}, - chunk_crlf{}); - goto go_all_c; - } - v_.template emplace<4>( - boost::in_place_init, - fwr_->get(), - buffer_size(result->first), - boost::asio::const_buffer{nullptr, 0}, - chunk_crlf{}, - result->first, - chunk_crlf{}); - s_ = do_header_c; - BOOST_FALLTHROUGH; - } - - case do_header_c: - do_visit<4>(ec, visit); - break; - - go_header_only_c: - v_.template emplace<1>(fwr_->get()); - s_ = do_header_only_c; - BOOST_FALLTHROUGH; - - case do_header_only_c: - do_visit<1>(ec, visit); - break; - - case do_body_c: - s_ = do_body_c + 1; - BOOST_FALLTHROUGH; - - case do_body_c + 1: - { - auto result = wr_.get(ec); - if(ec) - return; - if(! result) - goto go_final_c; - more_ = result->second; - if(! more_) - { - // do it all in one buffer - v_.template emplace<6>( - boost::in_place_init, - buffer_size(result->first), - boost::asio::const_buffer{nullptr, 0}, - chunk_crlf{}, - result->first, - chunk_crlf{}, - detail::chunk_last(), - boost::asio::const_buffer{nullptr, 0}, - chunk_crlf{}); - goto go_body_final_c; - } - v_.template emplace<5>( - boost::in_place_init, - buffer_size(result->first), - boost::asio::const_buffer{nullptr, 0}, - chunk_crlf{}, - result->first, - chunk_crlf{}); - s_ = do_body_c + 2; - BOOST_FALLTHROUGH; - } - - case do_body_c + 2: - do_visit<5>(ec, visit); - break; - - go_body_final_c: - s_ = do_body_final_c; - BOOST_FALLTHROUGH; - case do_body_final_c: - do_visit<6>(ec, visit); - break; - - go_all_c: - s_ = do_all_c; - BOOST_FALLTHROUGH; - case do_all_c: - do_visit<7>(ec, visit); - break; - - go_final_c: - case do_final_c: - v_.template emplace<8>( - boost::in_place_init, - detail::chunk_last(), - boost::asio::const_buffer{nullptr, 0}, - chunk_crlf{}); - s_ = do_final_c + 1; - BOOST_FALLTHROUGH; - - case do_final_c + 1: - do_visit<8>(ec, visit); - break; - - //---------------------------------------------------------------------- - - default: - case do_complete: - BOOST_ASSERT(false); - break; - - go_complete: - s_ = do_complete; - break; - } -} - -template< - bool isRequest, class Body, class Fields> -void -serializer<isRequest, Body, Fields>:: -consume(std::size_t n) -{ - using boost::asio::buffer_size; - switch(s_) - { - case do_header: - BOOST_ASSERT( - n <= buffer_size(v_.template get<2>())); - v_.template get<2>().consume(n); - if(buffer_size(v_.template get<2>()) > 0) - break; - header_done_ = true; - v_.reset(); - if(! more_) - goto go_complete; - s_ = do_body + 1; - break; - - case do_header_only: - BOOST_ASSERT( - n <= buffer_size(v_.template get<1>())); - v_.template get<1>().consume(n); - if(buffer_size(v_.template get<1>()) > 0) - break; - fwr_ = boost::none; - header_done_ = true; - if(! split_) - goto go_complete; - s_ = do_body; - break; - - case do_body + 2: - { - BOOST_ASSERT( - n <= buffer_size(v_.template get<3>())); - v_.template get<3>().consume(n); - if(buffer_size(v_.template get<3>()) > 0) - break; - v_.reset(); - if(! more_) - goto go_complete; - s_ = do_body + 1; - break; - } - - //---------------------------------------------------------------------- - - case do_header_c: - BOOST_ASSERT( - n <= buffer_size(v_.template get<4>())); - v_.template get<4>().consume(n); - if(buffer_size(v_.template get<4>()) > 0) - break; - header_done_ = true; - v_.reset(); - if(more_) - s_ = do_body_c + 1; - else - s_ = do_final_c; - break; - - case do_header_only_c: - { - BOOST_ASSERT( - n <= buffer_size(v_.template get<1>())); - v_.template get<1>().consume(n); - if(buffer_size(v_.template get<1>()) > 0) - break; - fwr_ = boost::none; - header_done_ = true; - if(! split_) - { - s_ = do_final_c; - break; - } - s_ = do_body_c; - break; - } - - case do_body_c + 2: - BOOST_ASSERT( - n <= buffer_size(v_.template get<5>())); - v_.template get<5>().consume(n); - if(buffer_size(v_.template get<5>()) > 0) - break; - v_.reset(); - if(more_) - s_ = do_body_c + 1; - else - s_ = do_final_c; - break; - - case do_body_final_c: - { - BOOST_ASSERT( - n <= buffer_size(v_.template get<6>())); - v_.template get<6>().consume(n); - if(buffer_size(v_.template get<6>()) > 0) - break; - v_.reset(); - s_ = do_complete; - break; - } - - case do_all_c: - { - BOOST_ASSERT( - n <= buffer_size(v_.template get<7>())); - v_.template get<7>().consume(n); - if(buffer_size(v_.template get<7>()) > 0) - break; - header_done_ = true; - v_.reset(); - s_ = do_complete; - break; - } - - case do_final_c + 1: - BOOST_ASSERT(buffer_size(v_.template get<8>())); - v_.template get<8>().consume(n); - if(buffer_size(v_.template get<8>()) > 0) - break; - v_.reset(); - goto go_complete; - - //---------------------------------------------------------------------- - - default: - BOOST_ASSERT(false); - case do_complete: - break; - - go_complete: - s_ = do_complete; - break; - } -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/status.ipp b/contrib/restricted/boost/boost/beast/http/impl/status.ipp deleted file mode 100644 index 7d37919423..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/status.ipp +++ /dev/null @@ -1,252 +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_HTTP_IMPL_STATUS_IPP -#define BOOST_BEAST_HTTP_IMPL_STATUS_IPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/throw_exception.hpp> - -namespace boost { -namespace beast { -namespace http { -namespace detail { - -template<class = void> -status -int_to_status(unsigned v) -{ - switch(static_cast<status>(v)) - { - // 1xx - case status::continue_: - case status::switching_protocols: - case status::processing: - BOOST_FALLTHROUGH; - - // 2xx - case status::ok: - case status::created: - case status::accepted: - case status::non_authoritative_information: - case status::no_content: - case status::reset_content: - case status::partial_content: - case status::multi_status: - case status::already_reported: - case status::im_used: - BOOST_FALLTHROUGH; - - // 3xx - case status::multiple_choices: - case status::moved_permanently: - case status::found: - case status::see_other: - case status::not_modified: - case status::use_proxy: - case status::temporary_redirect: - case status::permanent_redirect: - BOOST_FALLTHROUGH; - - // 4xx - case status::bad_request: - case status::unauthorized: - case status::payment_required: - case status::forbidden: - case status::not_found: - case status::method_not_allowed: - case status::not_acceptable: - case status::proxy_authentication_required: - case status::request_timeout: - case status::conflict: - case status::gone: - case status::length_required: - case status::precondition_failed: - case status::payload_too_large: - case status::uri_too_long: - case status::unsupported_media_type: - case status::range_not_satisfiable: - case status::expectation_failed: - case status::misdirected_request: - case status::unprocessable_entity: - case status::locked: - case status::failed_dependency: - case status::upgrade_required: - case status::precondition_required: - case status::too_many_requests: - case status::request_header_fields_too_large: - case status::connection_closed_without_response: - case status::unavailable_for_legal_reasons: - case status::client_closed_request: - BOOST_FALLTHROUGH; - - // 5xx - case status::internal_server_error: - case status::not_implemented: - case status::bad_gateway: - case status::service_unavailable: - case status::gateway_timeout: - case status::http_version_not_supported: - case status::variant_also_negotiates: - case status::insufficient_storage: - case status::loop_detected: - case status::not_extended: - case status::network_authentication_required: - case status::network_connect_timeout_error: - return static_cast<status>(v); - - default: - break; - } - return status::unknown; -} - -template<class = void> -string_view -status_to_string(unsigned v) -{ - switch(static_cast<status>(v)) - { - // 1xx - case status::continue_: return "Continue"; - case status::switching_protocols: return "Switching Protocols"; - case status::processing: return "Processing"; - - // 2xx - case status::ok: return "OK"; - case status::created: return "Created"; - case status::accepted: return "Accepted"; - case status::non_authoritative_information: return "Non-Authoritative Information"; - case status::no_content: return "No Content"; - case status::reset_content: return "Reset Content"; - case status::partial_content: return "Partial Content"; - case status::multi_status: return "Multi-Status"; - case status::already_reported: return "Already Reported"; - case status::im_used: return "IM Used"; - - // 3xx - case status::multiple_choices: return "Multiple Choices"; - case status::moved_permanently: return "Moved Permanently"; - case status::found: return "Found"; - case status::see_other: return "See Other"; - case status::not_modified: return "Not Modified"; - case status::use_proxy: return "Use Proxy"; - case status::temporary_redirect: return "Temporary Redirect"; - case status::permanent_redirect: return "Permanent Redirect"; - - // 4xx - case status::bad_request: return "Bad Request"; - case status::unauthorized: return "Unauthorized"; - case status::payment_required: return "Payment Required"; - case status::forbidden: return "Forbidden"; - case status::not_found: return "Not Found"; - case status::method_not_allowed: return "Method Not Allowed"; - case status::not_acceptable: return "Not Acceptable"; - case status::proxy_authentication_required: return "Proxy Authentication Required"; - case status::request_timeout: return "Request Timeout"; - case status::conflict: return "Conflict"; - case status::gone: return "Gone"; - case status::length_required: return "Length Required"; - case status::precondition_failed: return "Precondition Failed"; - case status::payload_too_large: return "Payload Too Large"; - case status::uri_too_long: return "URI Too Long"; - case status::unsupported_media_type: return "Unsupported Media Type"; - case status::range_not_satisfiable: return "Range Not Satisfiable"; - case status::expectation_failed: return "Expectation Failed"; - case status::misdirected_request: return "Misdirected Request"; - case status::unprocessable_entity: return "Unprocessable Entity"; - case status::locked: return "Locked"; - case status::failed_dependency: return "Failed Dependency"; - case status::upgrade_required: return "Upgrade Required"; - case status::precondition_required: return "Precondition Required"; - case status::too_many_requests: return "Too Many Requests"; - case status::request_header_fields_too_large: return "Request Header Fields Too Large"; - case status::connection_closed_without_response: return "Connection Closed Without Response"; - case status::unavailable_for_legal_reasons: return "Unavailable For Legal Reasons"; - case status::client_closed_request: return "Client Closed Request"; - // 5xx - case status::internal_server_error: return "Internal Server Error"; - case status::not_implemented: return "Not Implemented"; - case status::bad_gateway: return "Bad Gateway"; - case status::service_unavailable: return "Service Unavailable"; - case status::gateway_timeout: return "Gateway Timeout"; - case status::http_version_not_supported: return "HTTP Version Not Supported"; - case status::variant_also_negotiates: return "Variant Also Negotiates"; - case status::insufficient_storage: return "Insufficient Storage"; - case status::loop_detected: return "Loop Detected"; - case status::not_extended: return "Not Extended"; - case status::network_authentication_required: return "Network Authentication Required"; - case status::network_connect_timeout_error: return "Network Connect Timeout Error"; - - default: - break; - } - return "<unknown-status>"; -} - -template<class = void> -status_class -to_status_class(unsigned v) -{ - switch(v / 100) - { - case 1: return status_class::informational; - case 2: return status_class::successful; - case 3: return status_class::redirection; - case 4: return status_class::client_error; - case 5: return status_class::server_error; - default: - break; - } - return status_class::unknown; -} - -} // detail - -inline -status -int_to_status(unsigned v) -{ - return detail::int_to_status(v); -} - -inline -status_class -to_status_class(unsigned v) -{ - return detail::to_status_class(v); -} - -inline -status_class -to_status_class(status v) -{ - return to_status_class(static_cast<int>(v)); -} - -inline -string_view -obsolete_reason(status v) -{ - return detail::status_to_string( - static_cast<unsigned>(v)); -} - -inline -std::ostream& -operator<<(std::ostream& os, status v) -{ - return os << obsolete_reason(v); -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/verb.ipp b/contrib/restricted/boost/boost/beast/http/impl/verb.ipp deleted file mode 100644 index 8f8b2e33bf..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/verb.ipp +++ /dev/null @@ -1,341 +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_HTTP_IMPL_VERB_IPP -#define BOOST_BEAST_HTTP_IMPL_VERB_IPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/throw_exception.hpp> -#include <stdexcept> - -namespace boost { -namespace beast { -namespace http { - -namespace detail { - -template<class = void> -inline -string_view -verb_to_string(verb v) -{ - switch(v) - { - case verb::delete_: return "DELETE"; - case verb::get: return "GET"; - case verb::head: return "HEAD"; - case verb::post: return "POST"; - case verb::put: return "PUT"; - case verb::connect: return "CONNECT"; - case verb::options: return "OPTIONS"; - case verb::trace: return "TRACE"; - - case verb::copy: return "COPY"; - case verb::lock: return "LOCK"; - case verb::mkcol: return "MKCOL"; - case verb::move: return "MOVE"; - case verb::propfind: return "PROPFIND"; - case verb::proppatch: return "PROPPATCH"; - case verb::search: return "SEARCH"; - case verb::unlock: return "UNLOCK"; - case verb::bind: return "BIND"; - case verb::rebind: return "REBIND"; - case verb::unbind: return "UNBIND"; - case verb::acl: return "ACL"; - - case verb::report: return "REPORT"; - case verb::mkactivity: return "MKACTIVITY"; - case verb::checkout: return "CHECKOUT"; - case verb::merge: return "MERGE"; - - case verb::msearch: return "M-SEARCH"; - case verb::notify: return "NOTIFY"; - case verb::subscribe: return "SUBSCRIBE"; - case verb::unsubscribe: return "UNSUBSCRIBE"; - - case verb::patch: return "PATCH"; - case verb::purge: return "PURGE"; - - case verb::mkcalendar: return "MKCALENDAR"; - - case verb::link: return "LINK"; - case verb::unlink: return "UNLINK"; - - case verb::unknown: - return "<unknown>"; - } - - BOOST_THROW_EXCEPTION(std::invalid_argument{"unknown verb"}); - - // Help some compilers which don't know the next line is - // unreachable, otherwise spurious warnings are generated. - return "<unknown>"; -} - -template<class = void> -verb -string_to_verb(string_view v) -{ -/* - ACL - BIND - CHECKOUT - CONNECT - COPY - DELETE - GET - HEAD - LINK - LOCK - M-SEARCH - MERGE - MKACTIVITY - MKCALENDAR - MKCOL - MOVE - NOTIFY - OPTIONS - PATCH - POST - PROPFIND - PROPPATCH - PURGE - PUT - REBIND - REPORT - SEARCH - SUBSCRIBE - TRACE - UNBIND - UNLINK - UNLOCK - UNSUBSCRIBE -*/ - if(v.size() < 3) - return verb::unknown; - // s must be null terminated - auto const eq = - [](string_view sv, char const* s) - { - auto p = sv.data(); - for(;;) - { - if(*s != *p) - return false; - ++s; - ++p; - if(! *s) - return p == sv.end(); - } - }; - auto c = v[0]; - v.remove_prefix(1); - switch(c) - { - case 'A': - if(v == "CL") - return verb::acl; - break; - - case 'B': - if(v == "IND") - return verb::bind; - break; - - case 'C': - c = v[0]; - v.remove_prefix(1); - switch(c) - { - case 'H': - if(eq(v, "ECKOUT")) - return verb::checkout; - break; - - case 'O': - if(eq(v, "NNECT")) - return verb::connect; - if(eq(v, "PY")) - return verb::copy; - BOOST_FALLTHROUGH; - - default: - break; - } - break; - - case 'D': - if(eq(v, "ELETE")) - return verb::delete_; - break; - - case 'G': - if(eq(v, "ET")) - return verb::get; - break; - - case 'H': - if(eq(v, "EAD")) - return verb::head; - break; - - case 'L': - if(eq(v, "INK")) - return verb::link; - if(eq(v, "OCK")) - return verb::lock; - break; - - case 'M': - c = v[0]; - v.remove_prefix(1); - switch(c) - { - case '-': - if(eq(v, "SEARCH")) - return verb::msearch; - break; - - case 'E': - if(eq(v, "RGE")) - return verb::merge; - break; - - case 'K': - if(eq(v, "ACTIVITY")) - return verb::mkactivity; - if(v[0] == 'C') - { - v.remove_prefix(1); - if(eq(v, "ALENDAR")) - return verb::mkcalendar; - if(eq(v, "OL")) - return verb::mkcol; - break; - } - break; - - case 'O': - if(eq(v, "VE")) - return verb::move; - BOOST_FALLTHROUGH; - - default: - break; - } - break; - - case 'N': - if(eq(v, "OTIFY")) - return verb::notify; - break; - - case 'O': - if(eq(v, "PTIONS")) - return verb::options; - break; - - case 'P': - c = v[0]; - v.remove_prefix(1); - switch(c) - { - case 'A': - if(eq(v, "TCH")) - return verb::patch; - break; - - case 'O': - if(eq(v, "ST")) - return verb::post; - break; - - case 'R': - if(eq(v, "OPFIND")) - return verb::propfind; - if(eq(v, "OPPATCH")) - return verb::proppatch; - break; - - case 'U': - if(eq(v, "RGE")) - return verb::purge; - if(eq(v, "T")) - return verb::put; - BOOST_FALLTHROUGH; - - default: - break; - } - break; - - case 'R': - if(v[0] != 'E') - break; - v.remove_prefix(1); - if(eq(v, "BIND")) - return verb::rebind; - if(eq(v, "PORT")) - return verb::report; - break; - - case 'S': - if(eq(v, "EARCH")) - return verb::search; - if(eq(v, "UBSCRIBE")) - return verb::subscribe; - break; - - case 'T': - if(eq(v, "RACE")) - return verb::trace; - break; - - case 'U': - if(v[0] != 'N') - break; - v.remove_prefix(1); - if(eq(v, "BIND")) - return verb::unbind; - if(eq(v, "LINK")) - return verb::unlink; - if(eq(v, "LOCK")) - return verb::unlock; - if(eq(v, "SUBSCRIBE")) - return verb::unsubscribe; - break; - - default: - break; - } - - return verb::unknown; -} - -} // detail - -inline -string_view -to_string(verb v) -{ - return detail::verb_to_string(v); -} - -inline -verb -string_to_verb(string_view s) -{ - return detail::string_to_verb(s); -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/impl/write.ipp b/contrib/restricted/boost/boost/beast/http/impl/write.ipp deleted file mode 100644 index af31cd9be9..0000000000 --- a/contrib/restricted/boost/boost/beast/http/impl/write.ipp +++ /dev/null @@ -1,908 +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_HTTP_IMPL_WRITE_IPP -#define BOOST_BEAST_HTTP_IMPL_WRITE_IPP - -#include <boost/beast/http/type_traits.hpp> -#include <boost/beast/core/bind_handler.hpp> -#include <boost/beast/core/ostream.hpp> -#include <boost/beast/core/handler_ptr.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/asio/post.hpp> -#include <boost/asio/write.hpp> -#include <boost/optional.hpp> -#include <boost/throw_exception.hpp> -#include <ostream> -#include <sstream> - -namespace boost { -namespace beast { -namespace http { -namespace detail { - -template< - class Stream, class Handler, - bool isRequest, class Body, class Fields> -class write_some_op -{ - Stream& s_; - serializer<isRequest,Body, Fields>& sr_; - Handler h_; - - class lambda - { - write_some_op& op_; - - public: - bool invoked = false; - - explicit - lambda(write_some_op& op) - : op_(op) - { - } - - template<class ConstBufferSequence> - void - operator()(error_code& ec, - ConstBufferSequence const& buffers) - { - invoked = true; - ec.assign(0, ec.category()); - return op_.s_.async_write_some( - buffers, std::move(op_)); - } - }; - -public: - write_some_op(write_some_op&&) = default; - write_some_op(write_some_op const&) = delete; - - template<class DeducedHandler> - write_some_op(DeducedHandler&& h, Stream& s, - serializer<isRequest, Body, Fields>& sr) - : s_(s) - , sr_(sr) - , 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<Stream&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, s_.get_executor()); - } - - void - operator()(); - - void - operator()( - error_code ec, - std::size_t bytes_transferred); - - friend - bool asio_handler_is_continuation(write_some_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_some_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->h_)); - } -}; - -template< - class Stream, class Handler, - bool isRequest, class Body, class Fields> -void -write_some_op< - Stream, Handler, isRequest, Body, Fields>:: -operator()() -{ - error_code ec; - if(! sr_.is_done()) - { - lambda f{*this}; - sr_.next(ec, f); - if(ec) - { - BOOST_ASSERT(! f.invoked); - return boost::asio::post( - s_.get_executor(), - bind_handler(std::move(*this), ec, 0)); - } - if(f.invoked) - { - // *this has been moved from, - // cannot access members here. - return; - } - // What else could it be? - BOOST_ASSERT(sr_.is_done()); - } - return boost::asio::post( - s_.get_executor(), - bind_handler(std::move(*this), ec, 0)); -} - -template< - class Stream, class Handler, - bool isRequest, class Body, class Fields> -void -write_some_op< - Stream, Handler, isRequest, Body, Fields>:: -operator()( - error_code ec, std::size_t bytes_transferred) -{ - if(! ec) - sr_.consume(bytes_transferred); - h_(ec, bytes_transferred); -} - -//------------------------------------------------------------------------------ - -struct serializer_is_header_done -{ - template< - bool isRequest, class Body, class Fields> - bool - operator()( - serializer<isRequest, Body, Fields>& sr) const - { - return sr.is_header_done(); - } -}; - -struct serializer_is_done -{ - template< - bool isRequest, class Body, class Fields> - bool - operator()( - serializer<isRequest, Body, Fields>& sr) const - { - return sr.is_done(); - } -}; - -//------------------------------------------------------------------------------ - -template< - class Stream, class Handler, class Predicate, - bool isRequest, class Body, class Fields> -class write_op -{ - int state_ = 0; - Stream& s_; - serializer<isRequest, Body, Fields>& sr_; - std::size_t bytes_transferred_ = 0; - Handler h_; - -public: - write_op(write_op&&) = default; - write_op(write_op const&) = delete; - - template<class DeducedHandler> - write_op(DeducedHandler&& h, Stream& s, - serializer<isRequest, Body, Fields>& sr) - : s_(s) - , sr_(sr) - , 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<Stream&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, s_.get_executor()); - } - - void - operator()( - error_code ec = {}, - std::size_t bytes_transferred = 0); - - friend - bool asio_handler_is_continuation(write_op* op) - { - using boost::asio::asio_handler_is_continuation; - return op->state_ >= 3 || - 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 Stream, class Handler, class Predicate, - bool isRequest, class Body, class Fields> -void -write_op<Stream, Handler, Predicate, - isRequest, Body, Fields>:: -operator()( - error_code ec, std::size_t bytes_transferred) -{ - if(ec) - goto upcall; - switch(state_) - { - case 0: - { - if(Predicate{}(sr_)) - { - state_ = 1; - return boost::asio::post( - s_.get_executor(), - bind_handler(std::move(*this), ec, 0)); - } - state_ = 2; - return beast::http::async_write_some( - s_, sr_, std::move(*this)); - } - - case 1: - goto upcall; - - case 2: - state_ = 3; - BOOST_FALLTHROUGH; - - case 3: - { - bytes_transferred_ += bytes_transferred; - if(Predicate{}(sr_)) - goto upcall; - return beast::http::async_write_some( - s_, sr_, std::move(*this)); - } - } -upcall: - h_(ec, bytes_transferred_); -} - -//------------------------------------------------------------------------------ - -template<class Stream, class Handler, - bool isRequest, class Body, class Fields> -class write_msg_op -{ - struct data - { - Stream& s; - serializer<isRequest, Body, Fields> sr; - - data(Handler const&, Stream& s_, message< - isRequest, Body, Fields>& m_) - : s(s_) - , sr(m_) - { - } - }; - - handler_ptr<data, Handler> d_; - -public: - write_msg_op(write_msg_op&&) = default; - write_msg_op(write_msg_op const&) = delete; - - template<class DeducedHandler, class... Args> - write_msg_op(DeducedHandler&& h, Stream& s, Args&&... args) - : d_(std::forward<DeducedHandler>(h), - s, std::forward<Args>(args)...) - { - } - - using allocator_type = - boost::asio::associated_allocator_t<Handler>; - - allocator_type - get_allocator() const noexcept - { - return (boost::asio::get_associated_allocator)(d_.handler()); - } - - using executor_type = boost::asio::associated_executor_t< - Handler, decltype(std::declval<Stream&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - d_.handler(), d_->s.get_executor()); - } - - void - operator()(); - - void - operator()( - error_code ec, std::size_t bytes_transferred); - - friend - bool asio_handler_is_continuation(write_msg_op* op) - { - using boost::asio::asio_handler_is_continuation; - return asio_handler_is_continuation( - std::addressof(op->d_.handler())); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, write_msg_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->d_.handler())); - } -}; - -template<class Stream, class Handler, - bool isRequest, class Body, class Fields> -void -write_msg_op< - Stream, Handler, isRequest, Body, Fields>:: -operator()() -{ - auto& d = *d_; - return async_write(d.s, d.sr, std::move(*this)); -} - -template<class Stream, class Handler, - bool isRequest, class Body, class Fields> -void -write_msg_op< - Stream, Handler, isRequest, Body, Fields>:: -operator()(error_code ec, std::size_t bytes_transferred) -{ - d_.invoke(ec, bytes_transferred); -} - -//------------------------------------------------------------------------------ - -template<class Stream> -class write_some_lambda -{ - Stream& stream_; - -public: - bool invoked = false; - std::size_t bytes_transferred = 0; - - explicit - write_some_lambda(Stream& stream) - : stream_(stream) - { - } - - template<class ConstBufferSequence> - void - operator()(error_code& ec, - ConstBufferSequence const& buffers) - { - invoked = true; - bytes_transferred = - stream_.write_some(buffers, ec); - } -}; - -template<class Stream> -class write_lambda -{ - Stream& stream_; - -public: - bool invoked = false; - std::size_t bytes_transferred = 0; - - explicit - write_lambda(Stream& stream) - : stream_(stream) - { - } - - template<class ConstBufferSequence> - void - operator()(error_code& ec, - ConstBufferSequence const& buffers) - { - invoked = true; - bytes_transferred = boost::asio::write( - stream_, buffers, ec); - } -}; - -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write_some_impl( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - error_code& ec) -{ - if(! sr.is_done()) - { - write_some_lambda<SyncWriteStream> f{stream}; - sr.next(ec, f); - if(ec) - return f.bytes_transferred; - if(f.invoked) - sr.consume(f.bytes_transferred); - return f.bytes_transferred; - } - ec.assign(0, ec.category()); - return 0; -} - -template< - class AsyncWriteStream, - bool isRequest, class Body, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write_some_impl( - AsyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - WriteHandler&& handler) -{ - BOOST_BEAST_HANDLER_INIT( - WriteHandler, void(error_code, std::size_t)); - detail::write_some_op< - AsyncWriteStream, - BOOST_ASIO_HANDLER_TYPE(WriteHandler, - void(error_code, std::size_t)), - isRequest, Body, Fields>{ - std::move(init.completion_handler), stream, sr}(); - return init.result.get(); -} - -} // detail - -//------------------------------------------------------------------------------ - -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write_some( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr) -{ - static_assert(is_sync_write_stream<SyncWriteStream>::value, - "SyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - error_code ec; - auto const bytes_transferred = - write_some(stream, sr, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write_some( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - error_code& ec) -{ - static_assert(is_sync_write_stream<SyncWriteStream>::value, - "SyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - return detail::write_some_impl(stream, sr, ec); -} - -template< - class AsyncWriteStream, - bool isRequest, class Body, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write_some( - AsyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - WriteHandler&& handler) -{ - static_assert(is_async_write_stream< - AsyncWriteStream>::value, - "AsyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - return detail::async_write_some_impl(stream, sr, - std::forward<WriteHandler>(handler)); -} - -//------------------------------------------------------------------------------ - -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write_header(SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr) -{ - static_assert(is_sync_write_stream<SyncWriteStream>::value, - "SyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - error_code ec; - auto const bytes_transferred = - write_header(stream, sr, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write_header( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - error_code& ec) -{ - static_assert(is_sync_write_stream<SyncWriteStream>::value, - "SyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - sr.split(true); - std::size_t bytes_transferred = 0; - if(! sr.is_header_done()) - { - detail::write_lambda<SyncWriteStream> f{stream}; - do - { - sr.next(ec, f); - bytes_transferred += f.bytes_transferred; - if(ec) - return bytes_transferred; - BOOST_ASSERT(f.invoked); - sr.consume(f.bytes_transferred); - } - while(! sr.is_header_done()); - } - else - { - ec.assign(0, ec.category()); - } - return bytes_transferred; -} - -template< - class AsyncWriteStream, - bool isRequest, class Body, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write_header( - AsyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - WriteHandler&& handler) -{ - static_assert(is_async_write_stream< - AsyncWriteStream>::value, - "AsyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - sr.split(true); - BOOST_BEAST_HANDLER_INIT( - WriteHandler, void(error_code, std::size_t)); - detail::write_op< - AsyncWriteStream, - BOOST_ASIO_HANDLER_TYPE(WriteHandler, - void(error_code, std::size_t)), - detail::serializer_is_header_done, - isRequest, Body, Fields>{ - std::move(init.completion_handler), stream, sr}(); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr) -{ - static_assert(is_sync_write_stream<SyncWriteStream>::value, - "SyncWriteStream requirements not met"); - error_code ec; - auto const bytes_transferred = - write(stream, sr, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - error_code& ec) -{ - static_assert(is_sync_write_stream<SyncWriteStream>::value, - "SyncWriteStream requirements not met"); - std::size_t bytes_transferred = 0; - sr.split(false); - for(;;) - { - bytes_transferred += - write_some(stream, sr, ec); - if(ec) - return bytes_transferred; - if(sr.is_done()) - break; - } - return bytes_transferred; -} - -template< - class AsyncWriteStream, - bool isRequest, class Body, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write( - AsyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - WriteHandler&& handler) -{ - static_assert(is_async_write_stream< - AsyncWriteStream>::value, - "AsyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - sr.split(false); - BOOST_BEAST_HANDLER_INIT( - WriteHandler, void(error_code, std::size_t)); - detail::write_op< - AsyncWriteStream, - BOOST_ASIO_HANDLER_TYPE(WriteHandler, - void(error_code, std::size_t)), - detail::serializer_is_done, - isRequest, Body, Fields>{ - std::move(init.completion_handler), stream, sr}(); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write( - SyncWriteStream& stream, - message<isRequest, Body, Fields> const& msg) -{ - static_assert(is_sync_write_stream<SyncWriteStream>::value, - "SyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - error_code ec; - auto const bytes_transferred = - write(stream, msg, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write( - SyncWriteStream& stream, - message<isRequest, Body, Fields> const& msg, - error_code& ec) -{ - static_assert(is_sync_write_stream<SyncWriteStream>::value, - "SyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - serializer<isRequest, Body, Fields> sr{msg}; - return write(stream, sr, ec); -} - -template< - class AsyncWriteStream, - bool isRequest, class Body, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write( - AsyncWriteStream& stream, - message<isRequest, Body, Fields>& msg, - WriteHandler&& handler) -{ - static_assert( - is_async_write_stream<AsyncWriteStream>::value, - "AsyncWriteStream requirements not met"); - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - BOOST_BEAST_HANDLER_INIT( - WriteHandler, void(error_code, std::size_t)); - detail::write_msg_op< - AsyncWriteStream, - BOOST_ASIO_HANDLER_TYPE(WriteHandler, - void(error_code, std::size_t)), - isRequest, Body, Fields>{ - std::move(init.completion_handler), stream, msg}(); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -namespace detail { - -template<class Serializer> -class write_ostream_lambda -{ - std::ostream& os_; - Serializer& sr_; - -public: - write_ostream_lambda(std::ostream& os, - Serializer& sr) - : os_(os) - , sr_(sr) - { - } - - template<class ConstBufferSequence> - void - operator()(error_code& ec, - ConstBufferSequence const& buffers) const - { - ec.assign(0, ec.category()); - if(os_.fail()) - return; - std::size_t bytes_transferred = 0; - for(auto b : buffers_range(buffers)) - { - os_.write(reinterpret_cast<char const*>( - b.data()), b.size()); - if(os_.fail()) - return; - bytes_transferred += b.size(); - } - sr_.consume(bytes_transferred); - } -}; - -} // detail - -template<class Fields> -std::ostream& -operator<<(std::ostream& os, - header<true, Fields> const& h) -{ - typename Fields::writer fr{ - h, h.version(), h.method()}; - return os << buffers(fr.get()); -} - -template<class Fields> -std::ostream& -operator<<(std::ostream& os, - header<false, Fields> const& h) -{ - typename Fields::writer fr{ - h, h.version(), h.result_int()}; - return os << buffers(fr.get()); -} - -template<bool isRequest, class Body, class Fields> -std::ostream& -operator<<(std::ostream& os, - message<isRequest, Body, Fields> const& msg) -{ - static_assert(is_body<Body>::value, - "Body requirements not met"); - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - serializer<isRequest, Body, Fields> sr{msg}; - error_code ec; - detail::write_ostream_lambda<decltype(sr)> f{os, sr}; - do - { - sr.next(ec, f); - if(os.fail()) - break; - if(ec) - { - os.setstate(std::ios::failbit); - break; - } - } - while(! sr.is_done()); - return os; -} - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/message.hpp b/contrib/restricted/boost/boost/beast/http/message.hpp deleted file mode 100644 index 0455042786..0000000000 --- a/contrib/restricted/boost/boost/beast/http/message.hpp +++ /dev/null @@ -1,1003 +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_HTTP_MESSAGE_HPP -#define BOOST_BEAST_HTTP_MESSAGE_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/http/fields.hpp> -#include <boost/beast/http/verb.hpp> -#include <boost/beast/http/status.hpp> -#include <boost/beast/http/type_traits.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/detail/empty_base_optimization.hpp> -#include <boost/beast/core/detail/integer_sequence.hpp> -#include <boost/assert.hpp> -#include <boost/optional.hpp> -#include <boost/throw_exception.hpp> -#include <memory> -#include <stdexcept> -#include <string> -#include <tuple> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/** A container for an HTTP request or response header. - - This container is derived from the `Fields` template type. - To understand all of the members of this class it is necessary - to view the declaration for the `Fields` type. When using - the default fields container, those declarations are in - @ref fields. - - Newly constructed header objects have version set to - HTTP/1.1. Newly constructed response objects also have - result code set to @ref status::ok. - - A `header` includes the start-line and header-fields. -*/ -#if BOOST_BEAST_DOXYGEN -template<bool isRequest, class Fields = fields> -struct header : Fields - -#else -template<bool isRequest, class Fields = fields> -struct header; - -template<class Fields> -struct header<true, Fields> : Fields -#endif -{ - static_assert(is_fields<Fields>::value, - "Fields requirements not met"); - - /// Indicates if the header is a request or response. -#if BOOST_BEAST_DOXYGEN - using is_request = std::integral_constant<bool, isRequest>; -#else - using is_request = std::true_type; -#endif - - /// The type representing the fields. - using fields_type = Fields; - - /// Constructor - header() = default; - - /// Constructor - header(header&&) = default; - - /// Constructor - header(header const&) = default; - - /// Assignment - header& operator=(header&&) = default; - - /// Assignment - header& operator=(header const&) = default; - - /** Return the HTTP-version. - - This holds both the major and minor version numbers, - using these formulas: - @code - unsigned major = version / 10; - unsigned minor = version % 10; - @endcode - - Newly constructed headers will use HTTP/1.1 by default. - */ - unsigned version() const noexcept - { - return version_; - } - - /** Set the HTTP-version. - - This holds both the major and minor version numbers, - using these formulas: - @code - unsigned major = version / 10; - unsigned minor = version % 10; - @endcode - - Newly constructed headers will use HTTP/1.1 by default. - - @param value The version number to use - */ - void version(unsigned value) noexcept - { - BOOST_ASSERT(value > 0 && value < 100); - version_ = value; - } - - /** Return the request-method verb. - - If the request-method is not one of the recognized verbs, - @ref verb::unknown is returned. Callers may use @ref method_string - to retrieve the exact text. - - @note This function is only available when `isRequest == true`. - - @see @ref method_string - */ - verb - method() const; - - /** Set the request-method. - - This function will set the method for requests to a known verb. - - @param v The request method verb to set. - This may not be @ref verb::unknown. - - @throws std::invalid_argument when `v == verb::unknown`. - - @note This function is only available when `isRequest == true`. - */ - void - method(verb v); - - /** Return the request-method as a string. - - @note This function is only available when `isRequest == true`. - - @see @ref method - */ - string_view - method_string() const; - - /** Set the request-method. - - This function will set the request-method a known verb - if the string matches, otherwise it will store a copy of - the passed string. - - @param s A string representing the request-method. - - @note This function is only available when `isRequest == true`. - */ - void - method_string(string_view s); - - /** Returns the request-target string. - - The request target string returned is the same string which - was received from the network or stored. In particular, it will - contain url-encoded characters and should follow the syntax - rules for URIs used with HTTP. - - @note This function is only available when `isRequest == true`. - */ - string_view - target() const; - - /** Set the request-target string. - - It is the caller's responsibility to ensure that the request - target string follows the syntax rules for URIs used with - HTTP. In particular, reserved or special characters must be - url-encoded. The implementation does not perform syntax checking - on the passed string. - - @param s A string representing the request-target. - - @note This function is only available when `isRequest == true`. - */ - void - target(string_view s); - - // VFALCO Don't rearrange these declarations or - // ifdefs, or else the documentation will break. - - /** Constructor - - @param args Arguments forwarded to the `Fields` - base class constructor. - - @note This constructor participates in overload - resolution if and only if the first parameter is - not convertible to @ref header, @ref verb, or - @ref status. - */ -#if BOOST_BEAST_DOXYGEN - template<class... Args> - explicit - header(Args&&... args); - -#else - template<class Arg1, class... ArgN, - class = typename std::enable_if< - ! std::is_convertible<typename - std::decay<Arg1>::type, header>::value && - ! std::is_convertible<typename - std::decay<Arg1>::type, verb>::value && - ! std::is_convertible<typename - std::decay<Arg1>::type, header>::value - >::type> - explicit - header(Arg1&& arg1, ArgN&&... argn); - -private: - template<bool, class, class> - friend struct message; - - template<class T> - friend - void - swap(header<true, T>& m1, header<true, T>& m2); - - template<class... FieldsArgs> - header( - verb method, - string_view target_, - unsigned version_value, - FieldsArgs&&... fields_args) - : Fields(std::forward<FieldsArgs>(fields_args)...) - , method_(method) - { - version(version_value); - target(target_); - } - - unsigned version_ = 11; - verb method_ = verb::unknown; -}; - -/** A container for an HTTP request or response header. - - A `header` includes the start-line and header-fields. -*/ -template<class Fields> -struct header<false, Fields> : Fields -{ - static_assert(is_fields<Fields>::value, - "Fields requirements not met"); - - /// Indicates if the header is a request or response. - using is_request = std::false_type; - - /// The type representing the fields. - using fields_type = Fields; - - /// Constructor. - header() = default; - - /// Constructor - header(header&&) = default; - - /// Constructor - header(header const&) = default; - - /// Assignment - header& operator=(header&&) = default; - - /// Assignment - header& operator=(header const&) = default; - - /** Constructor - - @param args Arguments forwarded to the `Fields` - base class constructor. - - @note This constructor participates in overload - resolution if and only if the first parameter is - not convertible to @ref header, @ref verb, or - @ref status. - */ - template<class Arg1, class... ArgN, - class = typename std::enable_if< - ! std::is_convertible<typename - std::decay<Arg1>::type, status>::value && - ! std::is_convertible<typename - std::decay<Arg1>::type, header>::value - >::type> - explicit - header(Arg1&& arg1, ArgN&&... argn); - - /** Return the HTTP-version. - - This holds both the major and minor version numbers, - using these formulas: - @code - unsigned major = version / 10; - unsigned minor = version % 10; - @endcode - - Newly constructed headers will use HTTP/1.1 by default. - */ - unsigned version() const noexcept - { - return version_; - } - - /** Set the HTTP-version. - - This holds both the major and minor version numbers, - using these formulas: - @code - unsigned major = version / 10; - unsigned minor = version % 10; - @endcode - - Newly constructed headers will use HTTP/1.1 by default. - - @param value The version number to use - */ - void version(unsigned value) noexcept - { - BOOST_ASSERT(value > 0 && value < 100); - version_ = value; - } -#endif - - /** The response status-code result. - - If the actual status code is not a known code, this - function returns @ref status::unknown. Use @ref result_int - to return the raw status code as a number. - - @note This member is only available when `isRequest == false`. - */ - status - result() const; - - /** Set the response status-code. - - @param v The code to set. - - @note This member is only available when `isRequest == false`. - */ - void - result(status v); - - /** Set the response status-code as an integer. - - This sets the status code to the exact number passed in. - If the number does not correspond to one of the known - status codes, the function @ref result will return - @ref status::unknown. Use @ref result_int to obtain the - original raw status-code. - - @param v The status-code integer to set. - - @throws std::invalid_argument if `v > 999`. - */ - void - result(unsigned v); - - /** The response status-code expressed as an integer. - - This returns the raw status code as an integer, even - when that code is not in the list of known status codes. - - @note This member is only available when `isRequest == false`. - */ - unsigned - result_int() const; - - /** Return the response reason-phrase. - - The reason-phrase is obsolete as of rfc7230. - - @note This function is only available when `isRequest == false`. - */ - string_view - reason() const; - - /** Set the response reason-phrase (deprecated) - - This function sets a custom reason-phrase to a copy of - the string passed in. Normally it is not necessary to set - the reason phrase on an outgoing response object; the - implementation will automatically use the standard reason - text for the corresponding status code. - - To clear a previously set custom phrase, pass an empty - string. This will restore the default standard reason text - based on the status code used when serializing. - - The reason-phrase is obsolete as of rfc7230. - - @param s The string to use for the reason-phrase. - - @note This function is only available when `isRequest == false`. - */ - void - reason(string_view s); - -private: -#if ! BOOST_BEAST_DOXYGEN - template<bool, class, class> - friend struct message; - - template<class T> - friend - void - swap(header<false, T>& m1, header<false, T>& m2); - - template<class... FieldsArgs> - header( - status result, - unsigned version_value, - FieldsArgs&&... fields_args) - : Fields(std::forward<FieldsArgs>(fields_args)...) - , result_(result) - { - version(version_value); - } - - unsigned version_ = 11; - status result_ = status::ok; -#endif -}; - -/// A typical HTTP request header -template<class Fields = fields> -using request_header = header<true, Fields>; - -/// A typical HTTP response header -template<class Fields = fields> -using response_header = header<false, Fields>; - -#if defined(BOOST_MSVC) -// Workaround for MSVC bug with private base classes -namespace detail { -template<class T> -using value_type_t = typename T::value_type; -} // detail -#endif - -/** A container for a complete HTTP message. - - This container is derived from the `Fields` template type. - To understand all of the members of this class it is necessary - to view the declaration for the `Fields` type. When using - the default fields container, those declarations are in - @ref fields. - - A message can be a request or response, depending on the - `isRequest` template argument value. Requests and responses - have different types; functions may be overloaded based on - the type if desired. - - The `Body` template argument type determines the model used - to read or write the content body of the message. - - Newly constructed messages objects have version set to - HTTP/1.1. Newly constructed response objects also have - result code set to @ref status::ok. - - @tparam isRequest `true` if this represents a request, - or `false` if this represents a response. Some class data - members are conditionally present depending on this value. - - @tparam Body A type meeting the requirements of Body. - - @tparam Fields The type of container used to hold the - field value pairs. -*/ -template<bool isRequest, class Body, class Fields = fields> -struct message - : header<isRequest, Fields> -#if ! BOOST_BEAST_DOXYGEN - , beast::detail::empty_base_optimization< - typename Body::value_type> -#endif -{ - /// The base class used to hold the header portion of the message. - using header_type = header<isRequest, Fields>; - - /** The type providing the body traits. - - The @ref message::body member will be of type `body_type::value_type`. - */ - using body_type = Body; - - /// Constructor - message() = default; - - /// Constructor - message(message&&) = default; - - /// Constructor - message(message const&) = default; - - /// Assignment - message& operator=(message&&) = default; - - /// Assignment - message& operator=(message const&) = default; - - /** Constructor - - @param h The header to move construct from. - - @param body_args Optional arguments forwarded - to the `body` constructor. - */ - template<class... BodyArgs> - explicit - message(header_type&& h, BodyArgs&&... body_args); - - /** Constructor. - - @param h The header to copy construct from. - - @param body_args Optional arguments forwarded - to the `body` constructor. - */ - template<class... BodyArgs> - explicit - message(header_type const& h, BodyArgs&&... body_args); - - /** Constructor - - @param method The request-method to use - - @param target The request-target. - - @param version The HTTP-version - - @note This function is only available when `isRequest == true`. - */ -#if BOOST_BEAST_DOXYGEN - message(verb method, string_view target, unsigned version); -#else - template<class Version, - class = typename std::enable_if<isRequest && - std::is_convertible<Version, unsigned>::value>::type> - message(verb method, string_view target, Version version); -#endif - - /** Constructor - - @param method The request-method to use - - @param target The request-target. - - @param version The HTTP-version - - @param body_arg An argument forwarded to the `body` constructor. - - @note This function is only available when `isRequest == true`. - */ -#if BOOST_BEAST_DOXYGEN - template<class BodyArg> - message(verb method, string_view target, - unsigned version, BodyArg&& body_arg); -#else - template<class Version, class BodyArg, - class = typename std::enable_if<isRequest && - std::is_convertible<Version, unsigned>::value>::type> - message(verb method, string_view target, - Version version, BodyArg&& body_arg); -#endif - - /** Constructor - - @param method The request-method to use - - @param target The request-target. - - @param version The HTTP-version - - @param body_arg An argument forwarded to the `body` constructor. - - @param fields_arg An argument forwarded to the `Fields` constructor. - - @note This function is only available when `isRequest == true`. - */ -#if BOOST_BEAST_DOXYGEN - template<class BodyArg, class FieldsArg> - message(verb method, string_view target, unsigned version, - BodyArg&& body_arg, FieldsArg&& fields_arg); -#else - template<class Version, class BodyArg, class FieldsArg, - class = typename std::enable_if<isRequest && - std::is_convertible<Version, unsigned>::value>::type> - message(verb method, string_view target, Version version, - BodyArg&& body_arg, FieldsArg&& fields_arg); -#endif - - /** Constructor - - @param result The status-code for the response - - @param version The HTTP-version - - @note This member is only available when `isRequest == false`. - */ -#if BOOST_BEAST_DOXYGEN - message(status result, unsigned version); -#else - template<class Version, - class = typename std::enable_if<! isRequest && - std::is_convertible<Version, unsigned>::value>::type> - message(status result, Version version); -#endif - - /** Constructor - - @param result The status-code for the response - - @param version The HTTP-version - - @param body_arg An argument forwarded to the `body` constructor. - - @note This member is only available when `isRequest == false`. - */ -#if BOOST_BEAST_DOXYGEN - template<class BodyArg> - message(status result, unsigned version, BodyArg&& body_arg); -#else - template<class Version, class BodyArg, - class = typename std::enable_if<! isRequest && - std::is_convertible<Version, unsigned>::value>::type> - message(status result, Version version, BodyArg&& body_arg); -#endif - - /** Constructor - - @param result The status-code for the response - - @param version The HTTP-version - - @param body_arg An argument forwarded to the `body` constructor. - - @param fields_arg An argument forwarded to the `Fields` base class constructor. - - @note This member is only available when `isRequest == false`. - */ -#if BOOST_BEAST_DOXYGEN - template<class BodyArg, class FieldsArg> - message(status result, unsigned version, - BodyArg&& body_arg, FieldsArg&& fields_arg); -#else - template<class Version, class BodyArg, class FieldsArg, - class = typename std::enable_if<! isRequest && - std::is_convertible<Version, unsigned>::value>::type> - message(status result, Version version, - BodyArg&& body_arg, FieldsArg&& fields_arg); -#endif - - /** Constructor - - The header and body are default-constructed. - */ - explicit - message(std::piecewise_construct_t); - - /** Construct a message. - - @param body_args A tuple forwarded as a parameter - pack to the body constructor. - */ - template<class... BodyArgs> - message(std::piecewise_construct_t, - std::tuple<BodyArgs...> body_args); - - /** Construct a message. - - @param body_args A tuple forwarded as a parameter - pack to the body constructor. - - @param fields_args A tuple forwarded as a parameter - pack to the `Fields` constructor. - */ - template<class... BodyArgs, class... FieldsArgs> - message(std::piecewise_construct_t, - std::tuple<BodyArgs...> body_args, - std::tuple<FieldsArgs...> fields_args); - - /// Returns the header portion of the message - header_type const& - base() const - { - return *this; - } - - /// Returns the header portion of the message - header_type& - base() - { - return *this; - } - - /// Returns `true` if the chunked Transfer-Encoding is specified - bool - chunked() const - { - return this->get_chunked_impl(); - } - - /** Set or clear the chunked Transfer-Encoding - - This function will set or removed the "chunked" transfer - encoding as the last item in the list of encodings in the - field. - - If the result of removing the chunked token results in an - empty string, the field is erased. - - The Content-Length field is erased unconditionally. - */ - void - chunked(bool value); - - /** Returns `true` if the Content-Length field is present. - - This function inspects the fields and returns `true` if - the Content-Length field is present. The properties of the - body are not checked, this only looks for the field. - */ - bool - has_content_length() const - { - return this->has_content_length_impl(); - } - - /** Set or clear the Content-Length field - - This function adjusts the Content-Length field as follows: - - @li If `value` specifies a value, the Content-Length field - is set to the value. Otherwise - - @li The Content-Length field is erased. - - If "chunked" token appears as the last item in the - Transfer-Encoding field it is unconditionally removed. - - @param value The value to set for Content-Length. - */ - void - content_length(boost::optional<std::uint64_t> const& value); - - /** Returns `true` if the message semantics indicate keep-alive - - The value depends on the version in the message, which must - be set to the final value before this function is called or - else the return value is unreliable. - */ - bool - keep_alive() const - { - return this->get_keep_alive_impl(this->version()); - } - - /** Set the keep-alive message semantic option - - This function adjusts the Connection field to indicate - whether or not the connection should be kept open after - the corresponding response. The result depends on the - version set on the message, which must be set to the - final value before making this call. - - @param value `true` if the connection should persist. - */ - void - keep_alive(bool value) - { - this->set_keep_alive_impl(this->version(), value); - } - - /** Returns `true` if the message semantics require an end of file. - - For HTTP requests, this function returns the logical - NOT of a call to @ref keep_alive. - - For HTTP responses, this function returns the logical NOT - of a call to @ref keep_alive if any of the following are true: - - @li @ref has_content_length would return `true` - - @li @ref chunked would return `true` - - @li @ref result returns @ref status::no_content - - @li @ref result returns @ref status::not_modified - - @li @ref result returns any informational status class (100 to 199) - - Otherwise, the function returns `true`. - - @see https://tools.ietf.org/html/rfc7230#section-3.3 - */ - bool - need_eof() const - { - return need_eof(typename header_type::is_request{}); - } - - /** Returns the payload size of the body in octets if possible. - - This function invokes the @b Body algorithm to measure - the number of octets in the serialized body container. If - there is no body, this will return zero. Otherwise, if the - body exists but is not known ahead of time, `boost::none` - is returned (usually indicating that a chunked Transfer-Encoding - will be used). - - @note The value of the Content-Length field in the message - is not inspected. - */ - boost::optional<std::uint64_t> - payload_size() const; - - /** Prepare the message payload fields for the body. - - This function will adjust the Content-Length and - Transfer-Encoding field values based on the properties - of the body. - - @par Example - @code - request<string_body> req{verb::post, "/"}; - req.set(field::user_agent, "Beast"); - req.body() = "Hello, world!"; - req.prepare_payload(); - @endcode - */ - void - prepare_payload() - { - prepare_payload(typename header_type::is_request{}); - } - - /// Returns the body -#if BOOST_BEAST_DOXYGEN || ! defined(BOOST_MSVC) - typename body_type::value_type& -#else - detail::value_type_t<Body>& -#endif - body()& noexcept - { - return this->beast::detail::empty_base_optimization< - typename Body::value_type>::member(); - } - - /// Returns the body -#if BOOST_BEAST_DOXYGEN || ! defined(BOOST_MSVC) - typename body_type::value_type&& -#else - detail::value_type_t<Body>&& -#endif - body()&& noexcept - { - return std::move( - this->beast::detail::empty_base_optimization< - typename Body::value_type>::member()); - } - - /// Returns the body -#if BOOST_BEAST_DOXYGEN || ! defined(BOOST_MSVC) - typename body_type::value_type const& -#else - detail::value_type_t<Body> const& -#endif - body() const& noexcept - { - return this->beast::detail::empty_base_optimization< - typename Body::value_type>::member(); - } - -private: - static_assert(is_body<Body>::value, - "Body requirements not met"); - - template< - class... BodyArgs, - std::size_t... IBodyArgs> - message( - std::piecewise_construct_t, - std::tuple<BodyArgs...>& body_args, - beast::detail::index_sequence<IBodyArgs...>) - : beast::detail::empty_base_optimization< - typename Body::value_type>( - std::forward<BodyArgs>( - std::get<IBodyArgs>(body_args))...) - { - boost::ignore_unused(body_args); - } - - template< - class... BodyArgs, - class... FieldsArgs, - std::size_t... IBodyArgs, - std::size_t... IFieldsArgs> - message( - std::piecewise_construct_t, - std::tuple<BodyArgs...>& body_args, - std::tuple<FieldsArgs...>& fields_args, - beast::detail::index_sequence<IBodyArgs...>, - beast::detail::index_sequence<IFieldsArgs...>) - : header_type(std::forward<FieldsArgs>( - std::get<IFieldsArgs>(fields_args))...) - , beast::detail::empty_base_optimization< - typename Body::value_type>( - std::forward<BodyArgs>( - std::get<IBodyArgs>(body_args))...) - { - boost::ignore_unused(body_args); - boost::ignore_unused(fields_args); - } - - bool - need_eof(std::true_type) const - { - return ! keep_alive(); - } - - bool - need_eof(std::false_type) const; - - boost::optional<std::uint64_t> - payload_size(std::true_type) const - { - return Body::size(this->body()); - } - - boost::optional<std::uint64_t> - payload_size(std::false_type) const - { - return boost::none; - } - - void - prepare_payload(std::true_type); - - void - prepare_payload(std::false_type); -}; - -/// A typical HTTP request -template<class Body, class Fields = fields> -using request = message<true, Body, Fields>; - -/// A typical HTTP response -template<class Body, class Fields = fields> -using response = message<false, Body, Fields>; - -//------------------------------------------------------------------------------ - -#if BOOST_BEAST_DOXYGEN -/** Swap two header objects. - - @par Requirements - `Fields` is @b Swappable. -*/ -template<bool isRequest, class Fields> -void -swap( - header<isRequest, Fields>& m1, - header<isRequest, Fields>& m2); -#endif - -/** Swap two message objects. - - @par Requirements: - `Body::value_type` and `Fields` are @b Swappable. -*/ -template<bool isRequest, class Body, class Fields> -void -swap( - message<isRequest, Body, Fields>& m1, - message<isRequest, Body, Fields>& m2); - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/message.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/parser.hpp b/contrib/restricted/boost/boost/beast/http/parser.hpp deleted file mode 100644 index 69d93cf03c..0000000000 --- a/contrib/restricted/boost/boost/beast/http/parser.hpp +++ /dev/null @@ -1,465 +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_HTTP_PARSER_HPP -#define BOOST_BEAST_HTTP_PARSER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/http/basic_parser.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/beast/http/type_traits.hpp> -#include <boost/optional.hpp> -#include <boost/throw_exception.hpp> -#include <functional> -#include <memory> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/** An HTTP/1 parser for producing a message. - - This class uses the basic HTTP/1 wire format parser to convert - a series of octets into a @ref message using the @ref basic_fields - container to represent the fields. - - @tparam isRequest Indicates whether a request or response - will be parsed. - - @tparam Body The type used to represent the body. This must - meet the requirements of @b Body. - - @tparam Allocator The type of allocator used with the - @ref basic_fields container. - - @note A new instance of the parser is required for each message. -*/ -template< - bool isRequest, - class Body, - class Allocator = std::allocator<char>> -class parser - : public basic_parser<isRequest, - parser<isRequest, Body, Allocator>> -{ - static_assert(is_body<Body>::value, - "Body requirements not met"); - - static_assert(is_body_reader<Body>::value, - "BodyReader requirements not met"); - - template<bool, class, class> - friend class parser; - - using base_type = basic_parser<isRequest, - parser<isRequest, Body, Allocator>>; - - message<isRequest, Body, basic_fields<Allocator>> m_; - typename Body::reader rd_; - bool rd_inited_ = false; - - std::function<void( - std::uint64_t, - string_view, - error_code&)> cb_h_; - - std::function<std::size_t( - std::uint64_t, - string_view, - error_code&)> cb_b_; - -public: - /// The type of message returned by the parser - using value_type = - message<isRequest, Body, basic_fields<Allocator>>; - - /// Destructor - ~parser() = default; - - /// Constructor (disallowed) - parser(parser const&) = delete; - - /// Assignment (disallowed) - parser& operator=(parser const&) = delete; - - /// Constructor (disallowed) - parser(parser&& other) = delete; - - /// Constructor - parser(); - - /** Constructor - - @param args Optional arguments forwarded to the - @ref http::header constructor. - - @note This function participates in overload - resolution only if the first argument is not a - @ref parser. - */ -#if BOOST_BEAST_DOXYGEN - template<class... Args> - explicit - parser(Args&&... args); -#else - template<class Arg1, class... ArgN, - class = typename std::enable_if< - ! detail::is_parser<typename - std::decay<Arg1>::type>::value>::type> - explicit - parser(Arg1&& arg1, ArgN&&... argn); -#endif - - /** Construct a parser from another parser, changing the Body type. - - This constructs a new parser by move constructing the - header from another parser with a different body type. The - constructed-from parser must not have any parsed body octets or - initialized @b BodyReader, otherwise an exception is generated. - - @par Example - @code - // Deferred body type commitment - request_parser<empty_body> req0; - ... - request_parser<string_body> req{std::move(req0)}; - @endcode - - If an exception is thrown, the state of the constructed-from - parser is undefined. - - @param parser The other parser to construct from. After - this call returns, the constructed-from parser may only - be destroyed. - - @param args Optional arguments forwarded to the message - constructor. - - @throws std::invalid_argument Thrown when the constructed-from - parser has already initialized a body reader. - - @note This function participates in overload resolution only - if the other parser uses a different body type. - */ -#if BOOST_BEAST_DOXYGEN - template<class OtherBody, class... Args> -#else - template<class OtherBody, class... Args, - class = typename std::enable_if< - ! std::is_same<Body, OtherBody>::value>::type> -#endif - explicit - parser(parser<isRequest, OtherBody, - Allocator>&& parser, Args&&... args); - - /** Returns the parsed message. - - Depending on the parser's progress, - parts of this object may be incomplete. - */ - value_type const& - get() const - { - return m_; - } - - /** Returns the parsed message. - - Depending on the parser's progress, - parts of this object may be incomplete. - */ - value_type& - get() - { - return m_; - } - - /** Returns ownership of the parsed message. - - Ownership is transferred to the caller. - Depending on the parser's progress, - parts of this object may be incomplete. - - @par Requires - - @ref value_type is @b MoveConstructible - */ - value_type - release() - { - static_assert(std::is_move_constructible<decltype(m_)>::value, - "MoveConstructible requirements not met"); - return std::move(m_); - } - - /** Set a callback to be invoked on each chunk header. - - The callback will be invoked once for every chunk in the message - payload, as well as once for the last chunk. The invocation - happens after the chunk header is available but before any body - octets have been parsed. - - The extensions are provided in raw, validated form, use - @ref chunk_extensions::parse to parse the extensions into a - structured container for easier access. - The implementation type-erases the callback without requiring - a dynamic allocation. For this reason, the callback object is - passed by a non-constant reference. - - @par Example - @code - auto callback = - [](std::uint64_t size, string_view extensions, error_code& ec) - { - //... - }; - parser.on_chunk_header(callback); - @endcode - - @param cb The function to set, which must be invocable with - this equivalent signature: - @code - void - on_chunk_header( - std::uint64_t size, // Size of the chunk, zero for the last chunk - string_view extensions, // The chunk-extensions in raw form - error_code& ec); // May be set by the callback to indicate an error - @endcode - */ - template<class Callback> - void - on_chunk_header(Callback& cb) - { - // Callback may not be constant, caller is responsible for - // managing the lifetime of the callback. Copies are not made. - BOOST_STATIC_ASSERT(! std::is_const<Callback>::value); - - // Can't set the callback after receiving any chunk data! - BOOST_ASSERT(! rd_inited_); - - cb_h_ = std::ref(cb); - } - - /** Set a callback to be invoked on chunk body data - - The provided function object will be invoked one or more times - to provide buffers corresponding to the chunk body for the current - chunk. The callback receives the number of octets remaining in this - chunk body including the octets in the buffer provided. - - The callback must return the number of octets actually consumed. - Any octets not consumed will be presented again in a subsequent - invocation of the callback. - The implementation type-erases the callback without requiring - a dynamic allocation. For this reason, the callback object is - passed by a non-constant reference. - - @par Example - @code - auto callback = - [](std::uint64_t remain, string_view body, error_code& ec) - { - //... - }; - parser.on_chunk_body(callback); - @endcode - - @param cb The function to set, which must be invocable with - this equivalent signature: - @code - std::size_t - on_chunk_header( - std::uint64_t remain, // Octets remaining in this chunk, includes `body` - string_view body, // A buffer holding some or all of the remainder of the chunk body - error_code& ec); // May be set by the callback to indicate an error - @endcode - */ - template<class Callback> - void - on_chunk_body(Callback& cb) - { - // Callback may not be constant, caller is responsible for - // managing the lifetime of the callback. Copies are not made. - BOOST_STATIC_ASSERT(! std::is_const<Callback>::value); - - // Can't set the callback after receiving any chunk data! - BOOST_ASSERT(! rd_inited_); - - cb_b_ = std::ref(cb); - } - -private: - friend class basic_parser<isRequest, parser>; - - parser(std::true_type); - parser(std::false_type); - - template<class OtherBody, class... Args, - class = typename std::enable_if< - ! std::is_same<Body, OtherBody>::value>::type> - parser( - std::true_type, - parser<isRequest, OtherBody, Allocator>&& parser, - Args&&... args); - - template<class OtherBody, class... Args, - class = typename std::enable_if< - ! std::is_same<Body, OtherBody>::value>::type> - parser( - std::false_type, - parser<isRequest, OtherBody, Allocator>&& parser, - Args&&... args); - - template<class Arg1, class... ArgN, - class = typename std::enable_if< - ! detail::is_parser<typename - std::decay<Arg1>::type>::value>::type> - explicit - parser(Arg1&& arg1, std::true_type, ArgN&&... argn); - - template<class Arg1, class... ArgN, - class = typename std::enable_if< - ! detail::is_parser<typename - std::decay<Arg1>::type>::value>::type> - explicit - parser(Arg1&& arg1, std::false_type, ArgN&&... argn); - - void - on_request_impl( - verb method, - string_view method_str, - string_view target, - int version, - error_code& ec) - { - try - { - m_.target(target); - if(method != verb::unknown) - m_.method(method); - else - m_.method_string(method_str); - ec.assign(0, ec.category()); - } - catch(std::bad_alloc const&) - { - ec = error::bad_alloc; - } - m_.version(version); - } - - void - on_response_impl( - int code, - string_view reason, - int version, - error_code& ec) - { - m_.result(code); - m_.version(version); - try - { - m_.reason(reason); - ec.assign(0, ec.category()); - } - catch(std::bad_alloc const&) - { - ec = error::bad_alloc; - } - } - - void - on_field_impl( - field name, - string_view name_string, - string_view value, - error_code& ec) - { - try - { - m_.insert(name, name_string, value); - ec.assign(0, ec.category()); - } - catch(std::bad_alloc const&) - { - ec = error::bad_alloc; - } - } - - void - on_header_impl(error_code& ec) - { - ec.assign(0, ec.category()); - } - - void - on_body_init_impl( - boost::optional<std::uint64_t> const& content_length, - error_code& ec) - { - rd_.init(content_length, ec); - rd_inited_ = true; - } - - std::size_t - on_body_impl( - string_view body, - error_code& ec) - { - return rd_.put(boost::asio::buffer( - body.data(), body.size()), ec); - } - - void - on_chunk_header_impl( - std::uint64_t size, - string_view extensions, - error_code& ec) - { - if(cb_h_) - return cb_h_(size, extensions, ec); - ec.assign(0, ec.category()); - } - - std::size_t - on_chunk_body_impl( - std::uint64_t remain, - string_view body, - error_code& ec) - { - if(cb_b_) - return cb_b_(remain, body, ec); - return rd_.put(boost::asio::buffer( - body.data(), body.size()), ec); - } - - void - on_finish_impl(error_code& ec) - { - rd_.finish(ec); - } -}; - -/// An HTTP/1 parser for producing a request message. -template<class Body, class Allocator = std::allocator<char>> -using request_parser = parser<true, Body, Allocator>; - -/// An HTTP/1 parser for producing a response message. -template<class Body, class Allocator = std::allocator<char>> -using response_parser = parser<false, Body, Allocator>; - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/parser.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/read.hpp b/contrib/restricted/boost/boost/beast/http/read.hpp deleted file mode 100644 index a4f0efe400..0000000000 --- a/contrib/restricted/boost/boost/beast/http/read.hpp +++ /dev/null @@ -1,765 +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_HTTP_READ_HPP -#define BOOST_BEAST_HTTP_READ_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/http/basic_parser.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/asio/async_result.hpp> - -namespace boost { -namespace beast { -namespace http { - -/** Read part of a message from a stream using a parser. - - This function is used to read part of a message from a stream into a - subclass of @ref basic_parser. - The call will block until one of the following conditions is true: - - @li A call to @ref basic_parser::put with a non-empty buffer sequence - is successful. - - @li An error occurs. - - This operation is implemented in terms of one or - more calls to the stream's `read_some` function. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b SyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param parser The parser to use. - - @return The number of bytes transferred to the parser. - - @throws system_error Thrown on failure. -*/ -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read_some( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser); - -/** Read part of a message from a stream using a parser. - - This function is used to read part of a message from a stream into a - subclass of @ref basic_parser. - The call will block until one of the following conditions is true: - - @li A call to @ref basic_parser::put with a non-empty buffer sequence - is successful. - - @li An error occurs. - - This operation is implemented in terms of one or - more calls to the stream's `read_some` function. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - The function returns the number of bytes processed from the dynamic - buffer. The caller should remove these bytes by calling `consume` on - the dynamic buffer, regardless of any error. - - @param stream The stream from which the data is to be read. - The type must support the @b SyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param parser The parser to use. - - @param ec Set to the error, if any occurred. - - @return The number of bytes transferred to the parser. -*/ -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read_some( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - error_code& ec); - -/** Read part of a message asynchronously from a stream using a parser. - - This function is used to asynchronously read part of a message from - a stream into a subclass of @ref basic_parser. - The function call always returns immediately. The asynchronous operation - will continue until one of the following conditions is true: - - @li A call to @ref basic_parser::put with a non-empty buffer sequence - is successful. - - @li An error occurs. - - This operation is implemented in terms of zero or more calls to - the next layer's `async_read_some` function, and is known as a - <em>composed operation</em>. The program must ensure that the - stream performs no other reads until this operation completes. - The implementation may read additional octets that lie past the - end of the object being parsed. This additional data is stored - in the stream buffer, which may be used in subsequent calls. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b AsyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param parser The parser to use. - The object must remain valid at least until the - handler is called; ownership is not transferred. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation - std::size_t bytes_transferred // the number of bytes transferred to the parser - ); @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`. - - The completion handler will receive as a parameter the number - of octets processed from the dynamic buffer. The octets should - be removed by calling `consume` on the dynamic buffer after - the read completes, regardless of any error. -*/ -template< - class AsyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived, - class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -async_read_some( - AsyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - ReadHandler&& handler); - -//------------------------------------------------------------------------------ - -/** Read a header from a stream using a parser. - - This function is used to read a header from a stream into a subclass - of @ref basic_parser. - The call will block until one of the following conditions is true: - - @li @ref basic_parser::is_header_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or - more calls to the stream's `read_some` function. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b SyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param parser The parser to use. - - @return The number of bytes transferred to the parser. - - @throws system_error Thrown on failure. - - @note The implementation will call @ref basic_parser::eager - with the value `false` on the parser passed in. -*/ -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read_header( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser); - -/** Read a header from a stream using a parser. - - This function is used to read a header from a stream into a subclass - of @ref basic_parser. - The call will block until one of the following conditions is true: - - @li @ref basic_parser::is_header_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or - more calls to the stream's `read_some` function. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b SyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param parser The parser to use. - - @param ec Set to the error, if any occurred. - - @return The number of bytes transferred to the parser. - - @note The implementation will call @ref basic_parser::eager - with the value `false` on the parser passed in. -*/ -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read_header( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - error_code& ec); - -/** Read a header from a stream asynchronously using a parser. - - This function is used to asynchronously read a header from a stream - into a subclass of @ref basic_parser. - The function call always returns immediately. The asynchronous operation - will continue until one of the following conditions is true: - - @li @ref basic_parser::is_header_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or more calls to - the stream's `async_read_some` function, and is known as a - <em>composed operation</em>. The program must ensure that the - stream performs no other reads until this operation completes. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b AsyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param parser The parser to use. - The object must remain valid at least until the - handler is called; ownership is not transferred. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation, - std::size_t bytes_transferred // the number of bytes transferred to the parser - ); @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`. - - @note The implementation will call @ref basic_parser::eager - with the value `false` on the parser passed in. -*/ -template< - class AsyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived, - class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -async_read_header( - AsyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - ReadHandler&& handler); - -//------------------------------------------------------------------------------ - -/** Read a complete message from a stream using a parser. - - This function is used to read a complete message from a stream into a - subclass of @ref basic_parser. - The call will block until one of the following conditions is true: - - @li @ref basic_parser::is_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or - more calls to the stream's `read_some` function. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b SyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param parser The parser to use. - - @return The number of bytes transferred to the parser. - - @throws system_error Thrown on failure. - - @note The implementation will call @ref basic_parser::eager - with the value `true` on the parser passed in. -*/ -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser); - -/** Read a complete message from a stream using a parser. - - This function is used to read a complete message from a stream into a - subclass of @ref basic_parser. - The call will block until one of the following conditions is true: - - @li @ref basic_parser::is_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or - more calls to the stream's `read_some` function. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b SyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param parser The parser to use. - - @param ec Set to the error, if any occurred. - - @return The number of bytes transferred to the parser. - - @note The implementation will call @ref basic_parser::eager - with the value `true` on the parser passed in. -*/ -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived> -std::size_t -read( - SyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - error_code& ec); - -/** Read a complete message from a stream asynchronously using a parser. - - This function is used to asynchronously read a complete message from a - stream into a subclass of @ref basic_parser. - The function call always returns immediately. The asynchronous operation - will continue until one of the following conditions is true: - - @li @ref basic_parser::is_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or more calls to - the stream's `async_read_some` function, and is known as a - <em>composed operation</em>. The program must ensure that the - stream performs no other reads until this operation completes. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b AsyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param parser The parser to use. - The object must remain valid at least until the - handler is called; ownership is not transferred. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation, - std::size_t bytes_transferred // the number of bytes transferred to the parser - ); @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`. - - @note The implementation will call @ref basic_parser::eager - with the value `true` on the parser passed in. -*/ -template< - class AsyncReadStream, - class DynamicBuffer, - bool isRequest, class Derived, - class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -async_read( - AsyncReadStream& stream, - DynamicBuffer& buffer, - basic_parser<isRequest, Derived>& parser, - ReadHandler&& handler); - -//------------------------------------------------------------------------------ - -/** Read a complete message from a stream. - - This function is used to read a complete message from a stream using HTTP/1. - The call will block until one of the following conditions is true: - - @li The entire message is read. - - @li An error occurs. - - This operation is implemented in terms of one or - more calls to the stream's `read_some` function. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b SyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param msg An object in which to store the message contents. - This object should not have previous contents, otherwise - the behavior is undefined. - The type must be @b MoveAssignable and @b MoveConstructible. - - @return The number of bytes transferred to the parser. - - @throws system_error Thrown on failure. -*/ -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Body, class Allocator> -std::size_t -read( - SyncReadStream& stream, - DynamicBuffer& buffer, - message<isRequest, Body, basic_fields<Allocator>>& msg); - -/** Read a complete message from a stream. - - This function is used to read a complete message from a stream using HTTP/1. - The call will block until one of the following conditions is true: - - @li The entire message is read. - - @li An error occurs. - - This operation is implemented in terms of one or - more calls to the stream's `read_some` function. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b SyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param msg An object in which to store the message contents. - This object should not have previous contents, otherwise - the behavior is undefined. - The type must be @b MoveAssignable and @b MoveConstructible. - - @param ec Set to the error, if any occurred. - - @return The number of bytes transferred to the parser. -*/ -template< - class SyncReadStream, - class DynamicBuffer, - bool isRequest, class Body, class Allocator> -std::size_t -read( - SyncReadStream& stream, - DynamicBuffer& buffer, - message<isRequest, Body, basic_fields<Allocator>>& msg, - error_code& ec); - -/** Read a complete message from a stream asynchronously. - - This function is used to asynchronously read a complete message from a - stream using HTTP/1. - The function call always returns immediately. The asynchronous operation - will continue until one of the following conditions is true: - - @li The entire message is read. - - @li An error occurs. - - This operation is implemented in terms of one or more calls to - the stream's `async_read_some` function, and is known as a - <em>composed operation</em>. The program must ensure that the - stream performs no other reads until this operation completes. - The implementation may read additional octets that lie past the - end of the message being read. This additional data is stored - in the dynamic buffer, which must be retained for subsequent reads. - - If the stream returns the error `boost::asio::error::eof` indicating the - end of file during a read, the error returned from this function will be: - - @li @ref error::end_of_stream if no octets were parsed, or - - @li @ref error::partial_message if any octets were parsed but the - message was incomplete, otherwise: - - @li A successful result. A subsequent attempt to read will - return @ref error::end_of_stream - - @param stream The stream from which the data is to be read. - The type must support the @b AsyncReadStream concept. - - @param buffer A @b DynamicBuffer holding additional bytes - read by the implementation from the stream. This is both - an input and an output parameter; on entry, any data in the - dynamic buffer's input sequence will be given to the parser - first. - - @param msg An object in which to store the message contents. - This object should not have previous contents, otherwise - the behavior is undefined. - The type must be @b MoveAssignable and @b MoveConstructible. - - The object must remain valid at least until the - handler is called; ownership is not transferred. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation, - std::size_t bytes_transferred // the number of bytes transferred to the parser - ); @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 AsyncReadStream, - class DynamicBuffer, - bool isRequest, class Body, class Allocator, - class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -async_read( - AsyncReadStream& stream, - DynamicBuffer& buffer, - message<isRequest, Body, basic_fields<Allocator>>& msg, - ReadHandler&& handler); - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/read.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/rfc7230.hpp b/contrib/restricted/boost/boost/beast/http/rfc7230.hpp deleted file mode 100644 index 952cb929d6..0000000000 --- a/contrib/restricted/boost/boost/beast/http/rfc7230.hpp +++ /dev/null @@ -1,329 +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_HTTP_RFC7230_HPP -#define BOOST_BEAST_HTTP_RFC7230_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/http/detail/rfc7230.hpp> -#include <boost/beast/http/detail/basic_parsed_list.hpp> - -namespace boost { -namespace beast { -namespace http { - -/** A list of parameters in an HTTP extension field value. - - This container allows iteration of the parameter list in an HTTP - extension. The parameter list is a series of name/value pairs - with each pair starting with a semicolon. The value is optional. - - If a parsing error is encountered while iterating the string, - the behavior of the container will be as if a string containing - only characters up to but excluding the first invalid character - was used to construct the list. - - @par BNF - @code - param-list = *( OWS ";" OWS param ) - param = token OWS [ "=" OWS ( token / quoted-string ) ] - @endcode - - To use this class, construct with the string to be parsed and - then use @ref begin and @ref end, or range-for to iterate each - item: - - @par Example - @code - for(auto const& param : param_list{";level=9;no_context_takeover;bits=15"}) - { - std::cout << ";" << param.first; - if(! param.second.empty()) - std::cout << "=" << param.second; - std::cout << "\n"; - } - @endcode -*/ -class param_list -{ - string_view s_; - -public: - /** The type of each element in the list. - - The first string in the pair is the name of the parameter, - and the second string in the pair is its value (which may - be empty). - */ - using value_type = - std::pair<string_view, string_view>; - - /// A constant iterator to the list -#if BOOST_BEAST_DOXYGEN - using const_iterator = implementation_defined; -#else - class const_iterator; -#endif - - /// Default constructor. - param_list() = default; - - /** Construct a list. - - @param s A string containing the list contents. The string - must remain valid for the lifetime of the container. - */ - explicit - param_list(string_view s) - : s_(s) - { - } - - /// Return a const iterator to the beginning of the list - const_iterator begin() const; - - /// Return a const iterator to the end of the list - const_iterator end() const; - - /// Return a const iterator to the beginning of the list - const_iterator cbegin() const; - - /// Return a const iterator to the end of the list - const_iterator cend() const; -}; - -//------------------------------------------------------------------------------ - -/** A list of extensions in a comma separated HTTP field value. - - This container allows iteration of the extensions in an HTTP - field value. The extension list is a comma separated list of - token parameter list pairs. - - If a parsing error is encountered while iterating the string, - the behavior of the container will be as if a string containing - only characters up to but excluding the first invalid character - was used to construct the list. - - @par BNF - @code - ext-list = *( "," OWS ) ext *( OWS "," [ OWS ext ] ) - ext = token param-list - param-list = *( OWS ";" OWS param ) - param = token OWS [ "=" OWS ( token / quoted-string ) ] - @endcode - - To use this class, construct with the string to be parsed and - then use @ref begin and @ref end, or range-for to iterate each - item: - - @par Example - @code - for(auto const& ext : ext_list{"none, 7z;level=9, zip;no_context_takeover;bits=15"}) - { - std::cout << ext.first << "\n"; - for(auto const& param : ext.second) - { - std::cout << ";" << param.first; - if(! param.second.empty()) - std::cout << "=" << param.second; - std::cout << "\n"; - } - } - @endcode -*/ -class ext_list -{ - using iter_type = string_view::const_iterator; - - string_view s_; - -public: - /** The type of each element in the list. - - The first element of the pair is the extension token, and the - second element of the pair is an iterable container holding the - extension's name/value parameters. - */ - using value_type = std::pair<string_view, param_list>; - - /// A constant iterator to the list -#if BOOST_BEAST_DOXYGEN - using const_iterator = implementation_defined; -#else - class const_iterator; -#endif - - /** Construct a list. - - @param s A string containing the list contents. The string - must remain valid for the lifetime of the container. - */ - explicit - ext_list(string_view s) - : s_(s) - { - } - - /// Return a const iterator to the beginning of the list - const_iterator begin() const; - - /// Return a const iterator to the end of the list - const_iterator end() const; - - /// Return a const iterator to the beginning of the list - const_iterator cbegin() const; - - /// Return a const iterator to the end of the list - const_iterator cend() const; - - /** Find a token in the list. - - @param s The token to find. A case-insensitive comparison is used. - - @return An iterator to the matching token, or `end()` if no - token exists. - */ - template<class T> - const_iterator - find(T const& s); - - /** Return `true` if a token is present in the list. - - @param s The token to find. A case-insensitive comparison is used. - */ - template<class T> - bool - exists(T const& s); -}; - -//------------------------------------------------------------------------------ - -/** A list of tokens in a comma separated HTTP field value. - - This container allows iteration of a list of items in a - header field value. The input is a comma separated list of - tokens. - - If a parsing error is encountered while iterating the string, - the behavior of the container will be as if a string containing - only characters up to but excluding the first invalid character - was used to construct the list. - - @par BNF - @code - token-list = *( "," OWS ) token *( OWS "," [ OWS token ] ) - @endcode - - To use this class, construct with the string to be parsed and - then use @ref begin and @ref end, or range-for to iterate each - item: - - @par Example - @code - for(auto const& token : token_list{"apple, pear, banana"}) - std::cout << token << "\n"; - @endcode -*/ -class token_list -{ - using iter_type = string_view::const_iterator; - - string_view s_; - -public: - /// The type of each element in the token list. - using value_type = string_view; - - /// A constant iterator to the list -#if BOOST_BEAST_DOXYGEN - using const_iterator = implementation_defined; -#else - class const_iterator; -#endif - - /** Construct a list. - - @param s A string containing the list contents. The string - must remain valid for the lifetime of the container. - */ - explicit - token_list(string_view s) - : s_(s) - { - } - - /// Return a const iterator to the beginning of the list - const_iterator begin() const; - - /// Return a const iterator to the end of the list - const_iterator end() const; - - /// Return a const iterator to the beginning of the list - const_iterator cbegin() const; - - /// Return a const iterator to the end of the list - const_iterator cend() const; - - /** Return `true` if a token is present in the list. - - @param s The token to find. A case-insensitive comparison is used. - */ - template<class T> - bool - exists(T const& s); -}; - -/** A list of tokens in a comma separated HTTP field value. - - This container allows iteration of a list of items in a - header field value. The input is a comma separated list of - tokens. - - If a parsing error is encountered while iterating the string, - the behavior of the container will be as if a string containing - only characters up to but excluding the first invalid character - was used to construct the list. - - @par BNF - @code - token-list = *( "," OWS ) token *( OWS "," [ OWS token ] ) - @endcode - - To use this class, construct with the string to be parsed and - then use `begin` and `end`, or range-for to iterate each item: - - @par Example - @code - for(auto const& token : token_list{"apple, pear, banana"}) - std::cout << token << "\n"; - @endcode -*/ -using opt_token_list = - detail::basic_parsed_list< - detail::opt_token_list_policy>; - -/** Returns `true` if a parsed list is parsed without errors. - - This function iterates a single pass through a parsed list - and returns `true` if there were no parsing errors, else - returns `false`. -*/ -template<class Policy> -bool -validate_list(detail::basic_parsed_list< - Policy> const& list); - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/rfc7230.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/serializer.hpp b/contrib/restricted/boost/boost/beast/http/serializer.hpp deleted file mode 100644 index bbb562a620..0000000000 --- a/contrib/restricted/boost/boost/beast/http/serializer.hpp +++ /dev/null @@ -1,398 +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_HTTP_SERIALIZER_HPP -#define BOOST_BEAST_HTTP_SERIALIZER_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/buffers_cat.hpp> -#include <boost/beast/core/buffers_prefix.hpp> -#include <boost/beast/core/buffers_suffix.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/variant.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/beast/http/chunk_encode.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/optional.hpp> - -namespace boost { -namespace beast { -namespace http { - -/** Provides buffer oriented HTTP message serialization functionality. - - An object of this type is used to serialize a complete - HTTP message into a sequence of octets. To use this class, - construct an instance with the message to be serialized. - The implementation will automatically perform chunk encoding - if the contents of the message indicate that chunk encoding - is required. - - Chunked output produced by the serializer never contains chunk - extensions or trailers, and the location of chunk boundaries - is not specified. If callers require chunk extensions, trailers, - or control over the exact contents of each chunk they should - use the serializer to write just the message header, and then - assume control over serializing the chunked payload by using - the chunk buffer sequence types @ref chunk_body, @ref chunk_crlf, - @ref chunk_header, and @ref chunk_last. - - @tparam isRequest `true` if the message is a request. - - @tparam Body The body type of the message. - - @tparam Fields The type of fields in the message. -*/ -template< - bool isRequest, - class Body, - class Fields = fields> -class serializer -{ -public: - static_assert(is_body<Body>::value, - "Body requirements not met"); - - static_assert(is_body_writer<Body>::value, - "BodyWriter requirements not met"); - - /** The type of message this serializer uses - - This may be const or non-const depending on the - implementation of the corresponding @b BodyWriter. - */ -#if BOOST_BEAST_DOXYGEN - using value_type = implementation_defined; -#else - using value_type = typename std::conditional< - (std::is_constructible<typename Body::writer, - header<isRequest, Fields>&, - typename Body::value_type&>::value && - ! std::is_constructible<typename Body::writer, - header<isRequest, Fields> const&, - typename Body::value_type const&>::value) || - // Deprecated BodyWriter Concept (v1.66) - (std::is_constructible<typename Body::writer, - message<isRequest, Body, Fields>&>::value && - ! std::is_constructible<typename Body::writer, - message<isRequest, Body, Fields> const&>::value), - message<isRequest, Body, Fields>, - message<isRequest, Body, Fields> const>::type; -#endif - -private: - enum - { - do_construct = 0, - - do_init = 10, - do_header_only = 20, - do_header = 30, - do_body = 40, - - do_init_c = 50, - do_header_only_c = 60, - do_header_c = 70, - do_body_c = 80, - do_final_c = 90, - #ifndef BOOST_BEAST_NO_BIG_VARIANTS - do_body_final_c = 100, - do_all_c = 110, - #endif - - do_complete = 120 - }; - - void fwrinit(std::true_type); - void fwrinit(std::false_type); - - template<std::size_t, class Visit> - void - do_visit(error_code& ec, Visit& visit); - - using writer = typename Body::writer; - - using cb1_t = buffers_suffix<typename - Fields::writer::const_buffers_type>; // header - using pcb1_t = buffers_prefix_view<cb1_t const&>; - - using cb2_t = buffers_suffix<buffers_cat_view< - typename Fields::writer::const_buffers_type,// header - typename writer::const_buffers_type>>; // body - using pcb2_t = buffers_prefix_view<cb2_t const&>; - - using cb3_t = buffers_suffix< - typename writer::const_buffers_type>; // body - using pcb3_t = buffers_prefix_view<cb3_t const&>; - - using cb4_t = buffers_suffix<buffers_cat_view< - typename Fields::writer::const_buffers_type,// header - detail::chunk_size, // chunk-size - boost::asio::const_buffer, // chunk-ext - chunk_crlf, // crlf - typename writer::const_buffers_type, // body - chunk_crlf>>; // crlf - using pcb4_t = buffers_prefix_view<cb4_t const&>; - - using cb5_t = buffers_suffix<buffers_cat_view< - detail::chunk_size, // chunk-header - boost::asio::const_buffer, // chunk-ext - chunk_crlf, // crlf - typename writer::const_buffers_type, // body - chunk_crlf>>; // crlf - using pcb5_t = buffers_prefix_view<cb5_t const&>; - - using cb6_t = buffers_suffix<buffers_cat_view< - detail::chunk_size, // chunk-header - boost::asio::const_buffer, // chunk-size - chunk_crlf, // crlf - typename writer::const_buffers_type, // body - chunk_crlf, // crlf - boost::asio::const_buffer, // chunk-final - boost::asio::const_buffer, // trailers - chunk_crlf>>; // crlf - using pcb6_t = buffers_prefix_view<cb6_t const&>; - - using cb7_t = buffers_suffix<buffers_cat_view< - typename Fields::writer::const_buffers_type,// header - detail::chunk_size, // chunk-size - boost::asio::const_buffer, // chunk-ext - chunk_crlf, // crlf - typename writer::const_buffers_type, // body - chunk_crlf, // crlf - boost::asio::const_buffer, // chunk-final - boost::asio::const_buffer, // trailers - chunk_crlf>>; // crlf - using pcb7_t = buffers_prefix_view<cb7_t const&>; - - using cb8_t = buffers_suffix<buffers_cat_view< - boost::asio::const_buffer, // chunk-final - boost::asio::const_buffer, // trailers - chunk_crlf>>; // crlf - using pcb8_t = buffers_prefix_view<cb8_t const&>; - - value_type& m_; - writer wr_; - boost::optional<typename Fields::writer> fwr_; - beast::detail::variant< - cb1_t, cb2_t, cb3_t, cb4_t, - cb5_t ,cb6_t, cb7_t, cb8_t> v_; - beast::detail::variant< - pcb1_t, pcb2_t, pcb3_t, pcb4_t, - pcb5_t ,pcb6_t, pcb7_t, pcb8_t> pv_; - std::size_t limit_ = - (std::numeric_limits<std::size_t>::max)(); - int s_ = do_construct; - bool split_ = false; - bool header_done_ = false; - bool more_; - - serializer(value_type& msg, std::true_type); - serializer(value_type& msg, std::false_type); -public: - /// Constructor - serializer(serializer&&) = default; - - /// Constructor - serializer(serializer const&) = default; - - /// Assignment - serializer& operator=(serializer const&) = delete; - - /** Constructor - - The implementation guarantees that the message passed on - construction will not be accessed until the first call to - @ref next. This allows the message to be lazily created. - For example, if the header is filled in before serialization. - - @param msg A reference to the message to serialize, which must - remain valid for the lifetime of the serializer. Depending on - the type of Body used, this may or may not be a `const` reference. - - @note This function participates in overload resolution only if - Body::writer is constructible from a `const` message reference. - */ - explicit - serializer(value_type& msg); - - /// Returns the message being serialized - value_type& - get() - { - return m_; - } - - /// Returns the serialized buffer size limit - std::size_t - limit() - { - return limit_; - } - - /** Set the serialized buffer size limit - - This function adjusts the limit on the maximum size of the - buffers passed to the visitor. The new size limit takes effect - in the following call to @ref next. - - The default is no buffer size limit. - - @param limit The new buffer size limit. If this number - is zero, the size limit is removed. - */ - void - limit(std::size_t limit) - { - limit_ = limit > 0 ? limit : - (std::numeric_limits<std::size_t>::max)(); - } - - /** Returns `true` if we will pause after writing the complete header. - */ - bool - split() - { - return split_; - } - - /** Set whether the header and body are written separately. - - When the split feature is enabled, the implementation will - write only the octets corresponding to the serialized header - first. If the header has already been written, this function - will have no effect on output. - */ - void - split(bool v) - { - split_ = v; - } - - /** Return `true` if serialization of the header is complete. - - This function indicates whether or not all buffers containing - serialized header octets have been retrieved. - */ - bool - is_header_done() - { - return header_done_; - } - - /** Return `true` if serialization is complete. - - The operation is complete when all octets corresponding - to the serialized representation of the message have been - successfully retrieved. - */ - bool - is_done() - { - return s_ == do_complete; - } - - /** Returns the next set of buffers in the serialization. - - This function will attempt to call the `visit` function - object with a @b ConstBufferSequence of unspecified type - representing the next set of buffers in the serialization - of the message represented by this object. - - If there are no more buffers in the serialization, the - visit function will not be called. In this case, no error - will be indicated, and the function @ref is_done will - return `true`. - - @param ec Set to the error, if any occurred. - - @param visit The function to call. The equivalent function - signature of this object must be: - @code - template<class ConstBufferSequence> - void visit(error_code&, ConstBufferSequence const&); - @endcode - The function is not copied, if no error occurs it will be - invoked before the call to @ref next returns. - - */ - template<class Visit> - void - next(error_code& ec, Visit&& visit); - - /** Consume buffer octets in the serialization. - - This function should be called after one or more octets - contained in the buffers provided in the prior call - to @ref next have been used. - - After a call to @ref consume, callers should check the - return value of @ref is_done to determine if the entire - message has been serialized. - - @param n The number of octets to consume. This number must - be greater than zero and no greater than the number of - octets in the buffers provided in the prior call to @ref next. - */ - void - consume(std::size_t n); - - /** Provides low-level access to the associated @b BodyWriter (DEPRECATED) - - This function provides access to the instance of the writer - associated with the body and created by the serializer - upon construction. The behavior of accessing this object - is defined by the specification of the particular writer - and its associated body. - - @return A reference to the writer. - */ - writer& - reader_impl() - { - #ifndef BOOST_BEAST_ALLOW_DEPRECATED - BOOST_STATIC_ASSERT_MSG(sizeof(Body) == 0, - BOOST_BEAST_DEPRECATION_STRING); - #endif - return wr_; - } - - /** Provides low-level access to the associated @b BodyWriter - - This function provides access to the instance of the writer - associated with the body and created by the serializer - upon construction. The behavior of accessing this object - is defined by the specification of the particular writer - and its associated body. - - @return A reference to the writer. - */ - writer& - writer_impl() - { - return wr_; - } -}; - -/// A serializer for HTTP/1 requests -template<class Body, class Fields = fields> -using request_serializer = serializer<true, Body, Fields>; - -/// A serializer for HTTP/1 responses -template<class Body, class Fields = fields> -using response_serializer = serializer<false, Body, Fields>; - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/serializer.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/span_body.hpp b/contrib/restricted/boost/boost/beast/http/span_body.hpp deleted file mode 100644 index 4688dc8741..0000000000 --- a/contrib/restricted/boost/boost/beast/http/span_body.hpp +++ /dev/null @@ -1,169 +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_HTTP_SPAN_BODY_HPP -#define BOOST_BEAST_HTTP_SPAN_BODY_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/span.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/optional.hpp> - -namespace boost { -namespace beast { -namespace http { - -/** A @b Body using @ref span - - This body uses @ref span as a memory-based container for - holding message payloads. The container represents a - non-owning reference to a continguous area of memory. - Messages using this body type may be serialized and - parsed. - - Unlike @ref buffer_body, only one buffer may be provided - during a parse or serialize operation. -*/ -template<class T> -struct span_body -{ -private: - static_assert(std::is_pod<T>::value, - "POD requirements not met"); - -public: - /** The type of container used for the body - - This determines the type of @ref message::body - when this body type is used with a message container. - */ - using value_type = span<T>; - - /** Returns the payload size of the body - - When this body is used with @ref message::prepare_payload, - the Content-Length will be set to the payload size, and - any chunked Transfer-Encoding will be removed. - */ - static - std::uint64_t - size(value_type const& body) - { - return body.size(); - } - - /** The algorithm for parsing the body - - Meets the requirements of @b BodyReader. - */ -#if BOOST_BEAST_DOXYGEN - using reader = implementation_defined; -#else - class reader - { - value_type& body_; - - public: - template<bool isRequest, class Fields> - explicit - reader(header<isRequest, Fields>&, value_type& b) - : body_(b) - { - } - - void - init(boost::optional< - std::uint64_t> const& length, error_code& ec) - { - if(length && *length > body_.size()) - { - ec = error::buffer_overflow; - return; - } - ec.assign(0, ec.category()); - } - - template<class ConstBufferSequence> - std::size_t - put(ConstBufferSequence const& buffers, - error_code& ec) - { - using boost::asio::buffer_size; - using boost::asio::buffer_copy; - auto const n = buffer_size(buffers); - auto const len = body_.size(); - if(n > len) - { - ec = error::buffer_overflow; - return 0; - } - ec.assign(0, ec.category()); - buffer_copy(boost::asio::buffer( - body_.data(), n), buffers); - body_ = value_type{ - body_.data() + n, body_.size() - n}; - return n; - } - - void - finish(error_code& ec) - { - ec.assign(0, ec.category()); - } - }; -#endif - - /** The algorithm for serializing the body - - Meets the requirements of @b BodyWriter. - */ -#if BOOST_BEAST_DOXYGEN - using writer = implementation_defined; -#else - class writer - { - value_type const& body_; - - public: - using const_buffers_type = - boost::asio::const_buffer; - - template<bool isRequest, class Fields> - explicit - writer(header<isRequest, Fields> const&, value_type const& b) - : body_(b) - { - } - - void - init(error_code& ec) - { - ec.assign(0, ec.category()); - } - - boost::optional<std::pair<const_buffers_type, bool>> - get(error_code& ec) - { - ec.assign(0, ec.category()); - return {{ - { body_.data(), - body_.size() * sizeof(typename - value_type::value_type)}, - false}}; - } - }; -#endif -}; - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/status.hpp b/contrib/restricted/boost/boost/beast/http/status.hpp deleted file mode 100644 index 8d7938ca0c..0000000000 --- a/contrib/restricted/boost/boost/beast/http/status.hpp +++ /dev/null @@ -1,167 +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_HTTP_STATUS_HPP -#define BOOST_BEAST_HTTP_STATUS_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/string.hpp> -#include <iosfwd> - -namespace boost { -namespace beast { -namespace http { - -enum class status : unsigned -{ - /** An unknown status-code. - - This value indicates that the value for the status code - is not in the list of commonly recognized status codes. - Callers interested in the exactly value should use the - interface which provides the raw integer. - */ - unknown = 0, - - continue_ = 100, - switching_protocols = 101, - processing = 102, - - ok = 200, - created = 201, - accepted = 202, - non_authoritative_information = 203, - no_content = 204, - reset_content = 205, - partial_content = 206, - multi_status = 207, - already_reported = 208, - im_used = 226, - - multiple_choices = 300, - moved_permanently = 301, - found = 302, - see_other = 303, - not_modified = 304, - use_proxy = 305, - temporary_redirect = 307, - permanent_redirect = 308, - - bad_request = 400, - unauthorized = 401, - payment_required = 402, - forbidden = 403, - not_found = 404, - method_not_allowed = 405, - not_acceptable = 406, - proxy_authentication_required = 407, - request_timeout = 408, - conflict = 409, - gone = 410, - length_required = 411, - precondition_failed = 412, - payload_too_large = 413, - uri_too_long = 414, - unsupported_media_type = 415, - range_not_satisfiable = 416, - expectation_failed = 417, - misdirected_request = 421, - unprocessable_entity = 422, - locked = 423, - failed_dependency = 424, - upgrade_required = 426, - precondition_required = 428, - too_many_requests = 429, - request_header_fields_too_large = 431, - connection_closed_without_response = 444, - unavailable_for_legal_reasons = 451, - client_closed_request = 499, - - internal_server_error = 500, - not_implemented = 501, - bad_gateway = 502, - service_unavailable = 503, - gateway_timeout = 504, - http_version_not_supported = 505, - variant_also_negotiates = 506, - insufficient_storage = 507, - loop_detected = 508, - not_extended = 510, - network_authentication_required = 511, - network_connect_timeout_error = 599 -}; - -/** Represents the class of a status-code. -*/ -enum class status_class : unsigned -{ - /// Unknown status-class - unknown = 0, - - /// The request was received, continuing processing. - informational = 1, - - /// The request was successfully received, understood, and accepted. - successful = 2, - - /// Further action needs to be taken in order to complete the request. - redirection = 3, - - /// The request contains bad syntax or cannot be fulfilled. - client_error = 4, - - /// The server failed to fulfill an apparently valid request. - server_error = 5, -}; - -/** Converts the integer to a known status-code. - - If the integer does not match a known status code, - @ref status::unknown is returned. -*/ -status -int_to_status(unsigned v); - -/** Convert an integer to a status_class. - - @param v The integer representing a status code. - - @return The status class. If the integer does not match - a known status class, @ref status_class::unknown is returned. -*/ -status_class -to_status_class(unsigned v); - -/** Convert a status_code to a status_class. - - @param v The status code to convert. - - @return The status class. -*/ -status_class -to_status_class(status v); - -/** Returns the obsolete reason-phrase text for a status code. - - @param v The status code to use. -*/ -string_view -obsolete_reason(status v); - -/// Outputs the standard reason phrase of a status code to a stream. -std::ostream& -operator<<(std::ostream&, status); - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/status.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/string_body.hpp b/contrib/restricted/boost/boost/beast/http/string_body.hpp deleted file mode 100644 index 89447e50ff..0000000000 --- a/contrib/restricted/boost/boost/beast/http/string_body.hpp +++ /dev/null @@ -1,197 +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_HTTP_STRING_BODY_HPP -#define BOOST_BEAST_HTTP_STRING_BODY_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/optional.hpp> -#include <cstdint> -#include <limits> -#include <memory> -#include <stdexcept> -#include <string> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/** A @b Body using `std::basic_string` - - This body uses `std::basic_string` as a memory-based container - for holding message payloads. Messages using this body type - may be serialized and parsed. -*/ -template< - class CharT, - class Traits = std::char_traits<CharT>, - class Allocator = std::allocator<CharT>> -struct basic_string_body -{ -private: - static_assert( - std::is_integral<CharT>::value && - sizeof(CharT) == 1, - "CharT requirements not met"); - -public: - /** The type of container used for the body - - This determines the type of @ref message::body - when this body type is used with a message container. - */ - using value_type = - std::basic_string<CharT, Traits, Allocator>; - - /** Returns the payload size of the body - - When this body is used with @ref message::prepare_payload, - the Content-Length will be set to the payload size, and - any chunked Transfer-Encoding will be removed. - */ - static - std::uint64_t - size(value_type const& body) - { - return body.size(); - } - - /** The algorithm for parsing the body - - Meets the requirements of @b BodyReader. - */ -#if BOOST_BEAST_DOXYGEN - using reader = implementation_defined; -#else - class reader - { - value_type& body_; - - public: - template<bool isRequest, class Fields> - explicit - reader(header<isRequest, Fields>&, value_type& b) - : body_(b) - { - } - - void - init(boost::optional< - std::uint64_t> const& length, error_code& ec) - { - if(length) - { - if(static_cast<std::size_t>(*length) != *length) - { - ec = error::buffer_overflow; - return; - } - try - { - body_.reserve( - static_cast<std::size_t>(*length)); - } - catch(std::exception const&) - { - ec = error::buffer_overflow; - return; - } - } - ec.assign(0, ec.category()); - } - - template<class ConstBufferSequence> - std::size_t - put(ConstBufferSequence const& buffers, - error_code& ec) - { - using boost::asio::buffer_size; - using boost::asio::buffer_copy; - auto const extra = buffer_size(buffers); - auto const size = body_.size(); - try - { - body_.resize(size + extra); - } - catch(std::exception const&) - { - ec = error::buffer_overflow; - return 0; - } - ec.assign(0, ec.category()); - CharT* dest = &body_[size]; - for(auto b : beast::detail::buffers_range(buffers)) - { - Traits::copy(dest, reinterpret_cast< - CharT const*>(b.data()), b.size()); - dest += b.size(); - } - return extra; - } - - void - finish(error_code& ec) - { - ec.assign(0, ec.category()); - } - }; -#endif - - /** The algorithm for serializing the body - - Meets the requirements of @b BodyWriter. - */ -#if BOOST_BEAST_DOXYGEN - using writer = implementation_defined; -#else - class writer - { - value_type const& body_; - - public: - using const_buffers_type = - boost::asio::const_buffer; - - template<bool isRequest, class Fields> - explicit - writer(header<isRequest, Fields> const&, value_type const& b) - : body_(b) - { - } - - void - init(error_code& ec) - { - ec.assign(0, ec.category()); - } - - boost::optional<std::pair<const_buffers_type, bool>> - get(error_code& ec) - { - ec.assign(0, ec.category()); - return {{const_buffers_type{ - body_.data(), body_.size()}, false}}; - } - }; -#endif -}; - -/// A @b Body using `std::string` -using string_body = basic_string_body<char>; - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/type_traits.hpp b/contrib/restricted/boost/boost/beast/http/type_traits.hpp deleted file mode 100644 index 0c8210443e..0000000000 --- a/contrib/restricted/boost/boost/beast/http/type_traits.hpp +++ /dev/null @@ -1,200 +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_HTTP_TYPE_TRAITS_HPP -#define BOOST_BEAST_HTTP_TYPE_TRAITS_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/http/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/optional.hpp> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -template<bool, class, class> -struct message; - -/** Determine if `T` meets the requirements of @b Body. - - This metafunction is equivalent to `std::true_type` - if `T` has a nested type named `value_type`. - - @tparam T The body type to test. - - @par Example - @code - template<bool isRequest, class Body, class Fields> - void check_body(message<isRequest, Body, Fields> const&) - { - static_assert(is_body<Body>::value, - "Body requirements not met"); - } - @endcode -*/ -template<class T> -#if BOOST_BEAST_DOXYGEN -struct is_body : std::integral_constant<bool, ...>{}; -#else -using is_body = detail::has_value_type<T>; -#endif - -/** Determine if a @b Body type has a reader. - - This metafunction is equivalent to `std::true_type` if: - - @li `T` has a nested type named `reader` - - @li The nested type meets the requirements of @b BodyWriter. - - @tparam T The body type to test. - - @par Example - @code - template<bool isRequest, class Body, class Fields> - void check_can_serialize(message<isRequest, Body, Fields> const&) - { - static_assert(is_body_writer<Body>::value, - "Cannot serialize Body, no reader"); - } - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_body_writer : std::integral_constant<bool, ...> {}; -#else -template<class T, class = void> -struct is_body_writer : std::false_type {}; - -template<class T> -struct is_body_writer<T, beast::detail::void_t< - typename T::writer, - typename T::writer::const_buffers_type, - decltype( - std::declval<typename T::writer&>().init(std::declval<error_code&>()), - std::declval<boost::optional<std::pair< - typename T::writer::const_buffers_type, bool>>&>() = - std::declval<typename T::writer>().get(std::declval<error_code&>()), - (void)0)>> : std::integral_constant<bool, - boost::asio::is_const_buffer_sequence< - typename T::writer::const_buffers_type>::value && ( - (std::is_constructible<typename T::writer, - header<true, detail::fields_model>&, - typename T::value_type&>::value && - std::is_constructible<typename T::writer, - header<false, detail::fields_model>&, - typename T::value_type&>::value) || - // Deprecated BodyWriter Concept (v1.66) - (std::is_constructible<typename T::writer, - message<true, T, detail::fields_model>&>::value && - std::is_constructible<typename T::writer, - message<false, T, detail::fields_model>&>::value) - ) - > {}; -#endif - -/** Determine if a @b Body type has a reader. - - This metafunction is equivalent to `std::true_type` if: - - @li `T` has a nested type named `reader` - - @li The nested type meets the requirements of @b BodyReader. - - @tparam T The body type to test. - - @par Example - @code - template<bool isRequest, class Body, class Fields> - void check_can_parse(message<isRequest, Body, Fields>&) - { - static_assert(is_body_reader<Body>::value, - "Cannot parse Body, no reader"); - } - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_body_reader : std::integral_constant<bool, ...> {}; -#else -template<class T, class = void> -struct is_body_reader : std::false_type {}; - -template<class T> -struct is_body_reader<T, beast::detail::void_t<decltype( - std::declval<typename T::reader&>().init( - boost::optional<std::uint64_t>(), - std::declval<error_code&>()), - std::declval<std::size_t&>() = - std::declval<typename T::reader&>().put( - std::declval<boost::asio::const_buffer>(), - std::declval<error_code&>()), - std::declval<typename T::reader&>().finish( - std::declval<error_code&>()), - (void)0)>> : std::integral_constant<bool, - (std::is_constructible<typename T::reader, - header<true, detail::fields_model>&, - typename T::value_type&>::value && - std::is_constructible<typename T::reader, - header<false,detail::fields_model>&, - typename T::value_type&>::value) || - // Deprecated BodyReader Concept (v1.66) - (std::is_constructible<typename T::reader, - message<true, T, detail::fields_model>&>::value && - std::is_constructible<typename T::reader, - message<false, T, detail::fields_model>&>::value) - > -{ -}; -#endif - -/** Determine if `T` meets the requirements of @b Fields - - @tparam T The body type to test. - - @par Example - - Use with `static_assert`: - - @code - template<bool isRequest, class Body, class Fields> - void f(message<isRequest, Body, Fields> const&) - { - static_assert(is_fields<Fields>::value, - "Fields requirements not met"); - ... - @endcode - - Use with `std::enable_if` (SFINAE): - - @code - template<bool isRequest, class Body, class Fields> - typename std::enable_if<is_fields<Fields>::value>::type - f(message<isRequest, Body, Fields> const&); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template<class T> -struct is_fields : std::integral_constant<bool, ...> {}; -#else -template<class T> -using is_fields = typename detail::is_fields_helper<T>::type; -#endif - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/vector_body.hpp b/contrib/restricted/boost/boost/beast/http/vector_body.hpp deleted file mode 100644 index 40c885e43e..0000000000 --- a/contrib/restricted/boost/boost/beast/http/vector_body.hpp +++ /dev/null @@ -1,183 +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_HTTP_VECTOR_BODY_HPP -#define BOOST_BEAST_HTTP_VECTOR_BODY_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/http/error.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/optional.hpp> -#include <cstdint> -#include <limits> -#include <memory> -#include <stdexcept> -#include <string> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/** A @b Body using `std::vector` - - This body uses `std::vector` as a memory-based container - for holding message payloads. Messages using this body type - may be serialized and parsed. -*/ -template<class T, class Allocator = std::allocator<T>> -struct vector_body -{ -private: - static_assert(sizeof(T) == 1 && - std::is_integral<T>::value, - "T requirements not met"); - -public: - /** The type of container used for the body - - This determines the type of @ref message::body - when this body type is used with a message container. - */ - using value_type = std::vector<T, Allocator>; - - /** Returns the payload size of the body - - When this body is used with @ref message::prepare_payload, - the Content-Length will be set to the payload size, and - any chunked Transfer-Encoding will be removed. - */ - static - std::uint64_t - size(value_type const& body) - { - return body.size(); - } - - /** The algorithm for parsing the body - - Meets the requirements of @b BodyReader. - */ -#if BOOST_BEAST_DOXYGEN - using reader = implementation_defined; -#else - class reader - { - value_type& body_; - - public: - template<bool isRequest, class Fields> - explicit - reader(header<isRequest, Fields>&, value_type& b) - : body_(b) - { - } - - void - init(boost::optional< - std::uint64_t> const& length, error_code& ec) - { - if(length) - { - if(static_cast<std::size_t>(*length) != *length) - { - ec = error::buffer_overflow; - return; - } - try - { - body_.reserve( - static_cast<std::size_t>(*length)); - } - catch(std::exception const&) - { - ec = error::buffer_overflow; - return; - } - } - ec.assign(0, ec.category()); - } - - template<class ConstBufferSequence> - std::size_t - put(ConstBufferSequence const& buffers, - error_code& ec) - { - using boost::asio::buffer_size; - using boost::asio::buffer_copy; - auto const n = buffer_size(buffers); - auto const len = body_.size(); - try - { - body_.resize(len + n); - } - catch(std::exception const&) - { - ec = error::buffer_overflow; - return 0; - } - ec.assign(0, ec.category()); - return buffer_copy(boost::asio::buffer( - &body_[0] + len, n), buffers); - } - - void - finish(error_code& ec) - { - ec.assign(0, ec.category()); - } - }; -#endif - - /** The algorithm for serializing the body - - Meets the requirements of @b BodyWriter. - */ -#if BOOST_BEAST_DOXYGEN - using writer = implementation_defined; -#else - class writer - { - value_type const& body_; - - public: - using const_buffers_type = - boost::asio::const_buffer; - - template<bool isRequest, class Fields> - explicit - writer(header<isRequest, Fields> const&, value_type const& b) - : body_(b) - { - } - - void - init(error_code& ec) - { - ec.assign(0, ec.category()); - } - - boost::optional<std::pair<const_buffers_type, bool>> - get(error_code& ec) - { - ec.assign(0, ec.category()); - return {{const_buffers_type{ - body_.data(), body_.size()}, false}}; - } - }; -#endif -}; - -} // http -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/verb.hpp b/contrib/restricted/boost/boost/beast/http/verb.hpp deleted file mode 100644 index 1540a243e8..0000000000 --- a/contrib/restricted/boost/boost/beast/http/verb.hpp +++ /dev/null @@ -1,157 +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_HTTP_VERB_HPP -#define BOOST_BEAST_HTTP_VERB_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/string.hpp> -#include <iosfwd> - -namespace boost { -namespace beast { -namespace http { - -/** HTTP request method verbs - - Each verb corresponds to a particular method string - used in HTTP request messages. -*/ -enum class verb -{ - /** An unknown method. - - This value indicates that the request method string is not - one of the recognized verbs. Callers interested in the method - should use an interface which returns the original string. - */ - unknown = 0, - - /// The DELETE method deletes the specified resource - delete_, - - /** The GET method requests a representation of the specified resource. - - Requests using GET should only retrieve data and should have no other effect. - */ - get, - - /** The HEAD method asks for a response identical to that of a GET request, but without the response body. - - This is useful for retrieving meta-information written in response - headers, without having to transport the entire content. - */ - head, - - /** The POST method requests that the server accept the entity enclosed in the request as a new subordinate of the web resource identified by the URI. - - The data POSTed might be, for example, an annotation for existing - resources; a message for a bulletin board, newsgroup, mailing list, - or comment thread; a block of data that is the result of submitting - a web form to a data-handling process; or an item to add to a database - */ - post, - - /** The PUT method requests that the enclosed entity be stored under the supplied URI. - - If the URI refers to an already existing resource, it is modified; - if the URI does not point to an existing resource, then the server - can create the resource with that URI. - */ - put, - - /** The CONNECT method converts the request connection to a transparent TCP/IP tunnel. - - This is usually to facilitate SSL-encrypted communication (HTTPS) - through an unencrypted HTTP proxy. - */ - connect, - - /** The OPTIONS method returns the HTTP methods that the server supports for the specified URL. - - This can be used to check the functionality of a web server by requesting - '*' instead of a specific resource. - */ - options, - - /** The TRACE method echoes the received request so that a client can see what (if any) changes or additions have been made by intermediate servers. - */ - trace, - - // WebDAV - - copy, - lock, - mkcol, - move, - propfind, - proppatch, - search, - unlock, - bind, - rebind, - unbind, - acl, - - // subversion - - report, - mkactivity, - checkout, - merge, - - // upnp - - msearch, - notify, - subscribe, - unsubscribe, - - // RFC-5789 - - patch, - purge, - - // CalDAV - - mkcalendar, - - // RFC-2068, section 19.6.1.2 - - link, - unlink -}; - -/** Converts a string to the request method verb. - - If the string does not match a known request method, - @ref verb::unknown is returned. -*/ -verb -string_to_verb(string_view s); - -/// Returns the text representation of a request method verb. -string_view -to_string(verb v); - -/// Write the text for a request method verb to an output stream. -inline -std::ostream& -operator<<(std::ostream& os, verb v) -{ - return os << to_string(v); -} - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/verb.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/http/write.hpp b/contrib/restricted/boost/boost/beast/http/write.hpp deleted file mode 100644 index 3b916b1d7b..0000000000 --- a/contrib/restricted/boost/boost/beast/http/write.hpp +++ /dev/null @@ -1,569 +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_HTTP_WRITE_HPP -#define BOOST_BEAST_HTTP_WRITE_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/buffers_cat.hpp> -#include <boost/beast/core/buffers_suffix.hpp> -#include <boost/beast/core/multi_buffer.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/beast/http/serializer.hpp> -#include <boost/beast/http/detail/chunk_encode.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/asio/async_result.hpp> -#include <iosfwd> -#include <limits> -#include <memory> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace http { - -/** Write part of a message to a stream using a serializer. - - This function is used to write part of a message to a stream using - a caller-provided HTTP/1 serializer. The call will block until one - of the following conditions is true: - - @li One or more bytes have been transferred. - - @li The function @ref serializer::is_done returns `true` - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls - to the stream's `write_some` function. - - The amount of data actually transferred is controlled by the behavior - of the underlying stream, subject to the buffer size limit of the - serializer obtained or set through a call to @ref serializer::limit. - Setting a limit and performing bounded work helps applications set - reasonable timeouts. It also allows application-level flow control - to function correctly. For example when using a TCP/IP based - stream. - - @param stream The stream to which the data is to be written. - The type must support the @b SyncWriteStream concept. - - @param sr The serializer to use. - - @return The number of bytes written to the stream. - - @throws system_error Thrown on failure. - - @see serializer -*/ -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write_some( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr); - -/** Write part of a message to a stream using a serializer. - - This function is used to write part of a message to a stream using - a caller-provided HTTP/1 serializer. The call will block until one - of the following conditions is true: - - @li One or more bytes have been transferred. - - @li The function @ref serializer::is_done returns `true` - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls - to the stream's `write_some` function. - - The amount of data actually transferred is controlled by the behavior - of the underlying stream, subject to the buffer size limit of the - serializer obtained or set through a call to @ref serializer::limit. - Setting a limit and performing bounded work helps applications set - reasonable timeouts. It also allows application-level flow control - to function correctly. For example when using a TCP/IP based - stream. - - @param stream The stream to which the data is to be written. - The type must support the @b SyncWriteStream concept. - - @param sr The serializer to use. - - @param ec Set to indicate what error occurred, if any. - - @return The number of bytes written to the stream. - - @see @ref async_write_some, @ref serializer -*/ -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write_some( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - error_code& ec); - -/** Write part of a message to a stream asynchronously using a serializer. - - This function is used to write part of a message to a stream - asynchronously using a caller-provided HTTP/1 serializer. The function - call always returns immediately. The asynchronous operation will continue - until one of the following conditions is true: - - @li One or more bytes have been transferred. - - @li The function @ref serializer::is_done returns `true` - - @li An error occurs on the stream. - - This operation is implemented in terms of zero or more calls to the stream's - `async_write_some` function, and is known as a <em>composed operation</em>. - The program must ensure that the stream performs no other writes - until this operation completes. - - The amount of data actually transferred is controlled by the behavior - of the underlying stream, subject to the buffer size limit of the - serializer obtained or set through a call to @ref serializer::limit. - Setting a limit and performing bounded work helps applications set - reasonable timeouts. It also allows application-level flow control - to function correctly. For example when using a TCP/IP based - stream. - - @param stream The stream to which the data is to be written. - The type must support the @b AsyncWriteStream concept. - - @param sr The serializer to use. - The object must remain valid at least until the - handler is called; ownership is not transferred. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation - std::size_t bytes_transferred // the number of bytes written to the stream - ); @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`. - - @see @ref serializer -*/ -template< - class AsyncWriteStream, - bool isRequest, class Body, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write_some( - AsyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - WriteHandler&& handler); - -//------------------------------------------------------------------------------ - -/** Write a header to a stream using a serializer. - - This function is used to write a header to a stream using a - caller-provided HTTP/1 serializer. The call will block until one - of the following conditions is true: - - @li The function @ref serializer::is_header_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or more calls - to the stream's `write_some` function. - - @param stream The stream to which the data is to be written. - The type must support the @b SyncWriteStream concept. - - @param sr The serializer to use. - - @return The number of bytes written to the stream. - - @throws system_error Thrown on failure. - - @note The implementation will call @ref serializer::split with - the value `true` on the serializer passed in. - - @see @ref serializer -*/ -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write_header( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr); - -/** Write a header to a stream using a serializer. - - This function is used to write a header to a stream using a - caller-provided HTTP/1 serializer. The call will block until one - of the following conditions is true: - - @li The function @ref serializer::is_header_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or more calls - to the stream's `write_some` function. - - @param stream The stream to which the data is to be written. - The type must support the @b SyncWriteStream concept. - - @param sr The serializer to use. - - @param ec Set to indicate what error occurred, if any. - - @return The number of bytes written to the stream. - - @note The implementation will call @ref serializer::split with - the value `true` on the serializer passed in. - - @see @ref serializer -*/ -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write_header( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - error_code& ec); - -/** Write a header to a stream asynchronously using a serializer. - - This function is used to write a header to a stream asynchronously - using a caller-provided HTTP/1 serializer. The function call always - returns immediately. The asynchronous operation will continue until - one of the following conditions is true: - - @li The function @ref serializer::is_header_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of zero or more calls to the stream's - `async_write_some` function, and is known as a <em>composed operation</em>. - The program must ensure that the stream performs no other writes - until this operation completes. - - @param stream The stream to which the data is to be written. - The type must support the @b AsyncWriteStream concept. - - @param sr The serializer to use. - The object must remain valid at least until the - handler is called; ownership is not transferred. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation - std::size_t bytes_transferred // the number of bytes written to the stream - ); @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`. - - @note The implementation will call @ref serializer::split with - the value `true` on the serializer passed in. - - @see @ref serializer -*/ -template< - class AsyncWriteStream, - bool isRequest, class Body, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write_header( - AsyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - WriteHandler&& handler); - -//------------------------------------------------------------------------------ - -/** Write a complete message to a stream using a serializer. - - This function is used to write a complete message to a stream using - a caller-provided HTTP/1 serializer. The call will block until one - of the following conditions is true: - - @li The function @ref serializer::is_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or more calls - to the stream's `write_some` function. - - @param stream The stream to which the data is to be written. - The type must support the @b SyncWriteStream concept. - - @param sr The serializer to use. - - @return The number of bytes written to the stream. - - @throws system_error Thrown on failure. - - @see @ref serializer -*/ -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr); - -/** Write a complete message to a stream using a serializer. - - This function is used to write a complete message to a stream using - a caller-provided HTTP/1 serializer. The call will block until one - of the following conditions is true: - - @li The function @ref serializer::is_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of one or more calls - to the stream's `write_some` function. - - @param stream The stream to which the data is to be written. - The type must support the @b SyncWriteStream concept. - - @param sr The serializer to use. - - @param ec Set to the error, if any occurred. - - @return The number of bytes written to the stream. - - @see @ref serializer -*/ -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write( - SyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - error_code& ec); - -/** Write a complete message to a stream asynchronously using a serializer. - - This function is used to write a complete message to a stream - asynchronously using a caller-provided HTTP/1 serializer. The - function call always returns immediately. The asynchronous - operation will continue until one of the following conditions is true: - - @li The function @ref serializer::is_done returns `true` - - @li An error occurs. - - This operation is implemented in terms of zero or more calls to the stream's - `async_write_some` function, and is known as a <em>composed operation</em>. - The program must ensure that the stream performs no other writes - until this operation completes. - - @param stream The stream to which the data is to be written. - The type must support the @b AsyncWriteStream concept. - - @param sr The serializer to use. - The object must remain valid at least until the - handler is called; ownership is not transferred. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation - std::size_t bytes_transferred // the number of bytes written to the stream - ); @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`. - - @see @ref serializer -*/ -template< - class AsyncWriteStream, - bool isRequest, class Body, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write( - AsyncWriteStream& stream, - serializer<isRequest, Body, Fields>& sr, - WriteHandler&& handler); - -//------------------------------------------------------------------------------ - -/** Write a complete message to a stream. - - This function is used to write a complete message to a stream using - HTTP/1. The call will block until one of the following conditions is true: - - @li The entire message is written. - - @li An error occurs. - - This operation is implemented in terms of one or more calls to the stream's - `write_some` function. The algorithm will use a temporary @ref serializer - with an empty chunk decorator to produce buffers. - - @param stream The stream to which the data is to be written. - The type must support the @b SyncWriteStream concept. - - @param msg The message to write. - - @return The number of bytes written to the stream. - - @throws system_error Thrown on failure. - - @see @ref message -*/ -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write( - SyncWriteStream& stream, - message<isRequest, Body, Fields> const& msg); - -/** Write a complete message to a stream. - - This function is used to write a complete message to a stream using - HTTP/1. The call will block until one of the following conditions is true: - - @li The entire message is written. - - @li An error occurs. - - This operation is implemented in terms of one or more calls to the stream's - `write_some` function. The algorithm will use a temporary @ref serializer - with an empty chunk decorator to produce buffers. - - @param stream The stream to which the data is to be written. - The type must support the @b SyncWriteStream concept. - - @param msg The message to write. - - @param ec Set to the error, if any occurred. - - @return The number of bytes written to the stream. - - @see @ref message -*/ -template< - class SyncWriteStream, - bool isRequest, class Body, class Fields> -std::size_t -write( - SyncWriteStream& stream, - message<isRequest, Body, Fields> const& msg, - error_code& ec); - -/** Write a complete message to a stream asynchronously. - - This function is used to write a complete message to a stream asynchronously - using HTTP/1. The function call always returns immediately. The asynchronous - operation will continue until one of the following conditions is true: - - @li The entire message is written. - - @li An error occurs. - - This operation is implemented in terms of zero or more calls to the stream's - `async_write_some` function, and is known as a <em>composed operation</em>. - The program must ensure that the stream performs no other writes - until this operation completes. The algorithm will use a temporary - @ref serializer with an empty chunk decorator to produce buffers. - - @param stream The stream to which the data is to be written. - The type must support the @b AsyncWriteStream concept. - - @param msg The message to write. - The object must remain valid at least until the - handler is called; ownership is not transferred. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error, // result of operation - std::size_t bytes_transferred // the number of bytes written to the stream - ); @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`. - - @see @ref message -*/ -template< - class AsyncWriteStream, - bool isRequest, class Body, class Fields, - class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -async_write( - AsyncWriteStream& stream, - message<isRequest, Body, Fields>& msg, - WriteHandler&& handler); - -//------------------------------------------------------------------------------ - -/** Serialize an HTTP/1 header to a `std::ostream`. - - The function converts the header to its HTTP/1 serialized - representation and stores the result in the output stream. - - @param os The output stream to write to. - - @param msg The message fields to write. -*/ -template<bool isRequest, class Fields> -std::ostream& -operator<<(std::ostream& os, - header<isRequest, Fields> const& msg); - -/** Serialize an HTTP/1 message to a `std::ostream`. - - The function converts the message to its HTTP/1 serialized - representation and stores the result in the output stream. - - The implementation will automatically perform chunk encoding if - the contents of the message indicate that chunk encoding is required. - - @param os The output stream to write to. - - @param msg The message to write. -*/ -template<bool isRequest, class Body, class Fields> -std::ostream& -operator<<(std::ostream& os, - message<isRequest, Body, Fields> const& msg); - -} // http -} // beast -} // boost - -#include <boost/beast/http/impl/write.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/version.hpp b/contrib/restricted/boost/boost/beast/version.hpp deleted file mode 100644 index c0c7b6fb06..0000000000 --- a/contrib/restricted/boost/boost/beast/version.hpp +++ /dev/null @@ -1,28 +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_VERSION_HPP -#define BOOST_BEAST_VERSION_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/config.hpp> - -/** @def BOOST_BEAST_API_VERSION - - Identifies the API version of Beast. - - This is a simple integer that is incremented by one every - time a set of code changes is merged to the develop branch. -*/ -#define BOOST_BEAST_VERSION 167 - -#define BOOST_BEAST_VERSION_STRING "Boost.Beast/" BOOST_STRINGIZE(BOOST_BEAST_VERSION) - -#endif - diff --git a/contrib/restricted/boost/boost/beast/websocket.hpp b/contrib/restricted/boost/boost/beast/websocket.hpp deleted file mode 100644 index 551eaff47b..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket.hpp +++ /dev/null @@ -1,22 +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_WEBSOCKET_HPP -#define BOOST_BEAST_WEBSOCKET_HPP - -#include <boost/beast/core/detail/config.hpp> - -#include <boost/beast/websocket/error.hpp> -#include <boost/beast/websocket/option.hpp> -#include <boost/beast/websocket/rfc6455.hpp> -#include <boost/beast/websocket/stream.hpp> -#include <boost/beast/websocket/stream_fwd.hpp> -#include <boost/beast/websocket/teardown.hpp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/detail/error.hpp b/contrib/restricted/boost/boost/beast/websocket/detail/error.hpp deleted file mode 100644 index 57b837bd4c..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/detail/error.hpp +++ /dev/null @@ -1,78 +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_WEBSOCKET_DETAIL_ERROR_IPP -#define BOOST_BEAST_WEBSOCKET_DETAIL_ERROR_IPP - -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/string.hpp> - -namespace boost { - -namespace beast { -namespace websocket { -enum class error; -enum class condition; -} // websocket -} // beast - -namespace system { -template<> -struct is_error_code_enum<beast::websocket::error> -{ - static bool const value = true; -}; -template<> -struct is_error_condition_enum<beast::websocket::condition> -{ - static bool const value = true; -}; -} // system - -namespace beast { -namespace websocket { -namespace detail { - -class error_codes : public error_category -{ -public: - const char* - name() const noexcept override; - - std::string - message(int ev) const override; - - error_condition - default_error_condition(int ev) const noexcept override; -}; - -class error_conditions : public error_category -{ -public: - const char* - name() const noexcept override; - - std::string - message(int cv) const override; -}; - -} // detail - -error_code -make_error_code(error e); - -error_condition -make_error_condition(condition c); - -} // websocket -} // beast - -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/detail/frame.hpp b/contrib/restricted/boost/boost/beast/websocket/detail/frame.hpp deleted file mode 100644 index c3bd1690a9..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/detail/frame.hpp +++ /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_WEBSOCKET_DETAIL_FRAME_HPP -#define BOOST_BEAST_WEBSOCKET_DETAIL_FRAME_HPP - -#include <boost/beast/websocket/error.hpp> -#include <boost/beast/websocket/rfc6455.hpp> -#include <boost/beast/websocket/detail/utf8_checker.hpp> -#include <boost/beast/core/buffers_suffix.hpp> -#include <boost/beast/core/flat_static_buffer.hpp> -#include <boost/beast/core/static_string.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/assert.hpp> -#include <boost/endian/buffers.hpp> -#include <cstdint> - -namespace boost { -namespace beast { -namespace websocket { -namespace detail { - -inline -std::uint16_t -big_uint16_to_native(void const* buf) -{ - auto const p = reinterpret_cast< - std::uint8_t const*>(buf); - return (p[0]<<8) + p[1]; -} - -inline -std::uint64_t -big_uint64_to_native(void const* buf) -{ - auto const p = reinterpret_cast< - std::uint8_t const*>(buf); - return - (static_cast<std::uint64_t>(p[0])<<56) + - (static_cast<std::uint64_t>(p[1])<<48) + - (static_cast<std::uint64_t>(p[2])<<40) + - (static_cast<std::uint64_t>(p[3])<<32) + - (static_cast<std::uint64_t>(p[4])<<24) + - (static_cast<std::uint64_t>(p[5])<<16) + - (static_cast<std::uint64_t>(p[6])<< 8) + - p[7]; -} - -inline -std::uint32_t -little_uint32_to_native(void const* buf) -{ - auto const p = reinterpret_cast< - std::uint8_t const*>(buf); - return - p[0] + - (static_cast<std::uint32_t>(p[1])<< 8) + - (static_cast<std::uint32_t>(p[2])<<16) + - (static_cast<std::uint32_t>(p[3])<<24); -} - -inline -void -native_to_little_uint32(std::uint32_t v, void* buf) -{ - auto p = reinterpret_cast<std::uint8_t*>(buf); - p[0] = v & 0xff; - p[1] = (v >> 8) & 0xff; - p[2] = (v >> 16) & 0xff; - p[3] = (v >> 24) & 0xff; -} - -// frame header opcodes -enum class opcode : std::uint8_t -{ - cont = 0, - text = 1, - binary = 2, - rsv3 = 3, - rsv4 = 4, - rsv5 = 5, - rsv6 = 6, - rsv7 = 7, - close = 8, - ping = 9, - pong = 10, - crsvb = 11, - crsvc = 12, - crsvd = 13, - crsve = 14, - crsvf = 15 -}; - -// Contents of a WebSocket frame header -struct frame_header -{ - std::uint64_t len; - std::uint32_t key; - opcode op; - bool fin : 1; - bool mask : 1; - bool rsv1 : 1; - bool rsv2 : 1; - bool rsv3 : 1; -}; - -// holds the largest possible frame header -using fh_buffer = flat_static_buffer<14>; - -// holds the largest possible control frame -using frame_buffer = - flat_static_buffer< 2 + 8 + 4 + 125 >; - -inline -bool constexpr -is_reserved(opcode op) -{ - return - (op >= opcode::rsv3 && op <= opcode::rsv7) || - (op >= opcode::crsvb && op <= opcode::crsvf); -} - -inline -bool constexpr -is_valid(opcode op) -{ - return op <= opcode::crsvf; -} - -inline -bool constexpr -is_control(opcode op) -{ - return op >= opcode::close; -} - -inline -bool -is_valid_close_code(std::uint16_t v) -{ - switch(v) - { - case close_code::normal: // 1000 - case close_code::going_away: // 1001 - case close_code::protocol_error: // 1002 - case close_code::unknown_data: // 1003 - case close_code::bad_payload: // 1007 - case close_code::policy_error: // 1008 - case close_code::too_big: // 1009 - case close_code::needs_extension: // 1010 - case close_code::internal_error: // 1011 - case close_code::service_restart: // 1012 - case close_code::try_again_later: // 1013 - return true; - - // explicitly reserved - case close_code::reserved1: // 1004 - case close_code::no_status: // 1005 - case close_code::abnormal: // 1006 - case close_code::reserved2: // 1014 - case close_code::reserved3: // 1015 - return false; - } - // reserved - if(v >= 1016 && v <= 2999) - return false; - // not used - if(v <= 999) - return false; - return true; -} - -//------------------------------------------------------------------------------ - -// Write frame header to dynamic buffer -// -template<class DynamicBuffer> -void -write(DynamicBuffer& db, frame_header const& fh) -{ - using boost::asio::buffer; - using boost::asio::buffer_copy; - using namespace boost::endian; - std::size_t n; - std::uint8_t b[14]; - b[0] = (fh.fin ? 0x80 : 0x00) | static_cast<std::uint8_t>(fh.op); - if(fh.rsv1) - b[0] |= 0x40; - if(fh.rsv2) - b[0] |= 0x20; - if(fh.rsv3) - b[0] |= 0x10; - b[1] = fh.mask ? 0x80 : 0x00; - if(fh.len <= 125) - { - b[1] |= fh.len; - n = 2; - } - else if(fh.len <= 65535) - { - b[1] |= 126; - ::new(&b[2]) big_uint16_buf_t{ - (std::uint16_t)fh.len}; - n = 4; - } - else - { - b[1] |= 127; - ::new(&b[2]) big_uint64_buf_t{fh.len}; - n = 10; - } - if(fh.mask) - { - native_to_little_uint32(fh.key, &b[n]); - n += 4; - } - db.commit(buffer_copy( - db.prepare(n), buffer(b))); -} - -// Read data from buffers -// This is for ping and pong payloads -// -template<class Buffers> -void -read_ping(ping_data& data, Buffers const& bs) -{ - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - using boost::asio::mutable_buffer; - BOOST_ASSERT(buffer_size(bs) <= data.max_size()); - data.resize(buffer_size(bs)); - buffer_copy(mutable_buffer{ - data.data(), data.size()}, bs); -} - -// Read close_reason, return true on success -// This is for the close payload -// -template<class Buffers> -void -read_close( - close_reason& cr, - Buffers const& bs, - error_code& ec) -{ - using boost::asio::buffer; - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - using namespace boost::endian; - auto n = buffer_size(bs); - BOOST_ASSERT(n <= 125); - if(n == 0) - { - cr = close_reason{}; - ec.assign(0, ec.category()); - return; - } - if(n == 1) - { - // invalid payload size == 1 - ec = error::bad_close_size; - return; - } - buffers_suffix<Buffers> cb(bs); - { - std::uint8_t b[2]; - buffer_copy(buffer(b), cb); - cr.code = big_uint16_to_native(&b[0]); - cb.consume(2); - n -= 2; - if(! is_valid_close_code(cr.code)) - { - // invalid close code - ec = error::bad_close_code; - return; - } - } - if(n > 0) - { - cr.reason.resize(n); - buffer_copy(buffer(&cr.reason[0], n), cb); - if(! check_utf8( - cr.reason.data(), cr.reason.size())) - { - // not valid utf-8 - ec = error::bad_close_payload; - return; - } - } - else - { - cr.reason = ""; - } - ec.assign(0, ec.category()); -} - -} // detail -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/detail/hybi13.hpp b/contrib/restricted/boost/boost/beast/websocket/detail/hybi13.hpp deleted file mode 100644 index b9c67b8200..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/detail/hybi13.hpp +++ /dev/null @@ -1,75 +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_WEBSOCKET_DETAIL_HYBI13_HPP -#define BOOST_BEAST_WEBSOCKET_DETAIL_HYBI13_HPP - -#include <boost/beast/core/static_string.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/detail/base64.hpp> -#include <boost/beast/core/detail/sha1.hpp> -#include <boost/assert.hpp> -#include <array> -#include <cstdint> -#include <string> -#include <type_traits> - -namespace boost { -namespace beast { -namespace websocket { -namespace detail { - -using sec_ws_key_type = static_string< - beast::detail::base64::encoded_size(16)>; - -using sec_ws_accept_type = static_string< - beast::detail::base64::encoded_size(20)>; - -template<class Gen> -void -make_sec_ws_key(sec_ws_key_type& key, Gen& g) -{ - char a[16]; - for(int i = 0; i < 16; i += 4) - { - auto const v = g(); - a[i ] = v & 0xff; - a[i+1] = (v >> 8) & 0xff; - a[i+2] = (v >> 16) & 0xff; - a[i+3] = (v >> 24) & 0xff; - } - key.resize(key.max_size()); - key.resize(beast::detail::base64::encode( - key.data(), &a[0], 16)); -} - -template<class = void> -void -make_sec_ws_accept(sec_ws_accept_type& accept, - string_view key) -{ - BOOST_ASSERT(key.size() <= sec_ws_key_type::max_size_n); - static_string<sec_ws_key_type::max_size_n + 36> m(key); - m.append("258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); - beast::detail::sha1_context ctx; - beast::detail::init(ctx); - beast::detail::update(ctx, m.data(), m.size()); - char digest[beast::detail::sha1_context::digest_size]; - beast::detail::finish(ctx, &digest[0]); - accept.resize(accept.max_size()); - accept.resize(beast::detail::base64::encode( - accept.data(), &digest[0], sizeof(digest))); -} - -} // detail -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/detail/mask.hpp b/contrib/restricted/boost/boost/beast/websocket/detail/mask.hpp deleted file mode 100644 index 8958d793b8..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/detail/mask.hpp +++ /dev/null @@ -1,148 +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_WEBSOCKET_DETAIL_MASK_HPP -#define BOOST_BEAST_WEBSOCKET_DETAIL_MASK_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <array> -#include <climits> -#include <cstdint> -#include <random> -#include <type_traits> - -namespace boost { -namespace beast { -namespace websocket { -namespace detail { - -// Pseudo-random source of mask keys -// -template<class Generator> -class maskgen_t -{ - Generator g_; - -public: - using result_type = - typename Generator::result_type; - - maskgen_t(); - - result_type - operator()() noexcept; - - void - rekey(); -}; - -template<class Generator> -maskgen_t<Generator>::maskgen_t() -{ - rekey(); -} - -template<class Generator> -auto -maskgen_t<Generator>::operator()() noexcept -> - result_type -{ - for(;;) - if(auto key = g_()) - return key; -} - -template<class _> -void -maskgen_t<_>::rekey() -{ - std::random_device rng; -#if 0 - std::array<std::uint32_t, 32> e; - for(auto& i : e) - i = rng(); - // VFALCO This constructor causes - // address sanitizer to fail, no idea why. - std::seed_seq ss(e.begin(), e.end()); - g_.seed(ss); -#else - g_.seed(rng()); -#endif -} - -// VFALCO NOTE This generator has 5KB of state! -//using maskgen = maskgen_t<std::mt19937>; -using maskgen = maskgen_t<std::minstd_rand>; - -//------------------------------------------------------------------------------ - -using prepared_key = std::array<unsigned char, 4>; - -inline -void -prepare_key(prepared_key& prepared, std::uint32_t key) -{ - prepared[0] = (key >> 0) & 0xff; - prepared[1] = (key >> 8) & 0xff; - prepared[2] = (key >> 16) & 0xff; - prepared[3] = (key >> 24) & 0xff; -} - -template<std::size_t N> -void -rol(std::array<unsigned char, N>& v, std::size_t n) -{ - auto v0 = v; - for(std::size_t i = 0; i < v.size(); ++i ) - v[i] = v0[(i + n) % v.size()]; -} - -// Apply mask in place -// -inline -void -mask_inplace(boost::asio::mutable_buffer& b, prepared_key& key) -{ - auto n = b.size(); - auto mask = key; // avoid aliasing - auto p = reinterpret_cast<unsigned char*>(b.data()); - while(n >= 4) - { - for(int i = 0; i < 4; ++i) - p[i] ^= mask[i]; - p += 4; - n -= 4; - } - if(n > 0) - { - for(std::size_t i = 0; i < n; ++i) - p[i] ^= mask[i]; - rol(key, n); - } -} - -// Apply mask in place -// -template<class MutableBuffers, class KeyType> -void -mask_inplace(MutableBuffers const& bs, KeyType& key) -{ - for(boost::asio::mutable_buffer b : - beast::detail::buffers_range(bs)) - mask_inplace(b, key); -} - -} // detail -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/detail/pausation.hpp b/contrib/restricted/boost/boost/beast/websocket/detail/pausation.hpp deleted file mode 100644 index e3870b038a..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/detail/pausation.hpp +++ /dev/null @@ -1,162 +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_WEBSOCKET_DETAIL_PAUSATION_HPP -#define BOOST_BEAST_WEBSOCKET_DETAIL_PAUSATION_HPP - -#include <boost/beast/core/detail/allocator.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/assert.hpp> -#include <memory> -#include <utility> - -namespace boost { -namespace beast { -namespace websocket { -namespace detail { - -// A container that holds a suspended, asynchronous composed -// operation. The contained object may be invoked later to -// resume the operation, or the container may be destroyed. -// -class pausation -{ - struct handler - { - handler() = default; - handler(handler &&) = delete; - handler(handler const&) = delete; - virtual ~handler() = default; - virtual void destroy() = 0; - virtual void invoke() = 0; - }; - - template<class Handler> - class impl : public handler - { - Handler h_; - - public: - template<class DeducedHandler> - impl(DeducedHandler&& h) - : h_(std::forward<DeducedHandler>(h)) - { - } - - void - destroy() override - { - Handler h(std::move(h_)); - typename beast::detail::allocator_traits< - boost::asio::associated_allocator_t< - Handler>>::template rebind_alloc<impl> alloc{ - boost::asio::get_associated_allocator(h)}; - beast::detail::allocator_traits< - decltype(alloc)>::destroy(alloc, this); - beast::detail::allocator_traits< - decltype(alloc)>::deallocate(alloc, this, 1); - } - - void - invoke() override - { - Handler h(std::move(h_)); - typename beast::detail::allocator_traits< - boost::asio::associated_allocator_t< - Handler>>::template rebind_alloc<impl> alloc{ - boost::asio::get_associated_allocator(h)}; - beast::detail::allocator_traits< - decltype(alloc)>::destroy(alloc, this); - beast::detail::allocator_traits< - decltype(alloc)>::deallocate(alloc, this, 1); - h(); - } - }; - - handler* h_ = nullptr; - -public: - pausation() = default; - pausation(pausation const&) = delete; - pausation& operator=(pausation const&) = delete; - - ~pausation() - { - if(h_) - h_->destroy(); - } - - pausation(pausation&& other) - { - boost::ignore_unused(other); - BOOST_ASSERT(! other.h_); - } - - pausation& - operator=(pausation&& other) - { - boost::ignore_unused(other); - BOOST_ASSERT(! h_); - BOOST_ASSERT(! other.h_); - return *this; - } - - template<class CompletionHandler> - void - emplace(CompletionHandler&& handler); - - explicit - operator bool() const - { - return h_ != nullptr; - } - - bool - maybe_invoke() - { - if(h_) - { - auto const h = h_; - h_ = nullptr; - h->invoke(); - return true; - } - return false; - } -}; - -template<class CompletionHandler> -void -pausation::emplace(CompletionHandler&& handler) -{ - BOOST_ASSERT(! h_); - typename beast::detail::allocator_traits< - boost::asio::associated_allocator_t< - CompletionHandler>>::template rebind_alloc< - impl<CompletionHandler>> alloc{ - boost::asio::get_associated_allocator(handler)}; - using A = decltype(alloc); - auto const d = - [&alloc](impl<CompletionHandler>* p) - { - beast::detail::allocator_traits<A>::deallocate(alloc, p, 1); - }; - std::unique_ptr<impl<CompletionHandler>, decltype(d)> p{ - beast::detail::allocator_traits<A>::allocate(alloc, 1), d}; - beast::detail::allocator_traits<A>::construct( - alloc, p.get(), std::forward<CompletionHandler>(handler)); - h_ = p.release(); -} - -} // detail -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/detail/pmd_extension.hpp b/contrib/restricted/boost/boost/beast/websocket/detail/pmd_extension.hpp deleted file mode 100644 index ce4f2425cf..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/detail/pmd_extension.hpp +++ /dev/null @@ -1,364 +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_WEBSOCKET_DETAIL_PMD_EXTENSION_HPP -#define BOOST_BEAST_WEBSOCKET_DETAIL_PMD_EXTENSION_HPP - -#include <boost/beast/core/error.hpp> -#include <boost/beast/core/buffers_suffix.hpp> -#include <boost/beast/core/read_size.hpp> -#include <boost/beast/zlib/deflate_stream.hpp> -#include <boost/beast/zlib/inflate_stream.hpp> -#include <boost/beast/websocket/option.hpp> -#include <boost/beast/http/rfc7230.hpp> -#include <boost/asio/buffer.hpp> -#include <utility> -#include <type_traits> - -namespace boost { -namespace beast { -namespace websocket { -namespace detail { - -// permessage-deflate offer parameters -// -// "context takeover" means: -// preserve sliding window across messages -// -struct pmd_offer -{ - bool accept; - - // 0 = absent, or 8..15 - int server_max_window_bits; - - // -1 = present, 0 = absent, or 8..15 - int client_max_window_bits; - - // `true` if server_no_context_takeover offered - bool server_no_context_takeover; - - // `true` if client_no_context_takeover offered - bool client_no_context_takeover; -}; - -template<class = void> -int -parse_bits(string_view s) -{ - if(s.size() == 0) - return -1; - if(s.size() > 2) - return -1; - if(s[0] < '1' || s[0] > '9') - return -1; - unsigned i = 0; - for(auto c : s) - { - if(c < '0' || c > '9') - return -1; - auto const i0 = i; - i = 10 * i + (c - '0'); - if(i < i0) - return -1; - } - return static_cast<int>(i); -} - -// Parse permessage-deflate request fields -// -template<class Allocator> -void -pmd_read(pmd_offer& offer, - http::basic_fields<Allocator> const& fields) -{ - offer.accept = false; - offer.server_max_window_bits= 0; - offer.client_max_window_bits = 0; - offer.server_no_context_takeover = false; - offer.client_no_context_takeover = false; - - http::ext_list list{ - fields["Sec-WebSocket-Extensions"]}; - for(auto const& ext : list) - { - if(iequals(ext.first, "permessage-deflate")) - { - for(auto const& param : ext.second) - { - if(iequals(param.first, - "server_max_window_bits")) - { - if(offer.server_max_window_bits != 0) - { - // The negotiation offer contains multiple - // extension parameters with the same name. - // - return; // MUST decline - } - if(param.second.empty()) - { - // The negotiation offer extension - // parameter is missing the value. - // - return; // MUST decline - } - offer.server_max_window_bits = - parse_bits(param.second); - if( offer.server_max_window_bits < 8 || - offer.server_max_window_bits > 15) - { - // The negotiation offer contains an - // extension parameter with an invalid value. - // - return; // MUST decline - } - } - else if(iequals(param.first, - "client_max_window_bits")) - { - if(offer.client_max_window_bits != 0) - { - // The negotiation offer contains multiple - // extension parameters with the same name. - // - return; // MUST decline - } - if(! param.second.empty()) - { - offer.client_max_window_bits = - parse_bits(param.second); - if( offer.client_max_window_bits < 8 || - offer.client_max_window_bits > 15) - { - // The negotiation offer contains an - // extension parameter with an invalid value. - // - return; // MUST decline - } - } - else - { - offer.client_max_window_bits = -1; - } - } - else if(iequals(param.first, - "server_no_context_takeover")) - { - if(offer.server_no_context_takeover) - { - // The negotiation offer contains multiple - // extension parameters with the same name. - // - return; // MUST decline - } - if(! param.second.empty()) - { - // The negotiation offer contains an - // extension parameter with an invalid value. - // - return; // MUST decline - } - offer.server_no_context_takeover = true; - } - else if(iequals(param.first, - "client_no_context_takeover")) - { - if(offer.client_no_context_takeover) - { - // The negotiation offer contains multiple - // extension parameters with the same name. - // - return; // MUST decline - } - if(! param.second.empty()) - { - // The negotiation offer contains an - // extension parameter with an invalid value. - // - return; // MUST decline - } - offer.client_no_context_takeover = true; - } - else - { - // The negotiation offer contains an extension - // parameter not defined for use in an offer. - // - return; // MUST decline - } - } - offer.accept = true; - return; - } - } -} - -// Set permessage-deflate fields for a client offer -// -template<class Allocator> -void -pmd_write(http::basic_fields<Allocator>& fields, - pmd_offer const& offer) -{ - static_string<512> s; - s = "permessage-deflate"; - if(offer.server_max_window_bits != 0) - { - if(offer.server_max_window_bits != -1) - { - s += "; server_max_window_bits="; - s += to_static_string( - offer.server_max_window_bits); - } - else - { - s += "; server_max_window_bits"; - } - } - if(offer.client_max_window_bits != 0) - { - if(offer.client_max_window_bits != -1) - { - s += "; client_max_window_bits="; - s += to_static_string( - offer.client_max_window_bits); - } - else - { - s += "; client_max_window_bits"; - } - } - if(offer.server_no_context_takeover) - { - s += "; server_no_context_takeover"; - } - if(offer.client_no_context_takeover) - { - s += "; client_no_context_takeover"; - } - fields.set(http::field::sec_websocket_extensions, s); -} - -// Negotiate a permessage-deflate client offer -// -template<class Allocator> -void -pmd_negotiate( - http::basic_fields<Allocator>& fields, - pmd_offer& config, - pmd_offer const& offer, - permessage_deflate const& o) -{ - if(! (offer.accept && o.server_enable)) - { - config.accept = false; - return; - } - config.accept = true; - - static_string<512> s = "permessage-deflate"; - - config.server_no_context_takeover = - offer.server_no_context_takeover || - o.server_no_context_takeover; - if(config.server_no_context_takeover) - s += "; server_no_context_takeover"; - - config.client_no_context_takeover = - o.client_no_context_takeover || - offer.client_no_context_takeover; - if(config.client_no_context_takeover) - s += "; client_no_context_takeover"; - - if(offer.server_max_window_bits != 0) - config.server_max_window_bits = (std::min)( - offer.server_max_window_bits, - o.server_max_window_bits); - else - config.server_max_window_bits = - o.server_max_window_bits; - if(config.server_max_window_bits < 15) - { - // ZLib's deflateInit silently treats 8 as - // 9 due to a bug, so prevent 8 from being used. - // - if(config.server_max_window_bits < 9) - config.server_max_window_bits = 9; - - s += "; server_max_window_bits="; - s += to_static_string( - config.server_max_window_bits); - } - - switch(offer.client_max_window_bits) - { - case -1: - // extension parameter is present with no value - config.client_max_window_bits = - o.client_max_window_bits; - if(config.client_max_window_bits < 15) - { - s += "; client_max_window_bits="; - s += to_static_string( - config.client_max_window_bits); - } - break; - - case 0: - /* extension parameter is absent. - - If a received extension negotiation offer doesn't have the - "client_max_window_bits" extension parameter, the corresponding - extension negotiation response to the offer MUST NOT include the - "client_max_window_bits" extension parameter. - */ - if(o.client_max_window_bits == 15) - config.client_max_window_bits = 15; - else - config.accept = false; - break; - - default: - // extension parameter has value in [8..15] - config.client_max_window_bits = (std::min)( - o.client_max_window_bits, - offer.client_max_window_bits); - s += "; client_max_window_bits="; - s += to_static_string( - config.client_max_window_bits); - break; - } - if(config.accept) - fields.set(http::field::sec_websocket_extensions, s); -} - -// Normalize the server's response -// -inline -void -pmd_normalize(pmd_offer& offer) -{ - if(offer.accept) - { - if( offer.server_max_window_bits == 0) - offer.server_max_window_bits = 15; - - if( offer.client_max_window_bits == 0 || - offer.client_max_window_bits == -1) - offer.client_max_window_bits = 15; - } -} - -} // detail -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/detail/stream_base.hpp b/contrib/restricted/boost/boost/beast/websocket/detail/stream_base.hpp deleted file mode 100644 index 2e93cce3d4..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/detail/stream_base.hpp +++ /dev/null @@ -1,221 +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_WEBSOCKET_STREAM_BASE_HPP -#define BOOST_BEAST_WEBSOCKET_STREAM_BASE_HPP - -#include <boost/beast/websocket/option.hpp> -#include <boost/beast/websocket/detail/pmd_extension.hpp> -#include <boost/beast/zlib/deflate_stream.hpp> -#include <boost/beast/zlib/inflate_stream.hpp> -#include <boost/beast/core/buffers_suffix.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/asio/buffer.hpp> -#include <cstdint> -#include <memory> - -namespace boost { -namespace beast { -namespace websocket { -namespace detail { - -// used to order reads and writes -class soft_mutex -{ - int id_ = 0; - -public: - soft_mutex() = default; - soft_mutex(soft_mutex const&) = delete; - soft_mutex& operator=(soft_mutex const&) = delete; - - soft_mutex(soft_mutex&& other) noexcept - : id_(other.id_) - { - other.id_ = 0; - } - - soft_mutex& operator=(soft_mutex&& other) noexcept - { - id_ = other.id_; - other.id_ = 0; - return *this; - } - - // VFALCO I'm not too happy that this function is needed - void reset() - { - id_ = 0; - } - - bool is_locked() const - { - return id_ != 0; - } - - template<class T> - bool is_locked(T const*) const - { - return id_ == T::id; - } - - template<class T> - void lock(T const*) - { - BOOST_ASSERT(id_ == 0); - id_ = T::id; - } - - template<class T> - void unlock(T const*) - { - BOOST_ASSERT(id_ == T::id); - id_ = 0; - } - - template<class T> - bool try_lock(T const*) - { - // If this assert goes off it means you are attempting to - // simultaneously initiate more than one of same asynchronous - // operation, which is not allowed. For example, you must wait - // for an async_read to complete before performing another - // async_read. - // - BOOST_ASSERT(id_ != T::id); - if(id_ != 0) - return false; - id_ = T::id; - return true; - } - - template<class T> - bool try_unlock(T const*) - { - if(id_ != T::id) - return false; - id_ = 0; - return true; - } -}; - -template<bool deflateSupported> -struct stream_base -{ - // State information for the permessage-deflate extension - struct pmd_type - { - // `true` if current read message is compressed - bool rd_set = false; - - zlib::deflate_stream zo; - zlib::inflate_stream zi; - }; - - std::unique_ptr<pmd_type> pmd_; // pmd settings or nullptr - permessage_deflate pmd_opts_; // local pmd options - detail::pmd_offer pmd_config_; // offer (client) or negotiation (server) - - // return `true` if current message is deflated - bool - rd_deflated() const - { - return pmd_ && pmd_->rd_set; - } - - // set whether current message is deflated - // returns `false` on protocol violation - bool - rd_deflated(bool rsv1) - { - if(pmd_) - { - pmd_->rd_set = rsv1; - return true; - } - return ! rsv1; // pmd not negotiated - } - - template<class ConstBufferSequence> - bool - deflate( - boost::asio::mutable_buffer& out, - buffers_suffix<ConstBufferSequence>& cb, - bool fin, - std::size_t& total_in, - error_code& ec); - - void - do_context_takeover_write(role_type role); - - void - inflate( - zlib::z_params& zs, - zlib::Flush flush, - error_code& ec); - - void - do_context_takeover_read(role_type role); -}; - -template<> -struct stream_base<false> -{ - // These stubs are for avoiding linking in the zlib - // code when permessage-deflate is not enabled. - - bool - rd_deflated() const - { - return false; - } - - bool - rd_deflated(bool rsv1) - { - return ! rsv1; - } - - template<class ConstBufferSequence> - bool - deflate( - boost::asio::mutable_buffer&, - buffers_suffix<ConstBufferSequence>&, - bool, - std::size_t&, - error_code&) - { - return false; - } - - void - do_context_takeover_write(role_type) - { - } - - void - inflate( - zlib::z_params&, - zlib::Flush, - error_code&) - { - } - - void - do_context_takeover_read(role_type) - { - } -}; - -} // detail -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/detail/type_traits.hpp b/contrib/restricted/boost/boost/beast/websocket/detail/type_traits.hpp deleted file mode 100644 index 6913174fd0..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/detail/type_traits.hpp +++ /dev/null @@ -1,36 +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_WEBSOCKET_DETAIL_TYPE_TRAITS_HPP -#define BOOST_BEAST_WEBSOCKET_DETAIL_TYPE_TRAITS_HPP - -#include <boost/beast/websocket/rfc6455.hpp> -#include <boost/beast/core/detail/type_traits.hpp> - -namespace boost { -namespace beast { -namespace websocket { -namespace detail { - -template<class F> -using is_request_decorator = - typename beast::detail::is_invocable<F, - void(request_type&)>::type; - -template<class F> -using is_response_decorator = - typename beast::detail::is_invocable<F, - void(response_type&)>::type; - -} // detail -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/detail/utf8_checker.hpp b/contrib/restricted/boost/boost/beast/websocket/detail/utf8_checker.hpp deleted file mode 100644 index 61c241bc19..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/detail/utf8_checker.hpp +++ /dev/null @@ -1,344 +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_WEBSOCKET_DETAIL_UTF8_CHECKER_HPP -#define BOOST_BEAST_WEBSOCKET_DETAIL_UTF8_CHECKER_HPP - -#include <boost/beast/core/type_traits.hpp> -#include <boost/asio/buffer.hpp> -#include <boost/assert.hpp> -#include <algorithm> -#include <cstdint> - -namespace boost { -namespace beast { -namespace websocket { -namespace detail { - -/** A UTF8 validator. - - This validator can be used to check if a buffer containing UTF8 text is - valid. The write function may be called incrementally with segmented UTF8 - sequences. The finish function determines if all processed text is valid. -*/ -template<class = void> -class utf8_checker_t -{ - std::size_t need_ = 0; // chars we need to finish the code point - std::uint8_t* p_ = cp_; // current position in temp buffer - std::uint8_t cp_[4]; // a temp buffer for the code point - -public: - /** Prepare to process text as valid utf8 - */ - void - reset(); - - /** Check that all processed text is valid utf8 - */ - bool - finish(); - - /** Check if text is valid UTF8 - - @return `true` if the text is valid utf8 or false otherwise. - */ - bool - write(std::uint8_t const* in, std::size_t size); - - /** Check if text is valid UTF8 - - @return `true` if the text is valid utf8 or false otherwise. - */ - template<class ConstBufferSequence> - bool - write(ConstBufferSequence const& bs); -}; - -template<class _> -void -utf8_checker_t<_>:: -reset() -{ - need_ = 0; - p_ = cp_; -} - -template<class _> -bool -utf8_checker_t<_>:: -finish() -{ - auto const success = need_ == 0; - reset(); - return success; -} - -template<class _> -template<class ConstBufferSequence> -bool -utf8_checker_t<_>:: -write(ConstBufferSequence const& bs) -{ - static_assert(boost::asio::is_const_buffer_sequence<ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - for(auto b : beast::detail::buffers_range(bs)) - if(! write(reinterpret_cast< - std::uint8_t const*>(b.data()), - b.size())) - return false; - return true; -} - -template<class _> -bool -utf8_checker_t<_>:: -write(std::uint8_t const* in, std::size_t size) -{ - auto const valid = - [](std::uint8_t const*& p) - { - if(p[0] < 128) - { - ++p; - return true; - } - if((p[0] & 0xe0) == 0xc0) - { - if( (p[1] & 0xc0) != 0x80 || - (p[0] & 0xfe) == 0xc0) // overlong - return false; - p += 2; - return true; - } - if((p[0] & 0xf0) == 0xe0) - { - if( (p[1] & 0xc0) != 0x80 - || (p[2] & 0xc0) != 0x80 - || (p[0] == 0xe0 && (p[1] & 0xe0) == 0x80) // overlong - || (p[0] == 0xed && (p[1] & 0xe0) == 0xa0) // surrogate - //|| (p[0] == 0xef && p[1] == 0xbf && (p[2] & 0xfe) == 0xbe) // U+FFFE or U+FFFF - ) - return false; - p += 3; - return true; - } - if((p[0] & 0xf8) == 0xf0) - { - if( (p[1] & 0xc0) != 0x80 - || (p[2] & 0xc0) != 0x80 - || (p[3] & 0xc0) != 0x80 - || (p[0] == 0xf0 && (p[1] & 0xf0) == 0x80) // overlong - || (p[0] == 0xf4 && p[1] > 0x8f) || p[0] > 0xf4 // > U+10FFFF - ) - return false; - p += 4; - return true; - } - return false; - }; - auto const fail_fast = - [&]() - { - auto const n = p_ - cp_; - switch(n) - { - default: - BOOST_ASSERT(false); - BOOST_FALLTHROUGH; - case 1: - cp_[1] = 0x81; - BOOST_FALLTHROUGH; - case 2: - cp_[2] = 0x81; - BOOST_FALLTHROUGH; - case 3: - cp_[3] = 0x81; - break; - } - std::uint8_t const* p = cp_; - return ! valid(p); - }; - auto const needed = - [](std::uint8_t const v) - { - if(v < 128) - return 1; - if(v < 192) - return 0; - if(v < 224) - return 2; - if(v < 240) - return 3; - if(v < 248) - return 4; - return 0; - }; - - auto const end = in + size; - - // Finish up any incomplete code point - if(need_ > 0) - { - // Calculate what we have - auto n = (std::min)(size, need_); - size -= n; - need_ -= n; - - // Add characters to the code point - while(n--) - *p_++ = *in++; - BOOST_ASSERT(p_ <= cp_ + 5); - - // Still incomplete? - if(need_ > 0) - { - // Incomplete code point - BOOST_ASSERT(in == end); - - // Do partial validation on the incomplete - // code point, this is called "Fail fast" - // in Autobahn|Testsuite parlance. - return ! fail_fast(); - } - - // Complete code point, validate it - std::uint8_t const* p = &cp_[0]; - if(! valid(p)) - return false; - p_ = cp_; - } - - if(size <= sizeof(std::size_t)) - goto slow; - - // Align `in` to sizeof(std::size_t) boundary - { - auto const in0 = in; - auto last = reinterpret_cast<std::uint8_t const*>( - ((reinterpret_cast<std::uintptr_t>(in) + sizeof(std::size_t) - 1) / - sizeof(std::size_t)) * sizeof(std::size_t)); - - // Check one character at a time for low-ASCII - while(in < last) - { - if(*in & 0x80) - { - // Not low-ASCII so switch to slow loop - size = size - (in - in0); - goto slow; - } - ++in; - } - size = size - (in - in0); - } - - // Fast loop: Process 4 or 8 low-ASCII characters at a time - { - auto const in0 = in; - auto last = in + size - 7; - auto constexpr mask = static_cast< - std::size_t>(0x8080808080808080 & ~std::size_t{0}); - while(in < last) - { -#if 0 - std::size_t temp; - std::memcpy(&temp, in, sizeof(temp)); - if((temp & mask) != 0) -#else - // Technically UB but works on all known platforms - if((*reinterpret_cast<std::size_t const*>(in) & mask) != 0) -#endif - { - size = size - (in - in0); - goto slow; - } - in += sizeof(std::size_t); - } - // There's at least one more full code point left - last += 4; - while(in < last) - if(! valid(in)) - return false; - goto tail; - } - -slow: - // Slow loop: Full validation on one code point at a time - { - auto last = in + size - 3; - while(in < last) - if(! valid(in)) - return false; - } - -tail: - // Handle the remaining bytes. The last - // characters could split a code point so - // we save the partial code point for later. - // - // On entry to the loop, `in` points to the - // beginning of a code point. - // - for(;;) - { - // Number of chars left - auto n = end - in; - if(! n) - break; - - // Chars we need to finish this code point - auto const need = needed(*in); - if(need == 0) - return false; - if(need <= n) - { - // Check a whole code point - if(! valid(in)) - return false; - } - else - { - // Calculate how many chars we need - // to finish this partial code point - need_ = need - n; - - // Save the partial code point - while(n--) - *p_++ = *in++; - BOOST_ASSERT(in == end); - BOOST_ASSERT(p_ <= cp_ + 5); - - // Do partial validation on the incomplete - // code point, this is called "Fail fast" - // in Autobahn|Testsuite parlance. - return ! fail_fast(); - } - } - return true; -} - -using utf8_checker = utf8_checker_t<>; - -template<class = void> -bool -check_utf8(char const* p, std::size_t n) -{ - utf8_checker c; - if(! c.write(reinterpret_cast<const uint8_t*>(p), n)) - return false; - return c.finish(); -} - -} // detail -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/error.hpp b/contrib/restricted/boost/boost/beast/websocket/error.hpp deleted file mode 100644 index d4e5197100..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/error.hpp +++ /dev/null @@ -1,254 +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_WEBSOCKET_ERROR_HPP -#define BOOST_BEAST_WEBSOCKET_ERROR_HPP - -#include <boost/beast/websocket/detail/error.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> - -namespace boost { -namespace beast { -namespace websocket { - -/// Error codes returned from @ref beast::websocket::stream operations. -enum class error -{ - /** The WebSocket stream was gracefully closed at both endpoints - */ - closed = 1, - -/* The error codes error::failed and error::handshake_failed - are no longer in use. Please change your code to compare values - of type error_code against condition::handshake_failed - and condition::protocol_violation instead. - - Apologies for the inconvenience. - - - VFALCO -*/ -#if ! BOOST_BEAST_DOXYGEN - unused1 = 2, // failed - unused2 = 3, // handshake_failed -#endif - - /** The WebSocket operation caused a dynamic buffer overflow - */ - buffer_overflow, - - /** The WebSocket stream produced an incomplete deflate block - */ - partial_deflate_block, - - /** The WebSocket message exceeded the locally configured limit - */ - message_too_big, - - // - // Handshake failure errors - // - // These will compare equal to condition::handshake_failed - // - - /** The WebSocket handshake was not HTTP/1.1 - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - bad_http_version, - - /** The WebSocket handshake method was not GET - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - bad_method, - - /** The WebSocket handshake Host field is missing - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - no_host, - - /** The WebSocket handshake Connection field is missing - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - no_connection, - - /** The WebSocket handshake Connection field is missing the upgrade token - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - no_connection_upgrade, - - /** The WebSocket handshake Upgrade field is missing - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - no_upgrade, - - /** The WebSocket handshake Upgrade field is missing the websocket token - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - no_upgrade_websocket, - - /** The WebSocket handshake Sec-WebSocket-Key field is missing - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - no_sec_key, - - /** The WebSocket handshake Sec-WebSocket-Key field is invalid - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - bad_sec_key, - - /** The WebSocket handshake Sec-WebSocket-Version field is missing - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - no_sec_version, - - /** The WebSocket handshake Sec-WebSocket-Version field is invalid - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - bad_sec_version, - - /** The WebSocket handshake Sec-WebSocket-Accept field is missing - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - no_sec_accept, - - /** The WebSocket handshake Sec-WebSocket-Accept field is invalid - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - bad_sec_accept, - - /** The WebSocket handshake was declined by the remote peer - - Error codes with this value will compare equal to @ref condition::handshake_failed - */ - upgrade_declined, - - // - // Protocol errors - // - // These will compare equal to condition::protocol_violation - // - - /** The WebSocket frame contained an illegal opcode - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_opcode, - - /** The WebSocket data frame was unexpected - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_data_frame, - - /** The WebSocket continuation frame was unexpected - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_continuation, - - /** The WebSocket frame contained illegal reserved bits - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_reserved_bits, - - /** The WebSocket control frame was fragmented - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_control_fragment, - - /** The WebSocket control frame size was invalid - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_control_size, - - /** The WebSocket frame was unmasked - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_unmasked_frame, - - /** The WebSocket frame was masked - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_masked_frame, - - /** The WebSocket frame size was not canonical - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_size, - - /** The WebSocket frame payload was not valid utf8 - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_frame_payload, - - /** The WebSocket close frame reason code was invalid - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_close_code, - - /** The WebSocket close frame payload size was invalid - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_close_size, - - /** The WebSocket close frame payload was not valid utf8 - - Error codes with this value will compare equal to @ref condition::protocol_violation - */ - bad_close_payload -}; - -/// Error conditions corresponding to sets of error codes. -enum class condition -{ - /** The WebSocket handshake failed - - This condition indicates that the WebSocket handshake failed. If - the corresponding HTTP response indicates the keep-alive behavior, - then the handshake may be reattempted. - */ - handshake_failed = 1, - - /** A WebSocket protocol violation occurred - - This condition indicates that the remote peer on the WebSocket - connection sent data which violated the protocol. - */ - protocol_violation - }; - -} // websocket -} // beast -} // boost - -#include <boost/beast/websocket/impl/error.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/accept.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/accept.ipp deleted file mode 100644 index 9daf7b311b..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/accept.ipp +++ /dev/null @@ -1,782 +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_WEBSOCKET_IMPL_ACCEPT_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_ACCEPT_IPP - -#include <boost/beast/websocket/detail/type_traits.hpp> -#include <boost/beast/http/empty_body.hpp> -#include <boost/beast/http/parser.hpp> -#include <boost/beast/http/read.hpp> -#include <boost/beast/http/string_body.hpp> -#include <boost/beast/http/write.hpp> -#include <boost/beast/core/buffers_prefix.hpp> -#include <boost/beast/core/handler_ptr.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/asio/coroutine.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/asio/post.hpp> -#include <boost/assert.hpp> -#include <boost/throw_exception.hpp> -#include <memory> -#include <type_traits> - -namespace boost { -namespace beast { -namespace websocket { - -// Respond to an upgrade HTTP request -template<class NextLayer, bool deflateSupported> -template<class Handler> -class stream<NextLayer, deflateSupported>::response_op - : public boost::asio::coroutine -{ - struct data - { - stream<NextLayer, deflateSupported>& ws; - error_code result; - response_type res; - - template<class Body, class Allocator, class Decorator> - data( - Handler const&, - stream<NextLayer, deflateSupported>& ws_, - http::request<Body, - http::basic_fields<Allocator>> const& req, - Decorator const& decorator) - : ws(ws_) - , res(ws_.build_response(req, decorator, result)) - { - } - }; - - handler_ptr<data, Handler> d_; - -public: - response_op(response_op&&) = default; - response_op(response_op const&) = delete; - - template<class DeducedHandler, class... Args> - response_op(DeducedHandler&& h, - stream<NextLayer, deflateSupported>& ws, Args&&... args) - : d_(std::forward<DeducedHandler>(h), - ws, std::forward<Args>(args)...) - { - } - - using allocator_type = - boost::asio::associated_allocator_t<Handler>; - - allocator_type - get_allocator() const noexcept - { - return (boost::asio::get_associated_allocator)(d_.handler()); - } - - using executor_type = boost::asio::associated_executor_t< - Handler, decltype(std::declval< - stream<NextLayer, deflateSupported>&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - d_.handler(), d_->ws.get_executor()); - } - - void operator()( - error_code ec = {}, - std::size_t bytes_transferred = 0); - - friend - bool asio_handler_is_continuation(response_op* op) - { - using boost::asio::asio_handler_is_continuation; - return asio_handler_is_continuation( - std::addressof(op->d_.handler())); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, response_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->d_.handler())); - } -}; - -template<class NextLayer, bool deflateSupported> -template<class Handler> -void -stream<NextLayer, deflateSupported>:: -response_op<Handler>:: -operator()( - error_code ec, - std::size_t) -{ - auto& d = *d_; - BOOST_ASIO_CORO_REENTER(*this) - { - // Send response - BOOST_ASIO_CORO_YIELD - http::async_write(d.ws.next_layer(), - d.res, std::move(*this)); - if(! ec) - ec = d.result; - if(! ec) - { - d.ws.do_pmd_config(d.res, is_deflate_supported{}); - d.ws.open(role_type::server); - } - d_.invoke(ec); - } -} - -//------------------------------------------------------------------------------ - -// read and respond to an upgrade request -// -template<class NextLayer, bool deflateSupported> -template<class Decorator, class Handler> -class stream<NextLayer, deflateSupported>::accept_op - : public boost::asio::coroutine -{ - struct data - { - stream<NextLayer, deflateSupported>& ws; - Decorator decorator; - http::request_parser<http::empty_body> p; - data( - Handler const&, - stream<NextLayer, deflateSupported>& ws_, - Decorator const& decorator_) - : ws(ws_) - , decorator(decorator_) - { - } - }; - - handler_ptr<data, Handler> d_; - -public: - accept_op(accept_op&&) = default; - accept_op(accept_op const&) = delete; - - template<class DeducedHandler, class... Args> - accept_op(DeducedHandler&& h, - stream<NextLayer, deflateSupported>& ws, Args&&... args) - : d_(std::forward<DeducedHandler>(h), - ws, std::forward<Args>(args)...) - { - } - - using allocator_type = - boost::asio::associated_allocator_t<Handler>; - - allocator_type - get_allocator() const noexcept - { - return (boost::asio::get_associated_allocator)(d_.handler()); - } - - using executor_type = boost::asio::associated_executor_t< - Handler, decltype(std::declval<stream<NextLayer, deflateSupported>&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - d_.handler(), d_->ws.get_executor()); - } - - template<class Buffers> - void run(Buffers const& buffers); - - void operator()( - error_code ec = {}, - std::size_t bytes_used = 0); - - friend - bool asio_handler_is_continuation(accept_op* op) - { - using boost::asio::asio_handler_is_continuation; - return asio_handler_is_continuation( - std::addressof(op->d_.handler())); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, accept_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->d_.handler())); - } -}; - -template<class NextLayer, bool deflateSupported> -template<class Decorator, class Handler> -template<class Buffers> -void -stream<NextLayer, deflateSupported>:: -accept_op<Decorator, Handler>:: -run(Buffers const& buffers) -{ - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - auto& d = *d_; - error_code ec; - boost::optional<typename - static_buffer_base::mutable_buffers_type> mb; - auto const len = buffer_size(buffers); - try - { - mb.emplace(d.ws.rd_buf_.prepare(len)); - } - catch(std::length_error const&) - { - ec = error::buffer_overflow; - return (*this)(ec); - } - d.ws.rd_buf_.commit( - buffer_copy(*mb, buffers)); - (*this)(ec); -} - -template<class NextLayer, bool deflateSupported> -template<class Decorator, class Handler> -void -stream<NextLayer, deflateSupported>:: -accept_op<Decorator, Handler>:: -operator()(error_code ec, std::size_t) -{ - auto& d = *d_; - BOOST_ASIO_CORO_REENTER(*this) - { - if(ec) - { - BOOST_ASIO_CORO_YIELD - boost::asio::post( - d.ws.get_executor(), - bind_handler(std::move(*this), ec)); - } - else - { - BOOST_ASIO_CORO_YIELD - http::async_read( - d.ws.next_layer(), d.ws.rd_buf_, - d.p, std::move(*this)); - if(ec == http::error::end_of_stream) - ec = error::closed; - if(! ec) - { - // Arguments from our state must be - // moved to the stack before releasing - // the handler. - auto& ws = d.ws; - auto const req = d.p.release(); - auto const decorator = d.decorator; - #if 1 - return response_op<Handler>{ - d_.release_handler(), - ws, req, decorator}(ec); - #else - // VFALCO This *should* work but breaks - // coroutine invariants in the unit test. - // Also it calls reset() when it shouldn't. - return ws.async_accept_ex( - req, decorator, d_.release_handler()); - #endif - } - } - d_.invoke(ec); - } -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -accept() -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - error_code ec; - accept(ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -template<class ResponseDecorator> -void -stream<NextLayer, deflateSupported>:: -accept_ex(ResponseDecorator const& decorator) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(detail::is_response_decorator< - ResponseDecorator>::value, - "ResponseDecorator requirements not met"); - error_code ec; - accept_ex(decorator, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -accept(error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - reset(); - do_accept(&default_decorate_res, ec); -} - -template<class NextLayer, bool deflateSupported> -template<class ResponseDecorator> -void -stream<NextLayer, deflateSupported>:: -accept_ex(ResponseDecorator const& decorator, error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(detail::is_response_decorator< - ResponseDecorator>::value, - "ResponseDecorator requirements not met"); - reset(); - do_accept(decorator, ec); -} - -template<class NextLayer, bool deflateSupported> -template<class ConstBufferSequence> -typename std::enable_if<! http::detail::is_header< - ConstBufferSequence>::value>::type -stream<NextLayer, deflateSupported>:: -accept(ConstBufferSequence const& buffers) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - error_code ec; - accept(buffers, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -template< - class ConstBufferSequence, - class ResponseDecorator> -typename std::enable_if<! http::detail::is_header< - ConstBufferSequence>::value>::type -stream<NextLayer, deflateSupported>:: -accept_ex( - ConstBufferSequence const& buffers, - ResponseDecorator const &decorator) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - static_assert(detail::is_response_decorator< - ResponseDecorator>::value, - "ResponseDecorator requirements not met"); - error_code ec; - accept_ex(buffers, decorator, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -template<class ConstBufferSequence> -typename std::enable_if<! http::detail::is_header< - ConstBufferSequence>::value>::type -stream<NextLayer, deflateSupported>:: -accept( - ConstBufferSequence const& buffers, error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - reset(); - boost::optional<typename - static_buffer_base::mutable_buffers_type> mb; - try - { - mb.emplace(rd_buf_.prepare( - buffer_size(buffers))); - } - catch(std::length_error const&) - { - ec = error::buffer_overflow; - return; - } - rd_buf_.commit( - buffer_copy(*mb, buffers)); - do_accept(&default_decorate_res, ec); -} - -template<class NextLayer, bool deflateSupported> -template< - class ConstBufferSequence, - class ResponseDecorator> -typename std::enable_if<! http::detail::is_header< - ConstBufferSequence>::value>::type -stream<NextLayer, deflateSupported>:: -accept_ex( - ConstBufferSequence const& buffers, - ResponseDecorator const& decorator, - error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - reset(); - boost::optional<typename - static_buffer_base::mutable_buffers_type> mb; - try - { - mb.emplace(rd_buf_.prepare( - buffer_size(buffers))); - } - catch(std::length_error const&) - { - ec = error::buffer_overflow; - return; - } - rd_buf_.commit(buffer_copy(*mb, buffers)); - do_accept(decorator, ec); -} - -template<class NextLayer, bool deflateSupported> -template<class Body, class Allocator> -void -stream<NextLayer, deflateSupported>:: -accept( - http::request<Body, - http::basic_fields<Allocator>> const& req) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - error_code ec; - accept(req, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -template< - class Body, class Allocator, - class ResponseDecorator> -void -stream<NextLayer, deflateSupported>:: -accept_ex( - http::request<Body, - http::basic_fields<Allocator>> const& req, - ResponseDecorator const& decorator) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(detail::is_response_decorator< - ResponseDecorator>::value, - "ResponseDecorator requirements not met"); - error_code ec; - accept_ex(req, decorator, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -template<class Body, class Allocator> -void -stream<NextLayer, deflateSupported>:: -accept( - http::request<Body, - http::basic_fields<Allocator>> const& req, - error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - reset(); - do_accept(req, &default_decorate_res, ec); -} - -template<class NextLayer, bool deflateSupported> -template< - class Body, class Allocator, - class ResponseDecorator> -void -stream<NextLayer, deflateSupported>:: -accept_ex( - http::request<Body, - http::basic_fields<Allocator>> const& req, - ResponseDecorator const& decorator, - error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(detail::is_response_decorator< - ResponseDecorator>::value, - "ResponseDecorator requirements not met"); - reset(); - do_accept(req, decorator, ec); -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template< - class AcceptHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_accept( - AcceptHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - BOOST_BEAST_HANDLER_INIT( - AcceptHandler, void(error_code)); - reset(); - accept_op< - decltype(&default_decorate_res), - BOOST_ASIO_HANDLER_TYPE( - AcceptHandler, void(error_code))>{ - std::move(init.completion_handler), - *this, - &default_decorate_res}({}); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -template< - class ResponseDecorator, - class AcceptHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_accept_ex( - ResponseDecorator const& decorator, - AcceptHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - static_assert(detail::is_response_decorator< - ResponseDecorator>::value, - "ResponseDecorator requirements not met"); - BOOST_BEAST_HANDLER_INIT( - AcceptHandler, void(error_code)); - reset(); - accept_op< - ResponseDecorator, - BOOST_ASIO_HANDLER_TYPE( - AcceptHandler, void(error_code))>{ - std::move(init.completion_handler), - *this, - decorator}({}); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -template< - class ConstBufferSequence, - class AcceptHandler> -typename std::enable_if< - ! http::detail::is_header<ConstBufferSequence>::value, - BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code))>::type -stream<NextLayer, deflateSupported>:: -async_accept( - ConstBufferSequence const& buffers, - AcceptHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - BOOST_BEAST_HANDLER_INIT( - AcceptHandler, void(error_code)); - reset(); - accept_op< - decltype(&default_decorate_res), - BOOST_ASIO_HANDLER_TYPE( - AcceptHandler, void(error_code))>{ - std::move(init.completion_handler), - *this, - &default_decorate_res}.run(buffers); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -template< - class ConstBufferSequence, - class ResponseDecorator, - class AcceptHandler> -typename std::enable_if< - ! http::detail::is_header<ConstBufferSequence>::value, - BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code))>::type -stream<NextLayer, deflateSupported>:: -async_accept_ex( - ConstBufferSequence const& buffers, - ResponseDecorator const& decorator, - AcceptHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - static_assert(detail::is_response_decorator< - ResponseDecorator>::value, - "ResponseDecorator requirements not met"); - BOOST_BEAST_HANDLER_INIT( - AcceptHandler, void(error_code)); - reset(); - accept_op< - ResponseDecorator, - BOOST_ASIO_HANDLER_TYPE( - AcceptHandler, void(error_code))>{ - std::move(init.completion_handler), - *this, - decorator}.run(buffers); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -template< - class Body, class Allocator, - class AcceptHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_accept( - http::request<Body, http::basic_fields<Allocator>> const& req, - AcceptHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - BOOST_BEAST_HANDLER_INIT( - AcceptHandler, void(error_code)); - reset(); - using boost::asio::asio_handler_is_continuation; - response_op< - BOOST_ASIO_HANDLER_TYPE( - AcceptHandler, void(error_code))>{ - std::move(init.completion_handler), - *this, - req, - &default_decorate_res}(); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -template< - class Body, class Allocator, - class ResponseDecorator, - class AcceptHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_accept_ex( - http::request<Body, http::basic_fields<Allocator>> const& req, - ResponseDecorator const& decorator, - AcceptHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - static_assert(detail::is_response_decorator< - ResponseDecorator>::value, - "ResponseDecorator requirements not met"); - BOOST_BEAST_HANDLER_INIT( - AcceptHandler, void(error_code)); - reset(); - using boost::asio::asio_handler_is_continuation; - response_op< - BOOST_ASIO_HANDLER_TYPE( - AcceptHandler, void(error_code))>{ - std::move(init.completion_handler), - *this, - req, - decorator}(); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template<class Decorator> -void -stream<NextLayer, deflateSupported>:: -do_accept( - Decorator const& decorator, - error_code& ec) -{ - http::request_parser<http::empty_body> p; - http::read(next_layer(), rd_buf_, p, ec); - if(ec == http::error::end_of_stream) - ec = error::closed; - if(ec) - return; - do_accept(p.get(), decorator, ec); -} - -template<class NextLayer, bool deflateSupported> -template<class Body, class Allocator, - class Decorator> -void -stream<NextLayer, deflateSupported>:: -do_accept( - http::request<Body, - http::basic_fields<Allocator>> const& req, - Decorator const& decorator, - error_code& ec) -{ - error_code result; - auto const res = build_response(req, decorator, result); - http::write(stream_, res, ec); - if(ec) - return; - ec = result; - if(ec) - { - // VFALCO TODO Respect keep alive setting, perform - // teardown if Connection: close. - return; - } - do_pmd_config(res, is_deflate_supported{}); - open(role_type::server); -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/close.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/close.ipp deleted file mode 100644 index 7b0e1ff648..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/close.ipp +++ /dev/null @@ -1,446 +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_WEBSOCKET_IMPL_CLOSE_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_CLOSE_IPP - -#include <boost/beast/websocket/teardown.hpp> -#include <boost/beast/core/handler_ptr.hpp> -#include <boost/beast/core/flat_static_buffer.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/coroutine.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/asio/post.hpp> -#include <boost/throw_exception.hpp> -#include <memory> - -namespace boost { -namespace beast { -namespace websocket { - -/* Close the WebSocket Connection - - This composed operation sends the close frame if it hasn't already - been sent, then reads and discards frames until receiving a close - frame. Finally it invokes the teardown operation to shut down the - underlying connection. -*/ -template<class NextLayer, bool deflateSupported> -template<class Handler> -class stream<NextLayer, deflateSupported>::close_op - : public boost::asio::coroutine -{ - struct state - { - stream<NextLayer, deflateSupported>& ws; - detail::frame_buffer fb; - error_code ev; - bool cont = false; - - state( - Handler const&, - stream<NextLayer, deflateSupported>& ws_, - close_reason const& cr) - : ws(ws_) - { - // Serialize the close frame - ws.template write_close< - flat_static_buffer_base>(fb, cr); - } - }; - - handler_ptr<state, Handler> d_; - -public: - static constexpr int id = 4; // for soft_mutex - - close_op(close_op&&) = default; - close_op(close_op const&) = delete; - - template<class DeducedHandler> - close_op( - DeducedHandler&& h, - stream<NextLayer, deflateSupported>& ws, - close_reason const& cr) - : d_(std::forward<DeducedHandler>(h), ws, cr) - { - } - - using allocator_type = - boost::asio::associated_allocator_t<Handler>; - - allocator_type - get_allocator() const noexcept - { - return (boost::asio::get_associated_allocator)(d_.handler()); - } - - using executor_type = boost::asio::associated_executor_t< - Handler, decltype(std::declval<stream<NextLayer, deflateSupported>&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - d_.handler(), d_->ws.get_executor()); - } - - void - operator()( - error_code ec = {}, - std::size_t bytes_transferred = 0, - bool cont = true); - - friend - bool asio_handler_is_continuation(close_op* op) - { - using boost::asio::asio_handler_is_continuation; - return op->d_->cont || asio_handler_is_continuation( - std::addressof(op->d_.handler())); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, close_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, - std::addressof(op->d_.handler())); - } -}; - -template<class NextLayer, bool deflateSupported> -template<class Handler> -void -stream<NextLayer, deflateSupported>:: -close_op<Handler>:: -operator()( - error_code ec, - std::size_t bytes_transferred, - bool cont) -{ - using beast::detail::clamp; - auto& d = *d_; - d.cont = cont; - BOOST_ASIO_CORO_REENTER(*this) - { - // Maybe suspend - if(d.ws.wr_block_.try_lock(this)) - { - // Make sure the stream is open - if(! d.ws.check_open(ec)) - goto upcall; - } - else - { - // Suspend - BOOST_ASIO_CORO_YIELD - d.ws.paused_close_.emplace(std::move(*this)); - - // Acquire the write block - d.ws.wr_block_.lock(this); - - // Resume - BOOST_ASIO_CORO_YIELD - boost::asio::post( - d.ws.get_executor(), std::move(*this)); - BOOST_ASSERT(d.ws.wr_block_.is_locked(this)); - - // Make sure the stream is open - if(! d.ws.check_open(ec)) - goto upcall; - } - - // Can't call close twice - BOOST_ASSERT(! d.ws.wr_close_); - - // Change status to closing - BOOST_ASSERT(d.ws.status_ == status::open); - d.ws.status_ = status::closing; - - // Send close frame - d.ws.wr_close_ = true; - BOOST_ASIO_CORO_YIELD - boost::asio::async_write(d.ws.stream_, - d.fb.data(), std::move(*this)); - if(! d.ws.check_ok(ec)) - goto upcall; - - if(d.ws.rd_close_) - { - // This happens when the read_op gets a close frame - // at the same time close_op is sending the close frame. - // The read_op will be suspended on the write block. - goto teardown; - } - - // Maybe suspend - if(! d.ws.rd_block_.try_lock(this)) - { - // Suspend - BOOST_ASIO_CORO_YIELD - d.ws.paused_r_close_.emplace(std::move(*this)); - - // Acquire the read block - d.ws.rd_block_.lock(this); - - // Resume - BOOST_ASIO_CORO_YIELD - boost::asio::post( - d.ws.get_executor(), std::move(*this)); - BOOST_ASSERT(d.ws.rd_block_.is_locked(this)); - - // Make sure the stream is open - BOOST_ASSERT(d.ws.status_ != status::open); - BOOST_ASSERT(d.ws.status_ != status::closed); - if( d.ws.status_ == status::failed) - goto upcall; - - BOOST_ASSERT(! d.ws.rd_close_); - } - - // Drain - if(d.ws.rd_remain_ > 0) - goto read_payload; - for(;;) - { - // Read frame header - while(! d.ws.parse_fh( - d.ws.rd_fh_, d.ws.rd_buf_, d.ev)) - { - if(d.ev) - goto teardown; - BOOST_ASIO_CORO_YIELD - d.ws.stream_.async_read_some( - d.ws.rd_buf_.prepare(read_size(d.ws.rd_buf_, - d.ws.rd_buf_.max_size())), - std::move(*this)); - if(! d.ws.check_ok(ec)) - goto upcall; - d.ws.rd_buf_.commit(bytes_transferred); - } - if(detail::is_control(d.ws.rd_fh_.op)) - { - // Process control frame - if(d.ws.rd_fh_.op == detail::opcode::close) - { - BOOST_ASSERT(! d.ws.rd_close_); - d.ws.rd_close_ = true; - auto const mb = buffers_prefix( - clamp(d.ws.rd_fh_.len), - d.ws.rd_buf_.mutable_data()); - if(d.ws.rd_fh_.len > 0 && d.ws.rd_fh_.mask) - detail::mask_inplace(mb, d.ws.rd_key_); - detail::read_close(d.ws.cr_, mb, d.ev); - if(d.ev) - goto teardown; - d.ws.rd_buf_.consume(clamp(d.ws.rd_fh_.len)); - goto teardown; - } - d.ws.rd_buf_.consume(clamp(d.ws.rd_fh_.len)); - } - else - { - read_payload: - while(d.ws.rd_buf_.size() < d.ws.rd_remain_) - { - d.ws.rd_remain_ -= d.ws.rd_buf_.size(); - d.ws.rd_buf_.consume(d.ws.rd_buf_.size()); - BOOST_ASIO_CORO_YIELD - d.ws.stream_.async_read_some( - d.ws.rd_buf_.prepare(read_size(d.ws.rd_buf_, - d.ws.rd_buf_.max_size())), - std::move(*this)); - if(! d.ws.check_ok(ec)) - goto upcall; - d.ws.rd_buf_.commit(bytes_transferred); - } - BOOST_ASSERT(d.ws.rd_buf_.size() >= d.ws.rd_remain_); - d.ws.rd_buf_.consume(clamp(d.ws.rd_remain_)); - d.ws.rd_remain_ = 0; - } - } - - teardown: - // Teardown - BOOST_ASSERT(d.ws.wr_block_.is_locked(this)); - using beast::websocket::async_teardown; - BOOST_ASIO_CORO_YIELD - async_teardown(d.ws.role_, - d.ws.stream_, std::move(*this)); - BOOST_ASSERT(d.ws.wr_block_.is_locked(this)); - if(ec == boost::asio::error::eof) - { - // Rationale: - // http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error - ec.assign(0, ec.category()); - } - if(! ec) - ec = d.ev; - if(ec) - d.ws.status_ = status::failed; - else - d.ws.status_ = status::closed; - d.ws.close(); - - upcall: - BOOST_ASSERT(d.ws.wr_block_.is_locked(this)); - d.ws.wr_block_.unlock(this); - if(d.ws.rd_block_.try_unlock(this)) - d.ws.paused_r_rd_.maybe_invoke(); - d.ws.paused_rd_.maybe_invoke() || - d.ws.paused_ping_.maybe_invoke() || - d.ws.paused_wr_.maybe_invoke(); - if(! d.cont) - { - auto& ws = d.ws; - return boost::asio::post( - ws.stream_.get_executor(), - bind_handler(d_.release_handler(), ec)); - } - d_.invoke(ec); - } -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -close(close_reason const& cr) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - error_code ec; - close(cr, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -close(close_reason const& cr, error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - using beast::detail::clamp; - ec.assign(0, ec.category()); - // Make sure the stream is open - if(! check_open(ec)) - return; - // If rd_close_ is set then we already sent a close - BOOST_ASSERT(! rd_close_); - BOOST_ASSERT(! wr_close_); - wr_close_ = true; - { - detail::frame_buffer fb; - write_close<flat_static_buffer_base>(fb, cr); - boost::asio::write(stream_, fb.data(), ec); - } - if(! check_ok(ec)) - return; - status_ = status::closing; - error_code result; - // Drain the connection - if(rd_remain_ > 0) - goto read_payload; - for(;;) - { - // Read frame header - while(! parse_fh(rd_fh_, rd_buf_, result)) - { - if(result) - return do_fail( - close_code::none, result, ec); - auto const bytes_transferred = - stream_.read_some( - rd_buf_.prepare(read_size(rd_buf_, - rd_buf_.max_size())), ec); - if(! check_ok(ec)) - return; - rd_buf_.commit(bytes_transferred); - } - if(detail::is_control(rd_fh_.op)) - { - // Process control frame - if(rd_fh_.op == detail::opcode::close) - { - BOOST_ASSERT(! rd_close_); - rd_close_ = true; - auto const mb = buffers_prefix( - clamp(rd_fh_.len), - rd_buf_.mutable_data()); - if(rd_fh_.len > 0 && rd_fh_.mask) - detail::mask_inplace(mb, rd_key_); - detail::read_close(cr_, mb, result); - if(result) - { - // Protocol violation - return do_fail( - close_code::none, result, ec); - } - rd_buf_.consume(clamp(rd_fh_.len)); - break; - } - rd_buf_.consume(clamp(rd_fh_.len)); - } - else - { - read_payload: - while(rd_buf_.size() < rd_remain_) - { - rd_remain_ -= rd_buf_.size(); - rd_buf_.consume(rd_buf_.size()); - auto const bytes_transferred = - stream_.read_some( - rd_buf_.prepare(read_size(rd_buf_, - rd_buf_.max_size())), ec); - if(! check_ok(ec)) - return; - rd_buf_.commit(bytes_transferred); - } - BOOST_ASSERT(rd_buf_.size() >= rd_remain_); - rd_buf_.consume(clamp(rd_remain_)); - rd_remain_ = 0; - } - } - // _Close the WebSocket Connection_ - do_fail(close_code::none, error::closed, ec); - if(ec == error::closed) - ec.assign(0, ec.category()); -} - -template<class NextLayer, bool deflateSupported> -template<class CloseHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - CloseHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_close(close_reason const& cr, CloseHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - BOOST_BEAST_HANDLER_INIT( - CloseHandler, void(error_code)); - close_op<BOOST_ASIO_HANDLER_TYPE( - CloseHandler, void(error_code))>{ - std::move(init.completion_handler), *this, cr}( - {}, 0, false); - return init.result.get(); -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/error.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/error.ipp deleted file mode 100644 index 56a20e2551..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/error.ipp +++ /dev/null @@ -1,162 +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_WEBSOCKET_IMPL_ERROR_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_ERROR_IPP - -namespace boost { -namespace beast { -namespace websocket { -namespace detail { - -inline -const char* -error_codes:: -name() const noexcept -{ - return "boost.beast.websocket"; -} - -inline -std::string -error_codes:: -message(int ev) const -{ - switch(static_cast<error>(ev)) - { - default: - case error::closed: return "The WebSocket stream was gracefully closed at both endpoints"; - case error::buffer_overflow: return "The WebSocket operation caused a dynamic buffer overflow"; - case error::partial_deflate_block: return "The WebSocket stream produced an incomplete deflate block"; - case error::message_too_big: return "The WebSocket message exceeded the locally configured limit"; - - case error::bad_http_version: return "The WebSocket handshake was not HTTP/1.1"; - case error::bad_method: return "The WebSocket handshake method was not GET"; - case error::no_host: return "The WebSocket handshake Host field is missing"; - case error::no_connection: return "The WebSocket handshake Connection field is missing"; - case error::no_connection_upgrade: return "The WebSocket handshake Connection field is missing the upgrade token"; - case error::no_upgrade: return "The WebSocket handshake Upgrade field is missing"; - case error::no_upgrade_websocket: return "The WebSocket handshake Upgrade field is missing the websocket token"; - case error::no_sec_key: return "The WebSocket handshake Sec-WebSocket-Key field is missing"; - case error::bad_sec_key: return "The WebSocket handshake Sec-WebSocket-Key field is invalid"; - case error::no_sec_version: return "The WebSocket handshake Sec-WebSocket-Version field is missing"; - case error::bad_sec_version: return "The WebSocket handshake Sec-WebSocket-Version field is invalid"; - case error::no_sec_accept: return "The WebSocket handshake Sec-WebSocket-Accept field is missing"; - case error::bad_sec_accept: return "The WebSocket handshake Sec-WebSocket-Accept field is invalid"; - case error::upgrade_declined: return "The WebSocket handshake was declined by the remote peer"; - - case error::bad_opcode: return "The WebSocket frame contained an illegal opcode"; - case error::bad_data_frame: return "The WebSocket data frame was unexpected"; - case error::bad_continuation: return "The WebSocket continuation frame was unexpected"; - case error::bad_reserved_bits: return "The WebSocket frame contained illegal reserved bits"; - case error::bad_control_fragment: return "The WebSocket control frame was fragmented"; - case error::bad_control_size: return "The WebSocket control frame size was invalid"; - case error::bad_unmasked_frame: return "The WebSocket frame was unmasked"; - case error::bad_masked_frame: return "The WebSocket frame was masked"; - case error::bad_size: return "The WebSocket frame size was not canonical"; - case error::bad_frame_payload: return "The WebSocket frame payload was not valid utf8"; - case error::bad_close_code: return "The WebSocket close frame reason code was invalid"; - case error::bad_close_size: return "The WebSocket close frame payload size was invalid"; - case error::bad_close_payload: return "The WebSocket close frame payload was not valid utf8"; - } -} - -inline -error_condition -error_codes:: -default_error_condition(int ev) const noexcept -{ - switch(static_cast<error>(ev)) - { - default: - case error::closed: - case error::buffer_overflow: - case error::partial_deflate_block: - case error::message_too_big: - return {ev, *this}; - - case error::bad_http_version: - case error::bad_method: - case error::no_host: - case error::no_connection: - case error::no_connection_upgrade: - case error::no_upgrade: - case error::no_upgrade_websocket: - case error::no_sec_key: - case error::bad_sec_key: - case error::no_sec_version: - case error::bad_sec_version: - case error::no_sec_accept: - case error::bad_sec_accept: - case error::upgrade_declined: - return condition::handshake_failed; - - case error::bad_opcode: - case error::bad_data_frame: - case error::bad_continuation: - case error::bad_reserved_bits: - case error::bad_control_fragment: - case error::bad_control_size: - case error::bad_unmasked_frame: - case error::bad_masked_frame: - case error::bad_size: - case error::bad_frame_payload: - case error::bad_close_code: - case error::bad_close_size: - case error::bad_close_payload: - return condition::protocol_violation; - } -} - -inline -const char* -error_conditions:: -name() const noexcept -{ - return "boost.beast.websocket"; -} - -inline -std::string -error_conditions:: -message(int cv) const -{ - switch(static_cast<condition>(cv)) - { - default: - case condition::handshake_failed: return "The WebSocket handshake failed"; - case condition::protocol_violation: return "A WebSocket protocol violation occurred"; - } -} - -} // detail - -inline -error_code -make_error_code(error e) -{ - static detail::error_codes const cat{}; - return error_code{static_cast< - std::underlying_type<error>::type>(e), cat}; -} - -inline -error_condition -make_error_condition(condition c) -{ - static detail::error_conditions const cat{}; - return error_condition{static_cast< - std::underlying_type<condition>::type>(c), cat}; -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/handshake.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/handshake.ipp deleted file mode 100644 index 8e33e1a890..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/handshake.ipp +++ /dev/null @@ -1,420 +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_WEBSOCKET_IMPL_HANDSHAKE_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_HANDSHAKE_IPP - -#include <boost/beast/websocket/detail/type_traits.hpp> -#include <boost/beast/http/empty_body.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/beast/http/read.hpp> -#include <boost/beast/http/write.hpp> -#include <boost/beast/core/handler_ptr.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/coroutine.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/assert.hpp> -#include <boost/throw_exception.hpp> -#include <memory> - -namespace boost { -namespace beast { -namespace websocket { - -//------------------------------------------------------------------------------ - -// send the upgrade request and process the response -// -template<class NextLayer, bool deflateSupported> -template<class Handler> -class stream<NextLayer, deflateSupported>::handshake_op - : public boost::asio::coroutine -{ - struct data - { - stream<NextLayer, deflateSupported>& ws; - response_type* res_p; - detail::sec_ws_key_type key; - http::request<http::empty_body> req; - response_type res; - - template<class Decorator> - data( - Handler const&, - stream<NextLayer, deflateSupported>& ws_, - response_type* res_p_, - string_view host, - string_view target, - Decorator const& decorator) - : ws(ws_) - , res_p(res_p_) - , req(ws.build_request(key, - host, target, decorator)) - { - ws.reset(); - } - }; - - handler_ptr<data, Handler> d_; - -public: - handshake_op(handshake_op&&) = default; - handshake_op(handshake_op const&) = delete; - - template<class DeducedHandler, class... Args> - handshake_op(DeducedHandler&& h, - stream<NextLayer, deflateSupported>& ws, Args&&... args) - : d_(std::forward<DeducedHandler>(h), - ws, std::forward<Args>(args)...) - { - } - - using allocator_type = - boost::asio::associated_allocator_t<Handler>; - - allocator_type - get_allocator() const noexcept - { - return (boost::asio::get_associated_allocator)(d_.handler()); - } - - using executor_type = boost::asio::associated_executor_t< - Handler, decltype(std::declval<stream<NextLayer, deflateSupported>&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - d_.handler(), d_->ws.get_executor()); - } - - void - operator()( - error_code ec = {}, - std::size_t bytes_used = 0); - - friend - bool asio_handler_is_continuation(handshake_op* op) - { - using boost::asio::asio_handler_is_continuation; - return asio_handler_is_continuation( - std::addressof(op->d_.handler())); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, handshake_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, - std::addressof(op->d_.handler())); - } -}; - -template<class NextLayer, bool deflateSupported> -template<class Handler> -void -stream<NextLayer, deflateSupported>:: -handshake_op<Handler>:: -operator()(error_code ec, std::size_t) -{ - auto& d = *d_; - BOOST_ASIO_CORO_REENTER(*this) - { - // Send HTTP Upgrade - d.ws.do_pmd_config(d.req, is_deflate_supported{}); - BOOST_ASIO_CORO_YIELD - http::async_write(d.ws.stream_, - d.req, std::move(*this)); - if(ec) - goto upcall; - - // VFALCO We could pre-serialize the request to - // a single buffer, send that instead, - // and delete the buffer here. The buffer - // could be a variable block at the end - // of handler_ptr's allocation. - - // Read HTTP response - BOOST_ASIO_CORO_YIELD - http::async_read(d.ws.next_layer(), - d.ws.rd_buf_, d.res, - std::move(*this)); - if(ec) - goto upcall; - d.ws.on_response(d.res, d.key, ec); - if(d.res_p) - swap(d.res, *d.res_p); - upcall: - d_.invoke(ec); - } -} - -template<class NextLayer, bool deflateSupported> -template<class HandshakeHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - HandshakeHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_handshake(string_view host, - string_view target, - HandshakeHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - BOOST_BEAST_HANDLER_INIT( - HandshakeHandler, void(error_code)); - handshake_op<BOOST_ASIO_HANDLER_TYPE( - HandshakeHandler, void(error_code))>{ - std::move(init.completion_handler), *this, nullptr, host, - target, &default_decorate_req}(); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -template<class HandshakeHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - HandshakeHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_handshake(response_type& res, - string_view host, - string_view target, - HandshakeHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - BOOST_BEAST_HANDLER_INIT( - HandshakeHandler, void(error_code)); - handshake_op<BOOST_ASIO_HANDLER_TYPE( - HandshakeHandler, void(error_code))>{ - std::move(init.completion_handler), *this, &res, host, - target, &default_decorate_req}(); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -template<class RequestDecorator, class HandshakeHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - HandshakeHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_handshake_ex(string_view host, - string_view target, - RequestDecorator const& decorator, - HandshakeHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - static_assert(detail::is_request_decorator< - RequestDecorator>::value, - "RequestDecorator requirements not met"); - BOOST_BEAST_HANDLER_INIT( - HandshakeHandler, void(error_code)); - handshake_op<BOOST_ASIO_HANDLER_TYPE( - HandshakeHandler, void(error_code))>{ - std::move(init.completion_handler), *this, nullptr, host, - target, decorator}(); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -template<class RequestDecorator, class HandshakeHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - HandshakeHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_handshake_ex(response_type& res, - string_view host, - string_view target, - RequestDecorator const& decorator, - HandshakeHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - static_assert(detail::is_request_decorator< - RequestDecorator>::value, - "RequestDecorator requirements not met"); - BOOST_BEAST_HANDLER_INIT( - HandshakeHandler, void(error_code)); - handshake_op<BOOST_ASIO_HANDLER_TYPE( - HandshakeHandler, void(error_code))>{ - std::move(init.completion_handler), *this, &res, host, - target, decorator}(); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -handshake(string_view host, - string_view target) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - error_code ec; - handshake( - host, target, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -handshake(response_type& res, - string_view host, - string_view target) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - error_code ec; - handshake(res, host, target, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -template<class RequestDecorator> -void -stream<NextLayer, deflateSupported>:: -handshake_ex(string_view host, - string_view target, - RequestDecorator const& decorator) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(detail::is_request_decorator< - RequestDecorator>::value, - "RequestDecorator requirements not met"); - error_code ec; - handshake_ex(host, target, decorator, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -template<class RequestDecorator> -void -stream<NextLayer, deflateSupported>:: -handshake_ex(response_type& res, - string_view host, - string_view target, - RequestDecorator const& decorator) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(detail::is_request_decorator< - RequestDecorator>::value, - "RequestDecorator requirements not met"); - error_code ec; - handshake_ex(res, host, target, decorator, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -handshake(string_view host, - string_view target, error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - do_handshake(nullptr, - host, target, &default_decorate_req, ec); -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -handshake(response_type& res, - string_view host, - string_view target, - error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - do_handshake(&res, - host, target, &default_decorate_req, ec); -} - -template<class NextLayer, bool deflateSupported> -template<class RequestDecorator> -void -stream<NextLayer, deflateSupported>:: -handshake_ex(string_view host, - string_view target, - RequestDecorator const& decorator, - error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(detail::is_request_decorator< - RequestDecorator>::value, - "RequestDecorator requirements not met"); - do_handshake(nullptr, - host, target, decorator, ec); -} - -template<class NextLayer, bool deflateSupported> -template<class RequestDecorator> -void -stream<NextLayer, deflateSupported>:: -handshake_ex(response_type& res, - string_view host, - string_view target, - RequestDecorator const& decorator, - error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(detail::is_request_decorator< - RequestDecorator>::value, - "RequestDecorator requirements not met"); - do_handshake(&res, - host, target, decorator, ec); -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template<class RequestDecorator> -void -stream<NextLayer, deflateSupported>:: -do_handshake( - response_type* res_p, - string_view host, - string_view target, - RequestDecorator const& decorator, - error_code& ec) -{ - response_type res; - reset(); - detail::sec_ws_key_type key; - { - auto const req = build_request( - key, host, target, decorator); - do_pmd_config(req, is_deflate_supported{}); - http::write(stream_, req, ec); - } - if(ec) - return; - http::read(next_layer(), rd_buf_, res, ec); - if(ec) - return; - on_response(res, key, ec); - if(res_p) - *res_p = std::move(res); -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/ping.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/ping.ipp deleted file mode 100644 index c7deb9c37c..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/ping.ipp +++ /dev/null @@ -1,275 +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_WEBSOCKET_IMPL_PING_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_PING_IPP - -#include <boost/beast/core/bind_handler.hpp> -#include <boost/beast/core/handler_ptr.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/websocket/detail/frame.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/coroutine.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/asio/post.hpp> -#include <boost/throw_exception.hpp> -#include <memory> - -namespace boost { -namespace beast { -namespace websocket { - -/* - This composed operation handles sending ping and pong frames. - It only sends the frames it does not make attempts to read - any frame data. -*/ -template<class NextLayer, bool deflateSupported> -template<class Handler> -class stream<NextLayer, deflateSupported>::ping_op - : public boost::asio::coroutine -{ - struct state - { - stream<NextLayer, deflateSupported>& ws; - detail::frame_buffer fb; - - state( - Handler const&, - stream<NextLayer, deflateSupported>& ws_, - detail::opcode op, - ping_data const& payload) - : ws(ws_) - { - // Serialize the control frame - ws.template write_ping< - flat_static_buffer_base>( - fb, op, payload); - } - }; - - handler_ptr<state, Handler> d_; - -public: - static constexpr int id = 3; // for soft_mutex - - ping_op(ping_op&&) = default; - ping_op(ping_op const&) = delete; - - template<class DeducedHandler> - ping_op( - DeducedHandler&& h, - stream<NextLayer, deflateSupported>& ws, - detail::opcode op, - ping_data const& payload) - : d_(std::forward<DeducedHandler>(h), - ws, op, payload) - { - } - - using allocator_type = - boost::asio::associated_allocator_t<Handler>; - - allocator_type - get_allocator() const noexcept - { - return (boost::asio::get_associated_allocator)(d_.handler()); - } - - using executor_type = boost::asio::associated_executor_t< - Handler, decltype(std::declval<stream<NextLayer, deflateSupported>&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - d_.handler(), d_->ws.get_executor()); - } - - void operator()( - error_code ec = {}, - std::size_t bytes_transferred = 0); - - friend - bool asio_handler_is_continuation(ping_op* op) - { - using boost::asio::asio_handler_is_continuation; - return asio_handler_is_continuation( - std::addressof(op->d_.handler())); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, ping_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke( - f, std::addressof(op->d_.handler())); - } -}; - -template<class NextLayer, bool deflateSupported> -template<class Handler> -void -stream<NextLayer, deflateSupported>:: -ping_op<Handler>:: -operator()(error_code ec, std::size_t) -{ - auto& d = *d_; - BOOST_ASIO_CORO_REENTER(*this) - { - // Maybe suspend - if(d.ws.wr_block_.try_lock(this)) - { - // Make sure the stream is open - if(! d.ws.check_open(ec)) - { - BOOST_ASIO_CORO_YIELD - boost::asio::post( - d.ws.get_executor(), - bind_handler(std::move(*this), ec)); - goto upcall; - } - } - else - { - // Suspend - BOOST_ASIO_CORO_YIELD - d.ws.paused_ping_.emplace(std::move(*this)); - - // Acquire the write block - d.ws.wr_block_.lock(this); - - // Resume - BOOST_ASIO_CORO_YIELD - boost::asio::post( - d.ws.get_executor(), std::move(*this)); - BOOST_ASSERT(d.ws.wr_block_.is_locked(this)); - - // Make sure the stream is open - if(! d.ws.check_open(ec)) - goto upcall; - } - - // Send ping frame - BOOST_ASIO_CORO_YIELD - boost::asio::async_write(d.ws.stream_, - d.fb.data(), std::move(*this)); - if(! d.ws.check_ok(ec)) - goto upcall; - - upcall: - d.ws.wr_block_.unlock(this); - d.ws.paused_close_.maybe_invoke() || - d.ws.paused_rd_.maybe_invoke() || - d.ws.paused_wr_.maybe_invoke(); - d_.invoke(ec); - } -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -ping(ping_data const& payload) -{ - error_code ec; - ping(payload, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -ping(ping_data const& payload, error_code& ec) -{ - // Make sure the stream is open - if(! check_open(ec)) - return; - detail::frame_buffer fb; - write_ping<flat_static_buffer_base>( - fb, detail::opcode::ping, payload); - boost::asio::write(stream_, fb.data(), ec); - if(! check_ok(ec)) - return; -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -pong(ping_data const& payload) -{ - error_code ec; - pong(payload, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -pong(ping_data const& payload, error_code& ec) -{ - // Make sure the stream is open - if(! check_open(ec)) - return; - detail::frame_buffer fb; - write_ping<flat_static_buffer_base>( - fb, detail::opcode::pong, payload); - boost::asio::write(stream_, fb.data(), ec); - if(! check_ok(ec)) - return; -} - -template<class NextLayer, bool deflateSupported> -template<class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_ping(ping_data const& payload, WriteHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - BOOST_BEAST_HANDLER_INIT( - WriteHandler, void(error_code)); - ping_op<BOOST_ASIO_HANDLER_TYPE( - WriteHandler, void(error_code))>{ - std::move(init.completion_handler), *this, - detail::opcode::ping, payload}(); - return init.result.get(); -} - -template<class NextLayer, bool deflateSupported> -template<class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code)) -stream<NextLayer, deflateSupported>:: -async_pong(ping_data const& payload, WriteHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - BOOST_BEAST_HANDLER_INIT( - WriteHandler, void(error_code)); - ping_op<BOOST_ASIO_HANDLER_TYPE( - WriteHandler, void(error_code))>{ - std::move(init.completion_handler), *this, - detail::opcode::pong, payload}(); - return init.result.get(); -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/read.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/read.ipp deleted file mode 100644 index 1dfbd01e72..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/read.ipp +++ /dev/null @@ -1,1376 +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_WEBSOCKET_IMPL_READ_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_READ_IPP - -#include <boost/beast/websocket/teardown.hpp> -#include <boost/beast/core/bind_handler.hpp> -#include <boost/beast/core/buffers_prefix.hpp> -#include <boost/beast/core/buffers_suffix.hpp> -#include <boost/beast/core/flat_static_buffer.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/clamp.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/coroutine.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/asio/post.hpp> -#include <boost/assert.hpp> -#include <boost/config.hpp> -#include <boost/optional.hpp> -#include <boost/throw_exception.hpp> -#include <algorithm> -#include <limits> -#include <memory> - -namespace boost { -namespace beast { -namespace websocket { - -namespace detail { - -template<> -inline -void -stream_base<true>:: -inflate( - zlib::z_params& zs, - zlib::Flush flush, - error_code& ec) -{ - this->pmd_->zi.write(zs, flush, ec); -} - -template<> -inline -void -stream_base<true>:: -do_context_takeover_read(role_type role) -{ - if((role == role_type::client && - pmd_config_.server_no_context_takeover) || - (role == role_type::server && - pmd_config_.client_no_context_takeover)) - { - pmd_->zi.reset(); - } -} - -} // detail - -//------------------------------------------------------------------------------ - -/* Read some message frame data. - - Also reads and handles control frames. -*/ -template<class NextLayer, bool deflateSupported> -template< - class MutableBufferSequence, - class Handler> -class stream<NextLayer, deflateSupported>::read_some_op - : public boost::asio::coroutine -{ - Handler h_; - stream<NextLayer, deflateSupported>& ws_; - MutableBufferSequence bs_; - buffers_suffix<MutableBufferSequence> cb_; - std::size_t bytes_written_ = 0; - error_code result_; - close_code code_; - bool did_read_ = false; - bool cont_ = false; - -public: - static constexpr int id = 1; // for soft_mutex - - read_some_op(read_some_op&&) = default; - read_some_op(read_some_op const&) = delete; - - template<class DeducedHandler> - read_some_op( - DeducedHandler&& h, - stream<NextLayer, deflateSupported>& ws, - MutableBufferSequence const& bs) - : h_(std::forward<DeducedHandler>(h)) - , ws_(ws) - , bs_(bs) - , cb_(bs) - , code_(close_code::none) - { - } - - 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<stream<NextLayer, deflateSupported>&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, ws_.get_executor()); - } - - Handler& - handler() - { - return h_; - } - - void operator()( - error_code ec = {}, - std::size_t bytes_transferred = 0, - bool cont = true); - - friend - bool asio_handler_is_continuation(read_some_op* op) - { - using boost::asio::asio_handler_is_continuation; - return op->cont_ || asio_handler_is_continuation( - std::addressof(op->h_)); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, read_some_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->h_)); - } -}; - -template<class NextLayer, bool deflateSupported> -template<class MutableBufferSequence, class Handler> -void -stream<NextLayer, deflateSupported>:: -read_some_op<MutableBufferSequence, Handler>:: -operator()( - error_code ec, - std::size_t bytes_transferred, - bool cont) -{ - using beast::detail::clamp; - using boost::asio::buffer; - using boost::asio::buffer_size; - cont_ = cont; - BOOST_ASIO_CORO_REENTER(*this) - { - // Maybe suspend - do_maybe_suspend: - if(ws_.rd_block_.try_lock(this)) - { - // Make sure the stream is not closed - if( ws_.status_ == status::closed || - ws_.status_ == status::failed) - { - ec = boost::asio::error::operation_aborted; - goto upcall; - } - } - else - { - do_suspend: - // Suspend - BOOST_ASIO_CORO_YIELD - ws_.paused_r_rd_.emplace(std::move(*this)); - - // Acquire the read block - ws_.rd_block_.lock(this); - - // Resume - BOOST_ASIO_CORO_YIELD - boost::asio::post( - ws_.get_executor(), std::move(*this)); - BOOST_ASSERT(ws_.rd_block_.is_locked(this)); - - // The only way to get read blocked is if - // a `close_op` wrote a close frame - BOOST_ASSERT(ws_.wr_close_); - BOOST_ASSERT(ws_.status_ != status::open); - ec = boost::asio::error::operation_aborted; - goto upcall; - } - - // if status_ == status::closing, we want to suspend - // the read operation until the close completes, - // then finish the read with operation_aborted. - - loop: - BOOST_ASSERT(ws_.rd_block_.is_locked(this)); - // See if we need to read a frame header. This - // condition is structured to give the decompressor - // a chance to emit the final empty deflate block - // - if(ws_.rd_remain_ == 0 && - (! ws_.rd_fh_.fin || ws_.rd_done_)) - { - // Read frame header - while(! ws_.parse_fh( - ws_.rd_fh_, ws_.rd_buf_, result_)) - { - if(result_) - { - // _Fail the WebSocket Connection_ - if(result_ == error::message_too_big) - code_ = close_code::too_big; - else - code_ = close_code::protocol_error; - goto close; - } - BOOST_ASSERT(ws_.rd_block_.is_locked(this)); - BOOST_ASIO_CORO_YIELD - ws_.stream_.async_read_some( - ws_.rd_buf_.prepare(read_size( - ws_.rd_buf_, ws_.rd_buf_.max_size())), - std::move(*this)); - BOOST_ASSERT(ws_.rd_block_.is_locked(this)); - if(! ws_.check_ok(ec)) - goto upcall; - ws_.rd_buf_.commit(bytes_transferred); - - // Allow a close operation - // to acquire the read block - ws_.rd_block_.unlock(this); - if( ws_.paused_r_close_.maybe_invoke()) - { - // Suspend - BOOST_ASSERT(ws_.rd_block_.is_locked()); - goto do_suspend; - } - // Acquire read block - ws_.rd_block_.lock(this); - } - // Immediately apply the mask to the portion - // of the buffer holding payload data. - if(ws_.rd_fh_.len > 0 && ws_.rd_fh_.mask) - detail::mask_inplace(buffers_prefix( - clamp(ws_.rd_fh_.len), - ws_.rd_buf_.mutable_data()), - ws_.rd_key_); - if(detail::is_control(ws_.rd_fh_.op)) - { - // Clear this otherwise the next - // frame will be considered final. - ws_.rd_fh_.fin = false; - - // Handle ping frame - if(ws_.rd_fh_.op == detail::opcode::ping) - { - if(ws_.ctrl_cb_) - { - if(! cont_) - { - BOOST_ASIO_CORO_YIELD - boost::asio::post( - ws_.get_executor(), - std::move(*this)); - BOOST_ASSERT(cont_); - } - } - { - auto const b = buffers_prefix( - clamp(ws_.rd_fh_.len), - ws_.rd_buf_.data()); - auto const len = buffer_size(b); - BOOST_ASSERT(len == ws_.rd_fh_.len); - ping_data payload; - detail::read_ping(payload, b); - ws_.rd_buf_.consume(len); - // Ignore ping when closing - if(ws_.status_ == status::closing) - goto loop; - if(ws_.ctrl_cb_) - ws_.ctrl_cb_( - frame_type::ping, payload); - ws_.rd_fb_.reset(); - ws_.template write_ping< - flat_static_buffer_base>(ws_.rd_fb_, - detail::opcode::pong, payload); - } - - // Allow a close operation - // to acquire the read block - ws_.rd_block_.unlock(this); - ws_.paused_r_close_.maybe_invoke(); - - // Maybe suspend - if(! ws_.wr_block_.try_lock(this)) - { - // Suspend - BOOST_ASIO_CORO_YIELD - ws_.paused_rd_.emplace(std::move(*this)); - - // Acquire the write block - ws_.wr_block_.lock(this); - - // Resume - BOOST_ASIO_CORO_YIELD - boost::asio::post( - ws_.get_executor(), std::move(*this)); - BOOST_ASSERT(ws_.wr_block_.is_locked(this)); - - // Make sure the stream is open - if(! ws_.check_open(ec)) - goto upcall; - } - - // Send pong - BOOST_ASSERT(ws_.wr_block_.is_locked(this)); - BOOST_ASIO_CORO_YIELD - boost::asio::async_write(ws_.stream_, - ws_.rd_fb_.data(), std::move(*this)); - BOOST_ASSERT(ws_.wr_block_.is_locked(this)); - if(! ws_.check_ok(ec)) - goto upcall; - ws_.wr_block_.unlock(this); - ws_.paused_close_.maybe_invoke() || - ws_.paused_ping_.maybe_invoke() || - ws_.paused_wr_.maybe_invoke(); - goto do_maybe_suspend; - } - // Handle pong frame - if(ws_.rd_fh_.op == detail::opcode::pong) - { - // Ignore pong when closing - if(! ws_.wr_close_ && ws_.ctrl_cb_) - { - if(! cont_) - { - BOOST_ASIO_CORO_YIELD - boost::asio::post( - ws_.get_executor(), - std::move(*this)); - BOOST_ASSERT(cont_); - } - } - auto const cb = buffers_prefix(clamp( - ws_.rd_fh_.len), ws_.rd_buf_.data()); - auto const len = buffer_size(cb); - BOOST_ASSERT(len == ws_.rd_fh_.len); - ping_data payload; - detail::read_ping(payload, cb); - ws_.rd_buf_.consume(len); - // Ignore pong when closing - if(! ws_.wr_close_ && ws_.ctrl_cb_) - ws_.ctrl_cb_(frame_type::pong, payload); - goto loop; - } - // Handle close frame - BOOST_ASSERT(ws_.rd_fh_.op == detail::opcode::close); - { - if(ws_.ctrl_cb_) - { - if(! cont_) - { - BOOST_ASIO_CORO_YIELD - boost::asio::post( - ws_.get_executor(), - std::move(*this)); - BOOST_ASSERT(cont_); - } - } - auto const cb = buffers_prefix(clamp( - ws_.rd_fh_.len), ws_.rd_buf_.data()); - auto const len = buffer_size(cb); - BOOST_ASSERT(len == ws_.rd_fh_.len); - BOOST_ASSERT(! ws_.rd_close_); - ws_.rd_close_ = true; - close_reason cr; - detail::read_close(cr, cb, result_); - if(result_) - { - // _Fail the WebSocket Connection_ - code_ = close_code::protocol_error; - goto close; - } - ws_.cr_ = cr; - ws_.rd_buf_.consume(len); - if(ws_.ctrl_cb_) - ws_.ctrl_cb_(frame_type::close, - ws_.cr_.reason); - // See if we are already closing - if(ws_.status_ == status::closing) - { - // _Close the WebSocket Connection_ - BOOST_ASSERT(ws_.wr_close_); - code_ = close_code::none; - result_ = error::closed; - goto close; - } - // _Start the WebSocket Closing Handshake_ - code_ = cr.code == close_code::none ? - close_code::normal : - static_cast<close_code>(cr.code); - result_ = error::closed; - goto close; - } - } - if(ws_.rd_fh_.len == 0 && ! ws_.rd_fh_.fin) - { - // Empty non-final frame - goto loop; - } - ws_.rd_done_ = false; - } - if(! ws_.rd_deflated()) - { - if(ws_.rd_remain_ > 0) - { - if(ws_.rd_buf_.size() == 0 && ws_.rd_buf_.max_size() > - (std::min)(clamp(ws_.rd_remain_), - buffer_size(cb_))) - { - // Fill the read buffer first, otherwise we - // get fewer bytes at the cost of one I/O. - BOOST_ASIO_CORO_YIELD - ws_.stream_.async_read_some( - ws_.rd_buf_.prepare(read_size( - ws_.rd_buf_, ws_.rd_buf_.max_size())), - std::move(*this)); - if(! ws_.check_ok(ec)) - goto upcall; - ws_.rd_buf_.commit(bytes_transferred); - if(ws_.rd_fh_.mask) - detail::mask_inplace(buffers_prefix(clamp( - ws_.rd_remain_), ws_.rd_buf_.mutable_data()), - ws_.rd_key_); - } - if(ws_.rd_buf_.size() > 0) - { - // Copy from the read buffer. - // The mask was already applied. - bytes_transferred = buffer_copy(cb_, - ws_.rd_buf_.data(), clamp(ws_.rd_remain_)); - auto const mb = buffers_prefix( - bytes_transferred, cb_); - ws_.rd_remain_ -= bytes_transferred; - if(ws_.rd_op_ == detail::opcode::text) - { - if(! ws_.rd_utf8_.write(mb) || - (ws_.rd_remain_ == 0 && ws_.rd_fh_.fin && - ! ws_.rd_utf8_.finish())) - { - // _Fail the WebSocket Connection_ - code_ = close_code::bad_payload; - result_ = error::bad_frame_payload; - goto close; - } - } - bytes_written_ += bytes_transferred; - ws_.rd_size_ += bytes_transferred; - ws_.rd_buf_.consume(bytes_transferred); - } - else - { - // Read into caller's buffer - BOOST_ASSERT(ws_.rd_remain_ > 0); - BOOST_ASSERT(buffer_size(cb_) > 0); - BOOST_ASSERT(buffer_size(buffers_prefix( - clamp(ws_.rd_remain_), cb_)) > 0); - BOOST_ASIO_CORO_YIELD - ws_.stream_.async_read_some(buffers_prefix( - clamp(ws_.rd_remain_), cb_), std::move(*this)); - if(! ws_.check_ok(ec)) - goto upcall; - BOOST_ASSERT(bytes_transferred > 0); - auto const mb = buffers_prefix( - bytes_transferred, cb_); - ws_.rd_remain_ -= bytes_transferred; - if(ws_.rd_fh_.mask) - detail::mask_inplace(mb, ws_.rd_key_); - if(ws_.rd_op_ == detail::opcode::text) - { - if(! ws_.rd_utf8_.write(mb) || - (ws_.rd_remain_ == 0 && ws_.rd_fh_.fin && - ! ws_.rd_utf8_.finish())) - { - // _Fail the WebSocket Connection_ - code_ = close_code::bad_payload; - result_ = error::bad_frame_payload; - goto close; - } - } - bytes_written_ += bytes_transferred; - ws_.rd_size_ += bytes_transferred; - } - } - ws_.rd_done_ = ws_.rd_remain_ == 0 && ws_.rd_fh_.fin; - } - else - { - // Read compressed message frame payload: - // inflate even if rd_fh_.len == 0, otherwise we - // never emit the end-of-stream deflate block. - while(buffer_size(cb_) > 0) - { - if( ws_.rd_remain_ > 0 && - ws_.rd_buf_.size() == 0 && - ! did_read_) - { - // read new - BOOST_ASIO_CORO_YIELD - ws_.stream_.async_read_some( - ws_.rd_buf_.prepare(read_size( - ws_.rd_buf_, ws_.rd_buf_.max_size())), - std::move(*this)); - if(! ws_.check_ok(ec)) - goto upcall; - BOOST_ASSERT(bytes_transferred > 0); - ws_.rd_buf_.commit(bytes_transferred); - if(ws_.rd_fh_.mask) - detail::mask_inplace( - buffers_prefix(clamp(ws_.rd_remain_), - ws_.rd_buf_.mutable_data()), ws_.rd_key_); - did_read_ = true; - } - zlib::z_params zs; - { - auto const out = buffers_front(cb_); - zs.next_out = out.data(); - zs.avail_out = out.size(); - BOOST_ASSERT(zs.avail_out > 0); - } - if(ws_.rd_remain_ > 0) - { - if(ws_.rd_buf_.size() > 0) - { - // use what's there - auto const in = buffers_prefix( - clamp(ws_.rd_remain_), buffers_front( - ws_.rd_buf_.data())); - zs.avail_in = in.size(); - zs.next_in = in.data(); - } - else - { - break; - } - } - else if(ws_.rd_fh_.fin) - { - // append the empty block codes - static std::uint8_t constexpr - empty_block[4] = { - 0x00, 0x00, 0xff, 0xff }; - zs.next_in = empty_block; - zs.avail_in = sizeof(empty_block); - ws_.inflate(zs, zlib::Flush::sync, ec); - if(! ec) - { - // https://github.com/madler/zlib/issues/280 - if(zs.total_out > 0) - ec = error::partial_deflate_block; - } - if(! ws_.check_ok(ec)) - goto upcall; - ws_.do_context_takeover_read(ws_.role_); - ws_.rd_done_ = true; - break; - } - else - { - break; - } - ws_.inflate(zs, zlib::Flush::sync, ec); - if(! ws_.check_ok(ec)) - goto upcall; - if(ws_.rd_msg_max_ && beast::detail::sum_exceeds( - ws_.rd_size_, zs.total_out, ws_.rd_msg_max_)) - { - // _Fail the WebSocket Connection_ - code_ = close_code::too_big; - result_ = error::message_too_big; - goto close; - } - cb_.consume(zs.total_out); - ws_.rd_size_ += zs.total_out; - ws_.rd_remain_ -= zs.total_in; - ws_.rd_buf_.consume(zs.total_in); - bytes_written_ += zs.total_out; - } - if(ws_.rd_op_ == detail::opcode::text) - { - // check utf8 - if(! ws_.rd_utf8_.write( - buffers_prefix(bytes_written_, bs_)) || ( - ws_.rd_done_ && ! ws_.rd_utf8_.finish())) - { - // _Fail the WebSocket Connection_ - code_ = close_code::bad_payload; - result_ = error::bad_frame_payload; - goto close; - } - } - } - goto upcall; - - close: - if(ws_.wr_block_.try_lock(this)) - { - // Make sure the stream is open - BOOST_ASSERT(ws_.status_ == status::open); - } - else - { - // Suspend - BOOST_ASIO_CORO_YIELD - ws_.paused_rd_.emplace(std::move(*this)); - - // Acquire the write block - ws_.wr_block_.lock(this); - - // Resume - BOOST_ASIO_CORO_YIELD - boost::asio::post( - ws_.get_executor(), std::move(*this)); - BOOST_ASSERT(ws_.wr_block_.is_locked(this)); - - // Make sure the stream is open - if(! ws_.check_open(ec)) - goto upcall; - } - - // Set the status - ws_.status_ = status::closing; - - if(! ws_.wr_close_) - { - ws_.wr_close_ = true; - - // Serialize close frame - ws_.rd_fb_.reset(); - ws_.template write_close< - flat_static_buffer_base>( - ws_.rd_fb_, code_); - - // Send close frame - BOOST_ASSERT(ws_.wr_block_.is_locked(this)); - BOOST_ASIO_CORO_YIELD - boost::asio::async_write( - ws_.stream_, ws_.rd_fb_.data(), - std::move(*this)); - BOOST_ASSERT(ws_.wr_block_.is_locked(this)); - if(! ws_.check_ok(ec)) - goto upcall; - } - - // Teardown - using beast::websocket::async_teardown; - BOOST_ASSERT(ws_.wr_block_.is_locked(this)); - BOOST_ASIO_CORO_YIELD - async_teardown(ws_.role_, - ws_.stream_, std::move(*this)); - BOOST_ASSERT(ws_.wr_block_.is_locked(this)); - if(ec == boost::asio::error::eof) - { - // Rationale: - // http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error - ec.assign(0, ec.category()); - } - if(! ec) - ec = result_; - if(ec && ec != error::closed) - ws_.status_ = status::failed; - else - ws_.status_ = status::closed; - ws_.close(); - - upcall: - ws_.rd_block_.try_unlock(this); - ws_.paused_r_close_.maybe_invoke(); - if(ws_.wr_block_.try_unlock(this)) - ws_.paused_close_.maybe_invoke() || - ws_.paused_ping_.maybe_invoke() || - ws_.paused_wr_.maybe_invoke(); - if(! cont_) - return boost::asio::post( - ws_.stream_.get_executor(), - bind_handler(std::move(h_), - ec, bytes_written_)); - h_(ec, bytes_written_); - } -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template< - class DynamicBuffer, - class Handler> -class stream<NextLayer, deflateSupported>::read_op - : public boost::asio::coroutine -{ - Handler h_; - stream<NextLayer, deflateSupported>& ws_; - DynamicBuffer& b_; - std::size_t limit_; - std::size_t bytes_written_ = 0; - bool some_; - -public: - using allocator_type = - boost::asio::associated_allocator_t<Handler>; - - read_op(read_op&&) = default; - read_op(read_op const&) = delete; - - template<class DeducedHandler> - read_op( - DeducedHandler&& h, - stream<NextLayer, deflateSupported>& ws, - DynamicBuffer& b, - std::size_t limit, - bool some) - : h_(std::forward<DeducedHandler>(h)) - , ws_(ws) - , b_(b) - , limit_(limit ? limit : ( - std::numeric_limits<std::size_t>::max)()) - , some_(some) - { - } - - 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<stream<NextLayer, deflateSupported>&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, ws_.get_executor()); - } - - void operator()( - error_code ec = {}, - std::size_t bytes_transferred = 0); - - friend - bool asio_handler_is_continuation(read_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, read_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->h_)); - } -}; - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer, class Handler> -void -stream<NextLayer, deflateSupported>:: -read_op<DynamicBuffer, Handler>:: -operator()( - error_code ec, - std::size_t bytes_transferred) -{ - using beast::detail::clamp; - using buffers_type = typename - DynamicBuffer::mutable_buffers_type; - boost::optional<buffers_type> mb; - BOOST_ASIO_CORO_REENTER(*this) - { - do - { - try - { - mb.emplace(b_.prepare(clamp( - ws_.read_size_hint(b_), limit_))); - } - catch(std::length_error const&) - { - ec = error::buffer_overflow; - } - if(ec) - { - BOOST_ASIO_CORO_YIELD - boost::asio::post( - ws_.get_executor(), - bind_handler(std::move(*this), - error::buffer_overflow, 0)); - break; - } - BOOST_ASIO_CORO_YIELD - read_some_op<buffers_type, read_op>{ - std::move(*this), ws_, *mb}( - {}, 0, false); - if(ec) - break; - b_.commit(bytes_transferred); - bytes_written_ += bytes_transferred; - } - while(! some_ && ! ws_.is_message_done()); - h_(ec, bytes_written_); - } -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer> -std::size_t -stream<NextLayer, deflateSupported>:: -read(DynamicBuffer& buffer) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - error_code ec; - auto const bytes_written = read(buffer, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_written; -} - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer> -std::size_t -stream<NextLayer, deflateSupported>:: -read(DynamicBuffer& buffer, error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - std::size_t bytes_written = 0; - do - { - bytes_written += read_some(buffer, 0, ec); - if(ec) - return bytes_written; - } - while(! is_message_done()); - return bytes_written; -} - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer, class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -stream<NextLayer, deflateSupported>:: -async_read(DynamicBuffer& buffer, ReadHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - BOOST_BEAST_HANDLER_INIT( - ReadHandler, void(error_code, std::size_t)); - read_op< - DynamicBuffer, - BOOST_ASIO_HANDLER_TYPE( - ReadHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), - *this, - buffer, - 0, - false}(); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer> -std::size_t -stream<NextLayer, deflateSupported>:: -read_some( - DynamicBuffer& buffer, - std::size_t limit) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - error_code ec; - auto const bytes_written = - read_some(buffer, limit, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_written; -} - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer> -std::size_t -stream<NextLayer, deflateSupported>:: -read_some( - DynamicBuffer& buffer, - std::size_t limit, - error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - using beast::detail::clamp; - if(! limit) - limit = (std::numeric_limits<std::size_t>::max)(); - auto const size = - clamp(read_size_hint(buffer), limit); - BOOST_ASSERT(size > 0); - boost::optional<typename - DynamicBuffer::mutable_buffers_type> mb; - try - { - mb.emplace(buffer.prepare(size)); - } - catch(std::length_error const&) - { - ec = error::buffer_overflow; - return 0; - } - auto const bytes_written = read_some(*mb, ec); - buffer.commit(bytes_written); - return bytes_written; -} - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer, class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -stream<NextLayer, deflateSupported>:: -async_read_some( - DynamicBuffer& buffer, - std::size_t limit, - ReadHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - BOOST_BEAST_HANDLER_INIT( - ReadHandler, void(error_code, std::size_t)); - read_op< - DynamicBuffer, - BOOST_ASIO_HANDLER_TYPE( - ReadHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), - *this, - buffer, - limit, - true}({}, 0); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template<class MutableBufferSequence> -std::size_t -stream<NextLayer, deflateSupported>:: -read_some( - MutableBufferSequence const& buffers) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_mutable_buffer_sequence< - MutableBufferSequence>::value, - "MutableBufferSequence requirements not met"); - error_code ec; - auto const bytes_written = read_some(buffers, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_written; -} - -template<class NextLayer, bool deflateSupported> -template<class MutableBufferSequence> -std::size_t -stream<NextLayer, deflateSupported>:: -read_some( - MutableBufferSequence const& buffers, - error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_mutable_buffer_sequence< - MutableBufferSequence>::value, - "MutableBufferSequence requirements not met"); - using beast::detail::clamp; - using boost::asio::buffer; - using boost::asio::buffer_size; - close_code code{}; - std::size_t bytes_written = 0; - ec.assign(0, ec.category()); - // Make sure the stream is open - if(! check_open(ec)) - return 0; -loop: - // See if we need to read a frame header. This - // condition is structured to give the decompressor - // a chance to emit the final empty deflate block - // - if(rd_remain_ == 0 && (! rd_fh_.fin || rd_done_)) - { - // Read frame header - error_code result; - while(! parse_fh(rd_fh_, rd_buf_, result)) - { - if(result) - { - // _Fail the WebSocket Connection_ - if(result == error::message_too_big) - code = close_code::too_big; - else - code = close_code::protocol_error; - do_fail(code, result, ec); - return bytes_written; - } - auto const bytes_transferred = - stream_.read_some( - rd_buf_.prepare(read_size( - rd_buf_, rd_buf_.max_size())), - ec); - if(! check_ok(ec)) - return bytes_written; - rd_buf_.commit(bytes_transferred); - } - // Immediately apply the mask to the portion - // of the buffer holding payload data. - if(rd_fh_.len > 0 && rd_fh_.mask) - detail::mask_inplace(buffers_prefix( - clamp(rd_fh_.len), rd_buf_.mutable_data()), - rd_key_); - if(detail::is_control(rd_fh_.op)) - { - // Get control frame payload - auto const b = buffers_prefix( - clamp(rd_fh_.len), rd_buf_.data()); - auto const len = buffer_size(b); - BOOST_ASSERT(len == rd_fh_.len); - - // Clear this otherwise the next - // frame will be considered final. - rd_fh_.fin = false; - - // Handle ping frame - if(rd_fh_.op == detail::opcode::ping) - { - ping_data payload; - detail::read_ping(payload, b); - rd_buf_.consume(len); - if(wr_close_) - { - // Ignore ping when closing - goto loop; - } - if(ctrl_cb_) - ctrl_cb_(frame_type::ping, payload); - detail::frame_buffer fb; - write_ping<flat_static_buffer_base>(fb, - detail::opcode::pong, payload); - boost::asio::write(stream_, fb.data(), ec); - if(! check_ok(ec)) - return bytes_written; - goto loop; - } - // Handle pong frame - if(rd_fh_.op == detail::opcode::pong) - { - ping_data payload; - detail::read_ping(payload, b); - rd_buf_.consume(len); - if(ctrl_cb_) - ctrl_cb_(frame_type::pong, payload); - goto loop; - } - // Handle close frame - BOOST_ASSERT(rd_fh_.op == detail::opcode::close); - { - BOOST_ASSERT(! rd_close_); - rd_close_ = true; - close_reason cr; - detail::read_close(cr, b, result); - if(result) - { - // _Fail the WebSocket Connection_ - do_fail(close_code::protocol_error, - result, ec); - return bytes_written; - } - cr_ = cr; - rd_buf_.consume(len); - if(ctrl_cb_) - ctrl_cb_(frame_type::close, cr_.reason); - BOOST_ASSERT(! wr_close_); - // _Start the WebSocket Closing Handshake_ - do_fail( - cr.code == close_code::none ? - close_code::normal : - static_cast<close_code>(cr.code), - error::closed, ec); - return bytes_written; - } - } - if(rd_fh_.len == 0 && ! rd_fh_.fin) - { - // Empty non-final frame - goto loop; - } - rd_done_ = false; - } - else - { - ec.assign(0, ec.category()); - } - if(! this->rd_deflated()) - { - if(rd_remain_ > 0) - { - if(rd_buf_.size() == 0 && rd_buf_.max_size() > - (std::min)(clamp(rd_remain_), - buffer_size(buffers))) - { - // Fill the read buffer first, otherwise we - // get fewer bytes at the cost of one I/O. - rd_buf_.commit(stream_.read_some( - rd_buf_.prepare(read_size(rd_buf_, - rd_buf_.max_size())), ec)); - if(! check_ok(ec)) - return bytes_written; - if(rd_fh_.mask) - detail::mask_inplace( - buffers_prefix(clamp(rd_remain_), - rd_buf_.mutable_data()), rd_key_); - } - if(rd_buf_.size() > 0) - { - // Copy from the read buffer. - // The mask was already applied. - auto const bytes_transferred = - buffer_copy(buffers, rd_buf_.data(), - clamp(rd_remain_)); - auto const mb = buffers_prefix( - bytes_transferred, buffers); - rd_remain_ -= bytes_transferred; - if(rd_op_ == detail::opcode::text) - { - if(! rd_utf8_.write(mb) || - (rd_remain_ == 0 && rd_fh_.fin && - ! rd_utf8_.finish())) - { - // _Fail the WebSocket Connection_ - do_fail(close_code::bad_payload, - error::bad_frame_payload, ec); - return bytes_written; - } - } - bytes_written += bytes_transferred; - rd_size_ += bytes_transferred; - rd_buf_.consume(bytes_transferred); - } - else - { - // Read into caller's buffer - BOOST_ASSERT(rd_remain_ > 0); - BOOST_ASSERT(buffer_size(buffers) > 0); - BOOST_ASSERT(buffer_size(buffers_prefix( - clamp(rd_remain_), buffers)) > 0); - auto const bytes_transferred = - stream_.read_some(buffers_prefix( - clamp(rd_remain_), buffers), ec); - if(! check_ok(ec)) - return bytes_written; - BOOST_ASSERT(bytes_transferred > 0); - auto const mb = buffers_prefix( - bytes_transferred, buffers); - rd_remain_ -= bytes_transferred; - if(rd_fh_.mask) - detail::mask_inplace(mb, rd_key_); - if(rd_op_ == detail::opcode::text) - { - if(! rd_utf8_.write(mb) || - (rd_remain_ == 0 && rd_fh_.fin && - ! rd_utf8_.finish())) - { - // _Fail the WebSocket Connection_ - do_fail(close_code::bad_payload, - error::bad_frame_payload, ec); - return bytes_written; - } - } - bytes_written += bytes_transferred; - rd_size_ += bytes_transferred; - } - } - rd_done_ = rd_remain_ == 0 && rd_fh_.fin; - } - else - { - // Read compressed message frame payload: - // inflate even if rd_fh_.len == 0, otherwise we - // never emit the end-of-stream deflate block. - // - bool did_read = false; - buffers_suffix<MutableBufferSequence> cb{buffers}; - while(buffer_size(cb) > 0) - { - zlib::z_params zs; - { - auto const out = buffers_front(cb); - zs.next_out = out.data(); - zs.avail_out = out.size(); - BOOST_ASSERT(zs.avail_out > 0); - } - if(rd_remain_ > 0) - { - if(rd_buf_.size() > 0) - { - // use what's there - auto const in = buffers_prefix( - clamp(rd_remain_), buffers_front( - rd_buf_.data())); - zs.avail_in = in.size(); - zs.next_in = in.data(); - } - else if(! did_read) - { - // read new - auto const bytes_transferred = - stream_.read_some( - rd_buf_.prepare(read_size( - rd_buf_, rd_buf_.max_size())), - ec); - if(! check_ok(ec)) - return bytes_written; - BOOST_ASSERT(bytes_transferred > 0); - rd_buf_.commit(bytes_transferred); - if(rd_fh_.mask) - detail::mask_inplace( - buffers_prefix(clamp(rd_remain_), - rd_buf_.mutable_data()), rd_key_); - auto const in = buffers_prefix( - clamp(rd_remain_), buffers_front( - rd_buf_.data())); - zs.avail_in = in.size(); - zs.next_in = in.data(); - did_read = true; - } - else - { - break; - } - } - else if(rd_fh_.fin) - { - // append the empty block codes - static std::uint8_t constexpr - empty_block[4] = { - 0x00, 0x00, 0xff, 0xff }; - zs.next_in = empty_block; - zs.avail_in = sizeof(empty_block); - this->inflate(zs, zlib::Flush::sync, ec); - if(! ec) - { - // https://github.com/madler/zlib/issues/280 - if(zs.total_out > 0) - ec = error::partial_deflate_block; - } - if(! check_ok(ec)) - return bytes_written; - this->do_context_takeover_read(role_); - rd_done_ = true; - break; - } - else - { - break; - } - this->inflate(zs, zlib::Flush::sync, ec); - if(! check_ok(ec)) - return bytes_written; - if(rd_msg_max_ && beast::detail::sum_exceeds( - rd_size_, zs.total_out, rd_msg_max_)) - { - do_fail(close_code::too_big, - error::message_too_big, ec); - return bytes_written; - } - cb.consume(zs.total_out); - rd_size_ += zs.total_out; - rd_remain_ -= zs.total_in; - rd_buf_.consume(zs.total_in); - bytes_written += zs.total_out; - } - if(rd_op_ == detail::opcode::text) - { - // check utf8 - if(! rd_utf8_.write( - buffers_prefix(bytes_written, buffers)) || ( - rd_done_ && ! rd_utf8_.finish())) - { - // _Fail the WebSocket Connection_ - do_fail(close_code::bad_payload, - error::bad_frame_payload, ec); - return bytes_written; - } - } - } - return bytes_written; -} - -template<class NextLayer, bool deflateSupported> -template<class MutableBufferSequence, class ReadHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) -stream<NextLayer, deflateSupported>:: -async_read_some( - MutableBufferSequence const& buffers, - ReadHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream requirements not met"); - 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)); - read_some_op<MutableBufferSequence, BOOST_ASIO_HANDLER_TYPE( - ReadHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), *this, buffers}( - {}, 0, false); - return init.result.get(); -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/rfc6455.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/rfc6455.ipp deleted file mode 100644 index 07fdc30686..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/rfc6455.ipp +++ /dev/null @@ -1,40 +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_WEBSOCKET_IMPL_RFC6455_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_RFC6455_IPP - -#include <boost/beast/http/fields.hpp> -#include <boost/beast/http/rfc7230.hpp> - -namespace boost { -namespace beast { -namespace websocket { - -template<class Allocator> -bool -is_upgrade(http::header<true, - http::basic_fields<Allocator>> const& req) -{ - if(req.version() < 11) - return false; - if(req.method() != http::verb::get) - return false; - if(! http::token_list{req[http::field::connection]}.exists("upgrade")) - return false; - if(! http::token_list{req[http::field::upgrade]}.exists("websocket")) - return false; - return true; -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/ssl.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/ssl.ipp deleted file mode 100644 index 442b45086a..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/ssl.ipp +++ /dev/null @@ -1,61 +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_WEBSOCKET_IMPL_SSL_IPP_INCLUDED -#define BOOST_BEAST_WEBSOCKET_IMPL_SSL_IPP_INCLUDED - -#include <utility> - -namespace boost { -namespace beast { -namespace websocket { - -/* - -See -http://stackoverflow.com/questions/32046034/what-is-the-proper-way-to-securely-disconnect-an-asio-ssl-socket/32054476#32054476 - -Behavior of ssl::stream regarding close_ - - If the remote host calls async_shutdown then the - local host's async_read will complete with eof. - - If both hosts call async_shutdown then the calls - to async_shutdown will complete with eof. - -*/ - -template<class AsyncStream> -void -teardown( - role_type, - boost::asio::ssl::stream<AsyncStream>& stream, - error_code& ec) -{ - stream.shutdown(ec); -} - -template< - class AsyncStream, - class TeardownHandler> -void -async_teardown( - role_type, - boost::asio::ssl::stream<AsyncStream>& stream, - TeardownHandler&& handler) -{ - stream.async_shutdown( - std::forward<TeardownHandler>(handler)); -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/stream.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/stream.ipp deleted file mode 100644 index cf747c230d..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/stream.ipp +++ /dev/null @@ -1,894 +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_WEBSOCKET_IMPL_STREAM_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_STREAM_IPP - -#include <boost/beast/websocket/rfc6455.hpp> -#include <boost/beast/websocket/teardown.hpp> -#include <boost/beast/websocket/detail/hybi13.hpp> -#include <boost/beast/websocket/detail/pmd_extension.hpp> -#include <boost/beast/version.hpp> -#include <boost/beast/http/read.hpp> -#include <boost/beast/http/write.hpp> -#include <boost/beast/http/rfc7230.hpp> -#include <boost/beast/core/buffers_cat.hpp> -#include <boost/beast/core/buffers_prefix.hpp> -#include <boost/beast/core/buffers_suffix.hpp> -#include <boost/beast/core/flat_static_buffer.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/clamp.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/assert.hpp> -#include <boost/endian/buffers.hpp> -#include <boost/make_unique.hpp> -#include <boost/throw_exception.hpp> -#include <algorithm> -#include <memory> -#include <stdexcept> -#include <utility> - -#include <iostream> - -namespace boost { -namespace beast { -namespace websocket { - -template<class NextLayer, bool deflateSupported> -template<class... Args> -stream<NextLayer, deflateSupported>:: -stream(Args&&... args) - : stream_(std::forward<Args>(args)...) -{ - BOOST_ASSERT(rd_buf_.max_size() >= - max_control_frame_size); -} - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer, class> -std::size_t -stream<NextLayer, deflateSupported>:: -read_size_hint(DynamicBuffer& buffer) const -{ - static_assert( - boost::asio::is_dynamic_buffer<DynamicBuffer>::value, - "DynamicBuffer requirements not met"); - auto const initial_size = (std::min)( - +tcp_frame_size, - buffer.max_size() - buffer.size()); - if(initial_size == 0) - return 1; // buffer is full - return read_size_hint(initial_size); -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -set_option(permessage_deflate const& o, std::true_type) -{ - if( o.server_max_window_bits > 15 || - o.server_max_window_bits < 9) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "invalid server_max_window_bits"}); - if( o.client_max_window_bits > 15 || - o.client_max_window_bits < 9) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "invalid client_max_window_bits"}); - if( o.compLevel < 0 || - o.compLevel > 9) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "invalid compLevel"}); - if( o.memLevel < 1 || - o.memLevel > 9) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "invalid memLevel"}); - this->pmd_opts_ = o; -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -set_option(permessage_deflate const& o, std::false_type) -{ - if(o.client_enable || o.server_enable) - { - // Can't enable permessage-deflate - // when deflateSupported == false. - // - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "deflateSupported == false"}); - } -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -open(role_type role) -{ - // VFALCO TODO analyze and remove dupe code in reset() - role_ = role; - status_ = status::open; - rd_remain_ = 0; - rd_cont_ = false; - rd_done_ = true; - // Can't clear this because accept uses it - //rd_buf_.reset(); - rd_fh_.fin = false; - rd_close_ = false; - wr_close_ = false; - // These should not be necessary, because all completion - // handlers must be allowed to execute otherwise the - // stream exhibits undefined behavior. - wr_block_.reset(); - rd_block_.reset(); - cr_.code = close_code::none; - - wr_cont_ = false; - wr_buf_size_ = 0; - - open_pmd(is_deflate_supported{}); -} - -template<class NextLayer, bool deflateSupported> -inline -void -stream<NextLayer, deflateSupported>:: -open_pmd(std::true_type) -{ - if(((role_ == role_type::client && - this->pmd_opts_.client_enable) || - (role_ == role_type::server && - this->pmd_opts_.server_enable)) && - this->pmd_config_.accept) - { - pmd_normalize(this->pmd_config_); - this->pmd_.reset(new typename - detail::stream_base<deflateSupported>::pmd_type); - if(role_ == role_type::client) - { - this->pmd_->zi.reset( - this->pmd_config_.server_max_window_bits); - this->pmd_->zo.reset( - this->pmd_opts_.compLevel, - this->pmd_config_.client_max_window_bits, - this->pmd_opts_.memLevel, - zlib::Strategy::normal); - } - else - { - this->pmd_->zi.reset( - this->pmd_config_.client_max_window_bits); - this->pmd_->zo.reset( - this->pmd_opts_.compLevel, - this->pmd_config_.server_max_window_bits, - this->pmd_opts_.memLevel, - zlib::Strategy::normal); - } - } -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -close() -{ - wr_buf_.reset(); - close_pmd(is_deflate_supported{}); -} - -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -reset() -{ - BOOST_ASSERT(status_ != status::open); - rd_remain_ = 0; - rd_cont_ = false; - rd_done_ = true; - rd_buf_.consume(rd_buf_.size()); - rd_fh_.fin = false; - rd_close_ = false; - wr_close_ = false; - wr_cont_ = false; - // These should not be necessary, because all completion - // handlers must be allowed to execute otherwise the - // stream exhibits undefined behavior. - wr_block_.reset(); - rd_block_.reset(); - cr_.code = close_code::none; -} - -// Called before each write frame -template<class NextLayer, bool deflateSupported> -inline -void -stream<NextLayer, deflateSupported>:: -begin_msg(std::true_type) -{ - wr_frag_ = wr_frag_opt_; - wr_compress_ = static_cast<bool>(this->pmd_); - - // Maintain the write buffer - if( wr_compress_ || - role_ == role_type::client) - { - if(! wr_buf_ || wr_buf_size_ != wr_buf_opt_) - { - wr_buf_size_ = wr_buf_opt_; - wr_buf_ = boost::make_unique_noinit< - std::uint8_t[]>(wr_buf_size_); - } - } - else - { - wr_buf_size_ = wr_buf_opt_; - wr_buf_.reset(); - } -} - -// Called before each write frame -template<class NextLayer, bool deflateSupported> -inline -void -stream<NextLayer, deflateSupported>:: -begin_msg(std::false_type) -{ - wr_frag_ = wr_frag_opt_; - - // Maintain the write buffer - if(role_ == role_type::client) - { - if(! wr_buf_ || wr_buf_size_ != wr_buf_opt_) - { - wr_buf_size_ = wr_buf_opt_; - wr_buf_ = boost::make_unique_noinit< - std::uint8_t[]>(wr_buf_size_); - } - } - else - { - wr_buf_size_ = wr_buf_opt_; - wr_buf_.reset(); - } -} - -template<class NextLayer, bool deflateSupported> -std::size_t -stream<NextLayer, deflateSupported>:: -read_size_hint( - std::size_t initial_size, - std::true_type) const -{ - using beast::detail::clamp; - std::size_t result; - BOOST_ASSERT(initial_size > 0); - if(! this->pmd_ || (! rd_done_ && ! this->pmd_->rd_set)) - { - // current message is uncompressed - - if(rd_done_) - { - // first message frame - result = initial_size; - goto done; - } - else if(rd_fh_.fin) - { - // last message frame - BOOST_ASSERT(rd_remain_ > 0); - result = clamp(rd_remain_); - goto done; - } - } - result = (std::max)( - initial_size, clamp(rd_remain_)); -done: - BOOST_ASSERT(result != 0); - return result; -} - -template<class NextLayer, bool deflateSupported> -std::size_t -stream<NextLayer, deflateSupported>:: -read_size_hint( - std::size_t initial_size, - std::false_type) const -{ - using beast::detail::clamp; - std::size_t result; - BOOST_ASSERT(initial_size > 0); - // compression is not supported - if(rd_done_) - { - // first message frame - result = initial_size; - } - else if(rd_fh_.fin) - { - // last message frame - BOOST_ASSERT(rd_remain_ > 0); - result = clamp(rd_remain_); - } - else - { - result = (std::max)( - initial_size, clamp(rd_remain_)); - } - BOOST_ASSERT(result != 0); - return result; -} - -//------------------------------------------------------------------------------ - -// Attempt to read a complete frame header. -// Returns `false` if more bytes are needed -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer> -bool -stream<NextLayer, deflateSupported>:: -parse_fh( - detail::frame_header& fh, - DynamicBuffer& b, - error_code& ec) -{ - using boost::asio::buffer; - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - if(buffer_size(b.data()) < 2) - { - // need more bytes - ec.assign(0, ec.category()); - return false; - } - buffers_suffix<typename - DynamicBuffer::const_buffers_type> cb{ - b.data()}; - std::size_t need; - { - std::uint8_t tmp[2]; - cb.consume(buffer_copy(buffer(tmp), cb)); - fh.len = tmp[1] & 0x7f; - switch(fh.len) - { - case 126: need = 2; break; - case 127: need = 8; break; - default: - need = 0; - } - fh.mask = (tmp[1] & 0x80) != 0; - if(fh.mask) - need += 4; - if(buffer_size(cb) < need) - { - // need more bytes - ec.assign(0, ec.category()); - return false; - } - fh.op = static_cast< - detail::opcode>(tmp[0] & 0x0f); - fh.fin = (tmp[0] & 0x80) != 0; - fh.rsv1 = (tmp[0] & 0x40) != 0; - fh.rsv2 = (tmp[0] & 0x20) != 0; - fh.rsv3 = (tmp[0] & 0x10) != 0; - } - switch(fh.op) - { - case detail::opcode::binary: - case detail::opcode::text: - if(rd_cont_) - { - // new data frame when continuation expected - ec = error::bad_data_frame; - return false; - } - if(fh.rsv2 || fh.rsv3 || - ! this->rd_deflated(fh.rsv1)) - { - // reserved bits not cleared - ec = error::bad_reserved_bits; - return false; - } - break; - - case detail::opcode::cont: - if(! rd_cont_) - { - // continuation without an active message - ec = error::bad_continuation; - return false; - } - if(fh.rsv1 || fh.rsv2 || fh.rsv3) - { - // reserved bits not cleared - ec = error::bad_reserved_bits; - return false; - } - break; - - default: - if(detail::is_reserved(fh.op)) - { - // reserved opcode - ec = error::bad_opcode; - return false; - } - if(! fh.fin) - { - // fragmented control message - ec = error::bad_control_fragment; - return false; - } - if(fh.len > 125) - { - // invalid length for control message - ec = error::bad_control_size; - return false; - } - if(fh.rsv1 || fh.rsv2 || fh.rsv3) - { - // reserved bits not cleared - ec = error::bad_reserved_bits; - return false; - } - break; - } - if(role_ == role_type::server && ! fh.mask) - { - // unmasked frame from client - ec = error::bad_unmasked_frame; - return false; - } - if(role_ == role_type::client && fh.mask) - { - // masked frame from server - ec = error::bad_masked_frame; - return false; - } - if(detail::is_control(fh.op) && - buffer_size(cb) < need + fh.len) - { - // Make the entire control frame payload - // get read in before we return `true` - return false; - } - switch(fh.len) - { - case 126: - { - std::uint8_t tmp[2]; - BOOST_ASSERT(buffer_size(cb) >= sizeof(tmp)); - cb.consume(buffer_copy(buffer(tmp), cb)); - fh.len = detail::big_uint16_to_native(&tmp[0]); - if(fh.len < 126) - { - // length not canonical - ec = error::bad_size; - return false; - } - break; - } - case 127: - { - std::uint8_t tmp[8]; - BOOST_ASSERT(buffer_size(cb) >= sizeof(tmp)); - cb.consume(buffer_copy(buffer(tmp), cb)); - fh.len = detail::big_uint64_to_native(&tmp[0]); - if(fh.len < 65536) - { - // length not canonical - ec = error::bad_size; - return false; - } - break; - } - } - if(fh.mask) - { - std::uint8_t tmp[4]; - BOOST_ASSERT(buffer_size(cb) >= sizeof(tmp)); - cb.consume(buffer_copy(buffer(tmp), cb)); - fh.key = detail::little_uint32_to_native(&tmp[0]); - detail::prepare_key(rd_key_, fh.key); - } - else - { - // initialize this otherwise operator== breaks - fh.key = 0; - } - if(! detail::is_control(fh.op)) - { - if(fh.op != detail::opcode::cont) - { - rd_size_ = 0; - rd_op_ = fh.op; - } - else - { - if(rd_size_ > (std::numeric_limits< - std::uint64_t>::max)() - fh.len) - { - // message size exceeds configured limit - ec = error::message_too_big; - return false; - } - } - if(! this->rd_deflated()) - { - if(rd_msg_max_ && beast::detail::sum_exceeds( - rd_size_, fh.len, rd_msg_max_)) - { - // message size exceeds configured limit - ec = error::message_too_big; - return false; - } - } - rd_cont_ = ! fh.fin; - rd_remain_ = fh.len; - } - b.consume(b.size() - buffer_size(cb)); - ec.assign(0, ec.category()); - return true; -} - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer> -void -stream<NextLayer, deflateSupported>:: -write_close(DynamicBuffer& db, close_reason const& cr) -{ - using namespace boost::endian; - detail::frame_header fh; - fh.op = detail::opcode::close; - fh.fin = true; - fh.rsv1 = false; - fh.rsv2 = false; - fh.rsv3 = false; - fh.len = cr.code == close_code::none ? - 0 : 2 + cr.reason.size(); - if(role_ == role_type::client) - { - fh.mask = true; - fh.key = wr_gen_(); - } - else - { - fh.mask = false; - } - detail::write(db, fh); - if(cr.code != close_code::none) - { - detail::prepared_key key; - if(fh.mask) - detail::prepare_key(key, fh.key); - { - std::uint8_t tmp[2]; - ::new(&tmp[0]) big_uint16_buf_t{ - (std::uint16_t)cr.code}; - auto mb = db.prepare(2); - boost::asio::buffer_copy(mb, - boost::asio::buffer(tmp)); - if(fh.mask) - detail::mask_inplace(mb, key); - db.commit(2); - } - if(! cr.reason.empty()) - { - auto mb = db.prepare(cr.reason.size()); - boost::asio::buffer_copy(mb, - boost::asio::const_buffer( - cr.reason.data(), cr.reason.size())); - if(fh.mask) - detail::mask_inplace(mb, key); - db.commit(cr.reason.size()); - } - } -} - -template<class NextLayer, bool deflateSupported> -template<class DynamicBuffer> -void -stream<NextLayer, deflateSupported>:: -write_ping(DynamicBuffer& db, - detail::opcode code, ping_data const& data) -{ - detail::frame_header fh; - fh.op = code; - fh.fin = true; - fh.rsv1 = false; - fh.rsv2 = false; - fh.rsv3 = false; - fh.len = data.size(); - fh.mask = role_ == role_type::client; - if(fh.mask) - fh.key = wr_gen_(); - detail::write(db, fh); - if(data.empty()) - return; - detail::prepared_key key; - if(fh.mask) - detail::prepare_key(key, fh.key); - auto mb = db.prepare(data.size()); - boost::asio::buffer_copy(mb, - boost::asio::const_buffer( - data.data(), data.size())); - if(fh.mask) - detail::mask_inplace(mb, key); - db.commit(data.size()); -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template<class Decorator> -request_type -stream<NextLayer, deflateSupported>:: -build_request(detail::sec_ws_key_type& key, - string_view host, string_view target, - Decorator const& decorator) -{ - request_type req; - req.target(target); - req.version(11); - req.method(http::verb::get); - req.set(http::field::host, host); - req.set(http::field::upgrade, "websocket"); - req.set(http::field::connection, "upgrade"); - detail::make_sec_ws_key(key, wr_gen_); - req.set(http::field::sec_websocket_key, key); - req.set(http::field::sec_websocket_version, "13"); - build_request_pmd(req, is_deflate_supported{}); - decorator(req); - if(! req.count(http::field::user_agent)) - req.set(http::field::user_agent, - BOOST_BEAST_VERSION_STRING); - return req; -} - -template<class NextLayer, bool deflateSupported> -inline -void -stream<NextLayer, deflateSupported>:: -build_request_pmd(request_type& req, std::true_type) -{ - if(this->pmd_opts_.client_enable) - { - detail::pmd_offer config; - config.accept = true; - config.server_max_window_bits = - this->pmd_opts_.server_max_window_bits; - config.client_max_window_bits = - this->pmd_opts_.client_max_window_bits; - config.server_no_context_takeover = - this->pmd_opts_.server_no_context_takeover; - config.client_no_context_takeover = - this->pmd_opts_.client_no_context_takeover; - detail::pmd_write(req, config); - } -} - -template<class NextLayer, bool deflateSupported> -template<class Body, class Allocator, class Decorator> -response_type -stream<NextLayer, deflateSupported>:: -build_response( - http::request<Body, - http::basic_fields<Allocator>> const& req, - Decorator const& decorator, - error_code& result) -{ - auto const decorate = - [&decorator](response_type& res) - { - decorator(res); - if(! res.count(http::field::server)) - { - BOOST_STATIC_ASSERT(sizeof(BOOST_BEAST_VERSION_STRING) < 20); - static_string<20> s(BOOST_BEAST_VERSION_STRING); - res.set(http::field::server, s); - } - }; - auto err = - [&](error e) - { - result = e; - response_type res; - res.version(req.version()); - res.result(http::status::bad_request); - res.body() = result.message(); - res.prepare_payload(); - decorate(res); - return res; - }; - if(req.version() != 11) - return err(error::bad_http_version); - if(req.method() != http::verb::get) - return err(error::bad_method); - if(! req.count(http::field::host)) - return err(error::no_host); - { - auto const it = req.find(http::field::connection); - if(it == req.end()) - return err(error::no_connection); - if(! http::token_list{it->value()}.exists("upgrade")) - return err(error::no_connection_upgrade); - } - { - auto const it = req.find(http::field::upgrade); - if(it == req.end()) - return err(error::no_upgrade); - if(! http::token_list{it->value()}.exists("websocket")) - return err(error::no_upgrade_websocket); - } - string_view key; - { - auto const it = req.find(http::field::sec_websocket_key); - if(it == req.end()) - return err(error::no_sec_key); - key = it->value(); - if(key.size() > detail::sec_ws_key_type::max_size_n) - return err(error::bad_sec_key); - } - { - auto const it = req.find(http::field::sec_websocket_version); - if(it == req.end()) - return err(error::no_sec_version); - if(it->value() != "13") - { - response_type res; - res.result(http::status::upgrade_required); - res.version(req.version()); - res.set(http::field::sec_websocket_version, "13"); - result = error::bad_sec_version; - res.body() = result.message(); - res.prepare_payload(); - decorate(res); - return res; - } - } - - response_type res; - res.result(http::status::switching_protocols); - res.version(req.version()); - res.set(http::field::upgrade, "websocket"); - res.set(http::field::connection, "upgrade"); - { - detail::sec_ws_accept_type acc; - detail::make_sec_ws_accept(acc, key); - res.set(http::field::sec_websocket_accept, acc); - } - build_response_pmd(res, req, is_deflate_supported{}); - decorate(res); - result = {}; - return res; -} - -template<class NextLayer, bool deflateSupported> -template<class Body, class Allocator> -inline -void -stream<NextLayer, deflateSupported>:: -build_response_pmd( - response_type& res, - http::request<Body, - http::basic_fields<Allocator>> const& req, - std::true_type) -{ - detail::pmd_offer offer; - detail::pmd_offer unused; - pmd_read(offer, req); - pmd_negotiate(res, unused, offer, this->pmd_opts_); -} - -// Called when the WebSocket Upgrade response is received -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -on_response( - response_type const& res, - detail::sec_ws_key_type const& key, - error_code& ec) -{ - auto const err = - [&](error e) - { - ec = e; - }; - if(res.result() != http::status::switching_protocols) - return err(error::upgrade_declined); - if(res.version() != 11) - return err(error::bad_http_version); - { - auto const it = res.find(http::field::connection); - if(it == res.end()) - return err(error::no_connection); - if(! http::token_list{it->value()}.exists("upgrade")) - return err(error::no_connection_upgrade); - } - { - auto const it = res.find(http::field::upgrade); - if(it == res.end()) - return err(error::no_upgrade); - if(! http::token_list{it->value()}.exists("websocket")) - return err(error::no_upgrade_websocket); - } - { - auto const it = res.find(http::field::sec_websocket_accept); - if(it == res.end()) - return err(error::no_sec_accept); - detail::sec_ws_accept_type acc; - detail::make_sec_ws_accept(acc, key); - if(acc.compare(it->value()) != 0) - return err(error::bad_sec_accept); - } - - ec.assign(0, ec.category()); - on_response_pmd(res, is_deflate_supported{}); - open(role_type::client); -} - -template<class NextLayer, bool deflateSupported> -inline -void -stream<NextLayer, deflateSupported>:: -on_response_pmd( - response_type const& res, - std::true_type) -{ - detail::pmd_offer offer; - pmd_read(offer, res); - // VFALCO see if offer satisfies pmd_config_, - // return an error if not. - this->pmd_config_ = offer; // overwrite for now -} - -// _Fail the WebSocket Connection_ -template<class NextLayer, bool deflateSupported> -void -stream<NextLayer, deflateSupported>:: -do_fail( - std::uint16_t code, // if set, send a close frame first - error_code ev, // error code to use upon success - error_code& ec) // set to the error, else set to ev -{ - BOOST_ASSERT(ev); - status_ = status::closing; - if(code != close_code::none && ! wr_close_) - { - wr_close_ = true; - detail::frame_buffer fb; - write_close< - flat_static_buffer_base>(fb, code); - boost::asio::write(stream_, fb.data(), ec); - if(! check_ok(ec)) - return; - } - using beast::websocket::teardown; - teardown(role_, stream_, ec); - if(ec == boost::asio::error::eof) - { - // Rationale: - // http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error - ec.assign(0, ec.category()); - } - if(! ec) - ec = ev; - if(ec && ec != error::closed) - status_ = status::failed; - else - status_ = status::closed; - close(); -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/teardown.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/teardown.ipp deleted file mode 100644 index add6b2773d..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/teardown.ipp +++ /dev/null @@ -1,226 +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_WEBSOCKET_IMPL_TEARDOWN_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_TEARDOWN_IPP - -#include <boost/beast/core/bind_handler.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/coroutine.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/asio/post.hpp> -#include <memory> - -namespace boost { -namespace beast { -namespace websocket { - -namespace detail { - -template<class Handler> -class teardown_tcp_op : public boost::asio::coroutine -{ - using socket_type = - boost::asio::ip::tcp::socket; - - Handler h_; - socket_type& s_; - role_type role_; - bool nb_; - -public: - teardown_tcp_op(teardown_tcp_op&& other) = default; - teardown_tcp_op(teardown_tcp_op const& other) = default; - - template<class DeducedHandler> - teardown_tcp_op( - DeducedHandler&& h, - socket_type& s, - role_type role) - : h_(std::forward<DeducedHandler>(h)) - , s_(s) - , role_(role) - { - } - - 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<socket_type&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, s_.get_executor()); - } - - void - operator()( - error_code ec = {}, - std::size_t bytes_transferred = 0); - - friend - bool asio_handler_is_continuation(teardown_tcp_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, teardown_tcp_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke(f, std::addressof(op->h_)); - } -}; - -template<class Handler> -void -teardown_tcp_op<Handler>:: -operator()(error_code ec, std::size_t bytes_transferred) -{ - using boost::asio::buffer; - using tcp = boost::asio::ip::tcp; - BOOST_ASIO_CORO_REENTER(*this) - { - nb_ = s_.non_blocking(); - s_.non_blocking(true, ec); - if(! ec) - { - if(role_ == role_type::server) - s_.shutdown(tcp::socket::shutdown_send, ec); - } - if(ec) - { - BOOST_ASIO_CORO_YIELD - boost::asio::post( - s_.get_executor(), - bind_handler(std::move(*this), ec, 0)); - goto upcall; - } - for(;;) - { - { - char buf[2048]; - s_.read_some( - boost::asio::buffer(buf), ec); - } - if(ec == boost::asio::error::would_block) - { - BOOST_ASIO_CORO_YIELD - s_.async_wait( - boost::asio::ip::tcp::socket::wait_read, - std::move(*this)); - continue; - } - if(ec) - { - if(ec != boost::asio::error::eof) - goto upcall; - ec = {}; - break; - } - if(bytes_transferred == 0) - { - // happens sometimes - break; - } - } - if(role_ == role_type::client) - s_.shutdown(tcp::socket::shutdown_send, ec); - if(ec) - goto upcall; - s_.close(ec); - upcall: - { - error_code ignored; - s_.non_blocking(nb_, ignored); - } - h_(ec); - } -} - -} // detail - -//------------------------------------------------------------------------------ - -inline -void -teardown( - role_type role, - boost::asio::ip::tcp::socket& socket, - error_code& ec) -{ - using boost::asio::buffer; - if(role == role_type::server) - socket.shutdown( - boost::asio::ip::tcp::socket::shutdown_send, ec); - if(ec) - return; - for(;;) - { - char buf[2048]; - auto const bytes_transferred = - socket.read_some(buffer(buf), ec); - if(ec) - { - if(ec != boost::asio::error::eof) - return; - ec = {}; - break; - } - if(bytes_transferred == 0) - { - // happens sometimes - break; - } - } - if(role == role_type::client) - socket.shutdown( - boost::asio::ip::tcp::socket::shutdown_send, ec); - if(ec) - return; - socket.close(ec); -} - -template<class TeardownHandler> -inline -void -async_teardown( - role_type role, - boost::asio::ip::tcp::socket& socket, - TeardownHandler&& handler) -{ - static_assert(beast::is_completion_handler< - TeardownHandler, void(error_code)>::value, - "TeardownHandler requirements not met"); - detail::teardown_tcp_op<typename std::decay< - TeardownHandler>::type>{std::forward< - TeardownHandler>(handler), socket, - role}(); -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/impl/write.ipp b/contrib/restricted/boost/boost/beast/websocket/impl/write.ipp deleted file mode 100644 index d12f2f9e12..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/impl/write.ipp +++ /dev/null @@ -1,890 +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_WEBSOCKET_IMPL_WRITE_IPP -#define BOOST_BEAST_WEBSOCKET_IMPL_WRITE_IPP - -#include <boost/beast/core/bind_handler.hpp> -#include <boost/beast/core/buffers_cat.hpp> -#include <boost/beast/core/buffers_prefix.hpp> -#include <boost/beast/core/buffers_suffix.hpp> -#include <boost/beast/core/flat_static_buffer.hpp> -#include <boost/beast/core/type_traits.hpp> -#include <boost/beast/core/detail/clamp.hpp> -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/websocket/detail/frame.hpp> -#include <boost/asio/associated_allocator.hpp> -#include <boost/asio/associated_executor.hpp> -#include <boost/asio/coroutine.hpp> -#include <boost/asio/handler_continuation_hook.hpp> -#include <boost/asio/handler_invoke_hook.hpp> -#include <boost/assert.hpp> -#include <boost/config.hpp> -#include <boost/throw_exception.hpp> -#include <algorithm> -#include <memory> - -namespace boost { -namespace beast { -namespace websocket { - -namespace detail { - -// Compress a buffer sequence -// Returns: `true` if more calls are needed -// -template<> -template<class ConstBufferSequence> -bool -stream_base<true>:: -deflate( - boost::asio::mutable_buffer& out, - buffers_suffix<ConstBufferSequence>& cb, - bool fin, - std::size_t& total_in, - error_code& ec) -{ - using boost::asio::buffer; - BOOST_ASSERT(out.size() >= 6); - auto& zo = this->pmd_->zo; - zlib::z_params zs; - zs.avail_in = 0; - zs.next_in = nullptr; - zs.avail_out = out.size(); - zs.next_out = out.data(); - for(auto in : beast::detail::buffers_range(cb)) - { - zs.avail_in = in.size(); - if(zs.avail_in == 0) - continue; - zs.next_in = in.data(); - zo.write(zs, zlib::Flush::none, ec); - if(ec) - { - if(ec != zlib::error::need_buffers) - return false; - BOOST_ASSERT(zs.avail_out == 0); - BOOST_ASSERT(zs.total_out == out.size()); - ec.assign(0, ec.category()); - break; - } - if(zs.avail_out == 0) - { - BOOST_ASSERT(zs.total_out == out.size()); - break; - } - BOOST_ASSERT(zs.avail_in == 0); - } - total_in = zs.total_in; - cb.consume(zs.total_in); - if(zs.avail_out > 0 && fin) - { - auto const remain = boost::asio::buffer_size(cb); - if(remain == 0) - { - // Inspired by Mark Adler - // https://github.com/madler/zlib/issues/149 - // - // VFALCO We could do this flush twice depending - // on how much space is in the output. - zo.write(zs, zlib::Flush::block, ec); - BOOST_ASSERT(! ec || ec == zlib::error::need_buffers); - if(ec == zlib::error::need_buffers) - ec.assign(0, ec.category()); - if(ec) - return false; - if(zs.avail_out >= 6) - { - zo.write(zs, zlib::Flush::full, ec); - BOOST_ASSERT(! ec); - // remove flush marker - zs.total_out -= 4; - out = buffer(out.data(), zs.total_out); - return false; - } - } - } - ec.assign(0, ec.category()); - out = buffer(out.data(), zs.total_out); - return true; -} - -template<> -inline -void -stream_base<true>:: -do_context_takeover_write(role_type role) -{ - if((role == role_type::client && - this->pmd_config_.client_no_context_takeover) || - (role == role_type::server && - this->pmd_config_.server_no_context_takeover)) - { - this->pmd_->zo.reset(); - } -} - -} // detail - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template<class Buffers, class Handler> -class stream<NextLayer, deflateSupported>::write_some_op - : public boost::asio::coroutine -{ - Handler h_; - stream<NextLayer, deflateSupported>& ws_; - buffers_suffix<Buffers> cb_; - detail::frame_header fh_; - detail::prepared_key key_; - std::size_t bytes_transferred_ = 0; - std::size_t remain_; - std::size_t in_; - int how_; - bool fin_; - bool more_; - bool cont_ = false; - -public: - static constexpr int id = 2; // for soft_mutex - - write_some_op(write_some_op&&) = default; - write_some_op(write_some_op const&) = delete; - - template<class DeducedHandler> - write_some_op( - DeducedHandler&& h, - stream<NextLayer, deflateSupported>& ws, - bool fin, - Buffers const& bs) - : h_(std::forward<DeducedHandler>(h)) - , ws_(ws) - , cb_(bs) - , fin_(fin) - { - } - - 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<stream<NextLayer, deflateSupported>&>().get_executor())>; - - executor_type - get_executor() const noexcept - { - return (boost::asio::get_associated_executor)( - h_, ws_.get_executor()); - } - - Handler& - handler() - { - return h_; - } - - void operator()( - error_code ec = {}, - std::size_t bytes_transferred = 0, - bool cont = true); - - friend - bool asio_handler_is_continuation(write_some_op* op) - { - using boost::asio::asio_handler_is_continuation; - return op->cont_ || asio_handler_is_continuation( - std::addressof(op->h_)); - } - - template<class Function> - friend - void asio_handler_invoke(Function&& f, write_some_op* op) - { - using boost::asio::asio_handler_invoke; - asio_handler_invoke( - f, std::addressof(op->h_)); - } -}; - -template<class NextLayer, bool deflateSupported> -template<class Buffers, class Handler> -void -stream<NextLayer, deflateSupported>:: -write_some_op<Buffers, Handler>:: -operator()( - error_code ec, - std::size_t bytes_transferred, - bool cont) -{ - using beast::detail::clamp; - using boost::asio::buffer; - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - using boost::asio::mutable_buffer; - enum - { - do_nomask_nofrag, - do_nomask_frag, - do_mask_nofrag, - do_mask_frag, - do_deflate - }; - std::size_t n; - boost::asio::mutable_buffer b; - cont_ = cont; - BOOST_ASIO_CORO_REENTER(*this) - { - // Set up the outgoing frame header - if(! ws_.wr_cont_) - { - ws_.begin_msg(); - fh_.rsv1 = ws_.wr_compress_; - } - else - { - fh_.rsv1 = false; - } - fh_.rsv2 = false; - fh_.rsv3 = false; - fh_.op = ws_.wr_cont_ ? - detail::opcode::cont : ws_.wr_opcode_; - fh_.mask = - ws_.role_ == role_type::client; - - // Choose a write algorithm - if(ws_.wr_compress_) - { - how_ = do_deflate; - } - else if(! fh_.mask) - { - if(! ws_.wr_frag_) - { - how_ = do_nomask_nofrag; - } - else - { - BOOST_ASSERT(ws_.wr_buf_size_ != 0); - remain_ = buffer_size(cb_); - if(remain_ > ws_.wr_buf_size_) - how_ = do_nomask_frag; - else - how_ = do_nomask_nofrag; - } - } - else - { - if(! ws_.wr_frag_) - { - how_ = do_mask_nofrag; - } - else - { - BOOST_ASSERT(ws_.wr_buf_size_ != 0); - remain_ = buffer_size(cb_); - if(remain_ > ws_.wr_buf_size_) - how_ = do_mask_frag; - else - how_ = do_mask_nofrag; - } - } - - // Maybe suspend - if(ws_.wr_block_.try_lock(this)) - { - // Make sure the stream is open - if(! ws_.check_open(ec)) - goto upcall; - } - else - { - do_suspend: - // Suspend - BOOST_ASIO_CORO_YIELD - ws_.paused_wr_.emplace(std::move(*this)); - - // Acquire the write block - ws_.wr_block_.lock(this); - - // Resume - BOOST_ASIO_CORO_YIELD - boost::asio::post( - ws_.get_executor(), std::move(*this)); - BOOST_ASSERT(ws_.wr_block_.is_locked(this)); - - // Make sure the stream is open - if(! ws_.check_open(ec)) - goto upcall; - } - - //------------------------------------------------------------------ - - if(how_ == do_nomask_nofrag) - { - fh_.fin = fin_; - fh_.len = buffer_size(cb_); - ws_.wr_fb_.reset(); - detail::write<flat_static_buffer_base>( - ws_.wr_fb_, fh_); - ws_.wr_cont_ = ! fin_; - // Send frame - BOOST_ASIO_CORO_YIELD - boost::asio::async_write(ws_.stream_, - buffers_cat(ws_.wr_fb_.data(), cb_), - std::move(*this)); - if(! ws_.check_ok(ec)) - goto upcall; - bytes_transferred_ += clamp(fh_.len); - goto upcall; - } - - //------------------------------------------------------------------ - - else if(how_ == do_nomask_frag) - { - for(;;) - { - n = clamp(remain_, ws_.wr_buf_size_); - fh_.len = n; - remain_ -= n; - fh_.fin = fin_ ? remain_ == 0 : false; - ws_.wr_fb_.reset(); - detail::write<flat_static_buffer_base>( - ws_.wr_fb_, fh_); - ws_.wr_cont_ = ! fin_; - // Send frame - BOOST_ASIO_CORO_YIELD - boost::asio::async_write( - ws_.stream_, buffers_cat( - ws_.wr_fb_.data(), buffers_prefix( - clamp(fh_.len), cb_)), - std::move(*this)); - if(! ws_.check_ok(ec)) - goto upcall; - n = clamp(fh_.len); // because yield - bytes_transferred_ += n; - if(remain_ == 0) - break; - cb_.consume(n); - fh_.op = detail::opcode::cont; - // Allow outgoing control frames to - // be sent in between message frames - ws_.wr_block_.unlock(this); - if( ws_.paused_close_.maybe_invoke() || - ws_.paused_rd_.maybe_invoke() || - ws_.paused_ping_.maybe_invoke()) - { - BOOST_ASSERT(ws_.wr_block_.is_locked()); - goto do_suspend; - } - ws_.wr_block_.lock(this); - } - goto upcall; - } - - //------------------------------------------------------------------ - - else if(how_ == do_mask_nofrag) - { - remain_ = buffer_size(cb_); - fh_.fin = fin_; - fh_.len = remain_; - fh_.key = ws_.wr_gen_(); - detail::prepare_key(key_, fh_.key); - ws_.wr_fb_.reset(); - detail::write<flat_static_buffer_base>( - ws_.wr_fb_, fh_); - n = clamp(remain_, ws_.wr_buf_size_); - buffer_copy(buffer( - ws_.wr_buf_.get(), n), cb_); - detail::mask_inplace(buffer( - ws_.wr_buf_.get(), n), key_); - remain_ -= n; - ws_.wr_cont_ = ! fin_; - // Send frame header and partial payload - BOOST_ASIO_CORO_YIELD - boost::asio::async_write( - ws_.stream_, buffers_cat(ws_.wr_fb_.data(), - buffer(ws_.wr_buf_.get(), n)), - std::move(*this)); - if(! ws_.check_ok(ec)) - goto upcall; - bytes_transferred_ += - bytes_transferred - ws_.wr_fb_.size(); - while(remain_ > 0) - { - cb_.consume(ws_.wr_buf_size_); - n = clamp(remain_, ws_.wr_buf_size_); - buffer_copy(buffer( - ws_.wr_buf_.get(), n), cb_); - detail::mask_inplace(buffer( - ws_.wr_buf_.get(), n), key_); - remain_ -= n; - // Send partial payload - BOOST_ASIO_CORO_YIELD - boost::asio::async_write(ws_.stream_, - buffer(ws_.wr_buf_.get(), n), - std::move(*this)); - if(! ws_.check_ok(ec)) - goto upcall; - bytes_transferred_ += bytes_transferred; - } - goto upcall; - } - - //------------------------------------------------------------------ - - else if(how_ == do_mask_frag) - { - for(;;) - { - n = clamp(remain_, ws_.wr_buf_size_); - remain_ -= n; - fh_.len = n; - fh_.key = ws_.wr_gen_(); - fh_.fin = fin_ ? remain_ == 0 : false; - detail::prepare_key(key_, fh_.key); - buffer_copy(buffer( - ws_.wr_buf_.get(), n), cb_); - detail::mask_inplace(buffer( - ws_.wr_buf_.get(), n), key_); - ws_.wr_fb_.reset(); - detail::write<flat_static_buffer_base>( - ws_.wr_fb_, fh_); - ws_.wr_cont_ = ! fin_; - // Send frame - BOOST_ASIO_CORO_YIELD - boost::asio::async_write(ws_.stream_, - buffers_cat(ws_.wr_fb_.data(), - buffer(ws_.wr_buf_.get(), n)), - std::move(*this)); - if(! ws_.check_ok(ec)) - goto upcall; - n = bytes_transferred - ws_.wr_fb_.size(); - bytes_transferred_ += n; - if(remain_ == 0) - break; - cb_.consume(n); - fh_.op = detail::opcode::cont; - // Allow outgoing control frames to - // be sent in between message frames: - ws_.wr_block_.unlock(this); - if( ws_.paused_close_.maybe_invoke() || - ws_.paused_rd_.maybe_invoke() || - ws_.paused_ping_.maybe_invoke()) - { - BOOST_ASSERT(ws_.wr_block_.is_locked()); - goto do_suspend; - } - ws_.wr_block_.lock(this); - } - goto upcall; - } - - //------------------------------------------------------------------ - - else if(how_ == do_deflate) - { - for(;;) - { - b = buffer(ws_.wr_buf_.get(), - ws_.wr_buf_size_); - more_ = ws_.deflate(b, cb_, fin_, in_, ec); - if(! ws_.check_ok(ec)) - goto upcall; - n = buffer_size(b); - if(n == 0) - { - // The input was consumed, but there - // is no output due to compression - // latency. - BOOST_ASSERT(! fin_); - BOOST_ASSERT(buffer_size(cb_) == 0); - goto upcall; - } - if(fh_.mask) - { - fh_.key = ws_.wr_gen_(); - detail::prepared_key key; - detail::prepare_key(key, fh_.key); - detail::mask_inplace(b, key); - } - fh_.fin = ! more_; - fh_.len = n; - ws_.wr_fb_.reset(); - detail::write< - flat_static_buffer_base>(ws_.wr_fb_, fh_); - ws_.wr_cont_ = ! fin_; - // Send frame - BOOST_ASIO_CORO_YIELD - boost::asio::async_write(ws_.stream_, - buffers_cat(ws_.wr_fb_.data(), b), - std::move(*this)); - if(! ws_.check_ok(ec)) - goto upcall; - bytes_transferred_ += in_; - if(more_) - { - fh_.op = detail::opcode::cont; - fh_.rsv1 = false; - // Allow outgoing control frames to - // be sent in between message frames: - ws_.wr_block_.unlock(this); - if( ws_.paused_close_.maybe_invoke() || - ws_.paused_rd_.maybe_invoke() || - ws_.paused_ping_.maybe_invoke()) - { - BOOST_ASSERT(ws_.wr_block_.is_locked()); - goto do_suspend; - } - ws_.wr_block_.lock(this); - } - else - { - if(fh_.fin) - ws_.do_context_takeover_write(ws_.role_); - goto upcall; - } - } - } - - //-------------------------------------------------------------------------- - - upcall: - ws_.wr_block_.unlock(this); - ws_.paused_close_.maybe_invoke() || - ws_.paused_rd_.maybe_invoke() || - ws_.paused_ping_.maybe_invoke(); - if(! cont_) - return boost::asio::post( - ws_.stream_.get_executor(), - bind_handler(std::move(h_), ec, bytes_transferred_)); - h_(ec, bytes_transferred_); - } -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template<class ConstBufferSequence> -std::size_t -stream<NextLayer, deflateSupported>:: -write_some(bool fin, ConstBufferSequence const& buffers) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - error_code ec; - auto const bytes_transferred = - write_some(fin, buffers, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template<class NextLayer, bool deflateSupported> -template<class ConstBufferSequence> -std::size_t -stream<NextLayer, deflateSupported>:: -write_some(bool fin, - ConstBufferSequence const& buffers, error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - using beast::detail::clamp; - using boost::asio::buffer; - using boost::asio::buffer_copy; - using boost::asio::buffer_size; - std::size_t bytes_transferred = 0; - ec.assign(0, ec.category()); - // Make sure the stream is open - if(! check_open(ec)) - return bytes_transferred; - detail::frame_header fh; - if(! wr_cont_) - { - begin_msg(); - fh.rsv1 = wr_compress_; - } - else - { - fh.rsv1 = false; - } - fh.rsv2 = false; - fh.rsv3 = false; - fh.op = wr_cont_ ? - detail::opcode::cont : wr_opcode_; - fh.mask = role_ == role_type::client; - auto remain = buffer_size(buffers); - if(wr_compress_) - { - buffers_suffix< - ConstBufferSequence> cb{buffers}; - for(;;) - { - auto b = buffer( - wr_buf_.get(), wr_buf_size_); - auto const more = this->deflate( - b, cb, fin, bytes_transferred, ec); - if(! check_ok(ec)) - return bytes_transferred; - auto const n = buffer_size(b); - if(n == 0) - { - // The input was consumed, but there - // is no output due to compression - // latency. - BOOST_ASSERT(! fin); - BOOST_ASSERT(buffer_size(cb) == 0); - fh.fin = false; - break; - } - if(fh.mask) - { - fh.key = wr_gen_(); - detail::prepared_key key; - detail::prepare_key(key, fh.key); - detail::mask_inplace(b, key); - } - fh.fin = ! more; - fh.len = n; - detail::fh_buffer fh_buf; - detail::write< - flat_static_buffer_base>(fh_buf, fh); - wr_cont_ = ! fin; - boost::asio::write(stream_, - buffers_cat(fh_buf.data(), b), ec); - if(! check_ok(ec)) - return bytes_transferred; - if(! more) - break; - fh.op = detail::opcode::cont; - fh.rsv1 = false; - } - if(fh.fin) - this->do_context_takeover_write(role_); - } - else if(! fh.mask) - { - if(! wr_frag_) - { - // no mask, no autofrag - fh.fin = fin; - fh.len = remain; - detail::fh_buffer fh_buf; - detail::write< - flat_static_buffer_base>(fh_buf, fh); - wr_cont_ = ! fin; - boost::asio::write(stream_, - buffers_cat(fh_buf.data(), buffers), ec); - if(! check_ok(ec)) - return bytes_transferred; - bytes_transferred += remain; - } - else - { - // no mask, autofrag - BOOST_ASSERT(wr_buf_size_ != 0); - buffers_suffix< - ConstBufferSequence> cb{buffers}; - for(;;) - { - auto const n = clamp(remain, wr_buf_size_); - remain -= n; - fh.len = n; - fh.fin = fin ? remain == 0 : false; - detail::fh_buffer fh_buf; - detail::write< - flat_static_buffer_base>(fh_buf, fh); - wr_cont_ = ! fin; - boost::asio::write(stream_, - buffers_cat(fh_buf.data(), - buffers_prefix(n, cb)), ec); - if(! check_ok(ec)) - return bytes_transferred; - bytes_transferred += n; - if(remain == 0) - break; - fh.op = detail::opcode::cont; - cb.consume(n); - } - } - } - else if(! wr_frag_) - { - // mask, no autofrag - fh.fin = fin; - fh.len = remain; - fh.key = wr_gen_(); - detail::prepared_key key; - detail::prepare_key(key, fh.key); - detail::fh_buffer fh_buf; - detail::write< - flat_static_buffer_base>(fh_buf, fh); - buffers_suffix< - ConstBufferSequence> cb{buffers}; - { - auto const n = clamp(remain, wr_buf_size_); - auto const b = buffer(wr_buf_.get(), n); - buffer_copy(b, cb); - cb.consume(n); - remain -= n; - detail::mask_inplace(b, key); - wr_cont_ = ! fin; - boost::asio::write(stream_, - buffers_cat(fh_buf.data(), b), ec); - if(! check_ok(ec)) - return bytes_transferred; - bytes_transferred += n; - } - while(remain > 0) - { - auto const n = clamp(remain, wr_buf_size_); - auto const b = buffer(wr_buf_.get(), n); - buffer_copy(b, cb); - cb.consume(n); - remain -= n; - detail::mask_inplace(b, key); - boost::asio::write(stream_, b, ec); - if(! check_ok(ec)) - return bytes_transferred; - bytes_transferred += n; - } - } - else - { - // mask, autofrag - BOOST_ASSERT(wr_buf_size_ != 0); - buffers_suffix< - ConstBufferSequence> cb{buffers}; - for(;;) - { - fh.key = wr_gen_(); - detail::prepared_key key; - detail::prepare_key(key, fh.key); - auto const n = clamp(remain, wr_buf_size_); - auto const b = buffer(wr_buf_.get(), n); - buffer_copy(b, cb); - detail::mask_inplace(b, key); - fh.len = n; - remain -= n; - fh.fin = fin ? remain == 0 : false; - wr_cont_ = ! fh.fin; - detail::fh_buffer fh_buf; - detail::write< - flat_static_buffer_base>(fh_buf, fh); - boost::asio::write(stream_, - buffers_cat(fh_buf.data(), b), ec); - if(! check_ok(ec)) - return bytes_transferred; - bytes_transferred += n; - if(remain == 0) - break; - fh.op = detail::opcode::cont; - cb.consume(n); - } - } - return bytes_transferred; -} - -template<class NextLayer, bool deflateSupported> -template<class ConstBufferSequence, class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -stream<NextLayer, deflateSupported>:: -async_write_some(bool fin, - ConstBufferSequence const& bs, WriteHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream 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_some_op<ConstBufferSequence, BOOST_ASIO_HANDLER_TYPE( - WriteHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), *this, fin, bs}( - {}, 0, false); - return init.result.get(); -} - -//------------------------------------------------------------------------------ - -template<class NextLayer, bool deflateSupported> -template<class ConstBufferSequence> -std::size_t -stream<NextLayer, deflateSupported>:: -write(ConstBufferSequence const& buffers) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - error_code ec; - auto const bytes_transferred = write(buffers, ec); - if(ec) - BOOST_THROW_EXCEPTION(system_error{ec}); - return bytes_transferred; -} - -template<class NextLayer, bool deflateSupported> -template<class ConstBufferSequence> -std::size_t -stream<NextLayer, deflateSupported>:: -write(ConstBufferSequence const& buffers, error_code& ec) -{ - static_assert(is_sync_stream<next_layer_type>::value, - "SyncStream requirements not met"); - static_assert(boost::asio::is_const_buffer_sequence< - ConstBufferSequence>::value, - "ConstBufferSequence requirements not met"); - return write_some(true, buffers, ec); -} - -template<class NextLayer, bool deflateSupported> -template<class ConstBufferSequence, class WriteHandler> -BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) -stream<NextLayer, deflateSupported>:: -async_write( - ConstBufferSequence const& bs, WriteHandler&& handler) -{ - static_assert(is_async_stream<next_layer_type>::value, - "AsyncStream 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_some_op<ConstBufferSequence, BOOST_ASIO_HANDLER_TYPE( - WriteHandler, void(error_code, std::size_t))>{ - std::move(init.completion_handler), *this, true, bs}( - {}, 0, false); - return init.result.get(); -} - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/option.hpp b/contrib/restricted/boost/boost/beast/websocket/option.hpp deleted file mode 100644 index 83788994d1..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/option.hpp +++ /dev/null @@ -1,73 +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_WEBSOCKET_OPTION_HPP -#define BOOST_BEAST_WEBSOCKET_OPTION_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/websocket/rfc6455.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/throw_exception.hpp> -#include <algorithm> -#include <cstdint> -#include <functional> -#include <stdexcept> -#include <type_traits> -#include <utility> - -namespace boost { -namespace beast { -namespace websocket { - -/** permessage-deflate extension options. - - These settings control the permessage-deflate extension, - which allows messages to be compressed. - - @note Objects of this type are used with - @ref beast::websocket::stream::set_option. -*/ -struct permessage_deflate -{ - /// `true` to offer the extension in the server role - bool server_enable = false; - - /// `true` to offer the extension in the client role - bool client_enable = false; - - /** Maximum server window bits to offer - - @note Due to a bug in ZLib, this value must be greater than 8. - */ - int server_max_window_bits = 15; - - /** Maximum client window bits to offer - - @note Due to a bug in ZLib, this value must be greater than 8. - */ - int client_max_window_bits = 15; - - /// `true` if server_no_context_takeover desired - bool server_no_context_takeover = false; - - /// `true` if client_no_context_takeover desired - bool client_no_context_takeover = false; - - /// Deflate compression level 0..9 - int compLevel = 8; - - /// Deflate memory level, 1..9 - int memLevel = 4; -}; - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/rfc6455.hpp b/contrib/restricted/boost/boost/beast/websocket/rfc6455.hpp deleted file mode 100644 index 921f896351..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/rfc6455.hpp +++ /dev/null @@ -1,215 +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_WEBSOCKET_RFC6455_HPP -#define BOOST_BEAST_WEBSOCKET_RFC6455_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/static_string.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/http/message.hpp> -#include <array> -#include <cstdint> - -namespace boost { -namespace beast { -namespace websocket { - -/** Returns `true` if the specified HTTP request is a WebSocket Upgrade. - - This function returns `true` when the passed HTTP Request - indicates a WebSocket Upgrade. It does not validate the - contents of the fields: it just trivially accepts requests - which could only possibly be a valid or invalid WebSocket - Upgrade message. - - Callers who wish to manually read HTTP requests in their - server implementation can use this function to determine if - the request should be routed to an instance of - @ref websocket::stream. - - @par Example - @code - void handle_connection(boost::asio::ip::tcp::socket& sock) - { - boost::beast::flat_buffer buffer; - boost::beast::http::request<boost::beast::http::string_body> req; - boost::beast::http::read(sock, buffer, req); - if(boost::beast::websocket::is_upgrade(req)) - { - boost::beast::websocket::stream<decltype(sock)> ws{std::move(sock)}; - ws.accept(req); - } - } - @endcode - - @param req The HTTP Request object to check. - - @return `true` if the request is a WebSocket Upgrade. -*/ -template<class Allocator> -bool -is_upgrade(beast::http::header<true, - http::basic_fields<Allocator>> const& req); - -/** Close status codes. - - These codes accompany close frames. - - @see <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1">RFC 6455 7.4.1 Defined Status Codes</a> -*/ -enum close_code : std::uint16_t -{ - /// Normal closure; the connection successfully completed whatever purpose for which it was created. - normal = 1000, - - /// The endpoint is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection. - going_away = 1001, - - /// The endpoint is terminating the connection due to a protocol error. - protocol_error = 1002, - - /// The connection is being terminated because the endpoint received data of a type it cannot accept (for example, a text-only endpoint received binary data). - unknown_data = 1003, - - /// The endpoint is terminating the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message). - bad_payload = 1007, - - /// The endpoint is terminating the connection because it received a message that violates its policy. This is a generic status code, used when codes 1003 and 1009 are not suitable. - policy_error = 1008, - - /// The endpoint is terminating the connection because a data frame was received that is too large. - too_big = 1009, - - /// The client is terminating the connection because it expected the server to negotiate one or more extension, but the server didn't. - needs_extension = 1010, - - /// The server is terminating the connection because it encountered an unexpected condition that prevented it from fulfilling the request. - internal_error = 1011, - - /// The server is terminating the connection because it is restarting. - service_restart = 1012, - - /// The server is terminating the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients. - try_again_later = 1013, - - //---- - // - // The following are illegal on the wire - // - - /** Used internally to mean "no error" - - This code is reserved and may not be sent. - */ - none = 0, - - /** Reserved for future use by the WebSocket standard. - - This code is reserved and may not be sent. - */ - reserved1 = 1004, - - /** No status code was provided even though one was expected. - - This code is reserved and may not be sent. - */ - no_status = 1005, - - /** Connection was closed without receiving a close frame - - This code is reserved and may not be sent. - */ - abnormal = 1006, - - /** Reserved for future use by the WebSocket standard. - - This code is reserved and may not be sent. - */ - reserved2 = 1014, - - /** Reserved for future use by the WebSocket standard. - - This code is reserved and may not be sent. - */ - reserved3 = 1015 - - // - //---- - - //last = 5000 // satisfy warnings -}; - -/// The type representing the reason string in a close frame. -using reason_string = static_string<123, char>; - -/// The type representing the payload of ping and pong messages. -using ping_data = static_string<125, char>; - -/** Description of the close reason. - - This object stores the close code (if any) and the optional - utf-8 encoded implementation defined reason string. -*/ -struct close_reason -{ - /// The close code. - std::uint16_t code = close_code::none; - - /// The optional utf8-encoded reason string. - reason_string reason; - - /** Default constructor. - - The code will be none. Default constructed objects - will explicitly convert to bool as `false`. - */ - close_reason() = default; - - /// Construct from a code. - close_reason(std::uint16_t code_) - : code(code_) - { - } - - /// Construct from a reason string. code is @ref close_code::normal. - close_reason(string_view s) - : code(close_code::normal) - , reason(s) - { - } - - /// Construct from a reason string literal. code is @ref close_code::normal. - close_reason(char const* s) - : code(close_code::normal) - , reason(s) - { - } - - /// Construct from a close code and reason string. - close_reason(close_code code_, string_view s) - : code(code_) - , reason(s) - { - } - - /// Returns `true` if a code was specified - operator bool() const - { - return code != close_code::none; - } -}; - -} // websocket -} // beast -} // boost - -#include <boost/beast/websocket/impl/rfc6455.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/role.hpp b/contrib/restricted/boost/boost/beast/websocket/role.hpp deleted file mode 100644 index d886936585..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/role.hpp +++ /dev/null @@ -1,59 +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_WEBSOCKET_ROLE_HPP -#define BOOST_BEAST_WEBSOCKET_ROLE_HPP - -#include <boost/beast/core/detail/config.hpp> - -namespace boost { -namespace beast { -namespace websocket { - -/** The role of the websocket stream endpoint. - - Whether the endpoint is a client or server affects the - behavior of the <em>Close the WebSocket Connection</em> - operation described in rfc6455 section 7.1.1. - The shutdown behavior depends on the type of the next - layer template parameter used to construct the @ref stream. - Other next layer types including user-defined types - may implement different role-based behavior when - performing the close operation. - - The default implementation for @ref stream when the next - layer type is a `boost::asio::ip::tcp::socket` behaves - as follows: - - @li In the client role, a TCP/IP shutdown is sent after - reading all remaining data on the connection. - - @li In the server role, a TCP/IP shutdown is sent before - reading all remaining data on the connection. - - When the next layer type is a `boost::asio::ssl::stream`, - the connection is closed by performing the SSL closing - handshake corresponding to the role type, client or server. - - @see https://tools.ietf.org/html/rfc6455#section-7.1.1 -*/ -enum class role_type -{ - /// The stream is operating as a client. - client, - - /// The stream is operating as a server. - server -}; - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/ssl.hpp b/contrib/restricted/boost/boost/beast/websocket/ssl.hpp deleted file mode 100644 index d51921a481..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/ssl.hpp +++ /dev/null @@ -1,84 +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_WEBSOCKET_SSL_HPP -#define BOOST_BEAST_WEBSOCKET_SSL_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/websocket/teardown.hpp> -#include <boost/asio/ip/tcp.hpp> -#include <boost/asio/ssl/stream.hpp> - -namespace boost { -namespace beast { -namespace websocket { - -/** Tear down a `boost::asio::ssl::stream`. - - This tears down a connection. The implementation will call - the overload of this function based on the `Stream` parameter - used to consruct the socket. When `Stream` is a user defined - type, and not a `boost::asio::ip::tcp::socket` or any - `boost::asio::ssl::stream`, callers are responsible for - providing a suitable overload of this function. - - @param role The role of the local endpoint - - @param stream The stream to tear down. - - @param ec Set to the error if any occurred. -*/ -template<class SyncStream> -void -teardown( - role_type role, - boost::asio::ssl::stream<SyncStream>& stream, - error_code& ec); - -/** Start tearing down a `boost::asio::ssl::stream`. - - This begins tearing down a connection asynchronously. - The implementation will call the overload of this function - based on the `Stream` parameter used to consruct the socket. - When `Stream` is a user defined type, and not a - `boost::asio::ip::tcp::socket` or any `boost::asio::ssl::stream`, - callers are responsible for providing a suitable overload - of this function. - - @param role The role of the local endpoint - - @param stream The stream to tear down. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error // result of operation - ); @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 AsyncStream, class TeardownHandler> -inline -void -async_teardown( - role_type role, - boost::asio::ssl::stream<AsyncStream>& stream, - TeardownHandler&& handler); - -} // websocket -} // beast -} // boost - -#include <boost/beast/websocket/impl/ssl.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/stream.hpp b/contrib/restricted/boost/boost/beast/websocket/stream.hpp deleted file mode 100644 index 90cb753294..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/stream.hpp +++ /dev/null @@ -1,3578 +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_WEBSOCKET_STREAM_HPP -#define BOOST_BEAST_WEBSOCKET_STREAM_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/websocket/error.hpp> -#include <boost/beast/websocket/option.hpp> -#include <boost/beast/websocket/role.hpp> -#include <boost/beast/websocket/rfc6455.hpp> -#include <boost/beast/websocket/stream_fwd.hpp> -#include <boost/beast/websocket/detail/frame.hpp> -#include <boost/beast/websocket/detail/hybi13.hpp> -#include <boost/beast/websocket/detail/mask.hpp> -#include <boost/beast/websocket/detail/pausation.hpp> -#include <boost/beast/websocket/detail/pmd_extension.hpp> -#include <boost/beast/websocket/detail/stream_base.hpp> -#include <boost/beast/websocket/detail/utf8_checker.hpp> -#include <boost/beast/core/static_buffer.hpp> -#include <boost/beast/core/string.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/beast/http/empty_body.hpp> -#include <boost/beast/http/message.hpp> -#include <boost/beast/http/string_body.hpp> -#include <boost/beast/http/detail/type_traits.hpp> -#include <boost/asio/async_result.hpp> -#include <boost/asio/error.hpp> -#include <algorithm> -#include <cstdint> -#include <functional> -#include <limits> -#include <type_traits> - -namespace boost { -namespace beast { -namespace websocket { - -/// The type of object holding HTTP Upgrade requests -using request_type = http::request<http::empty_body>; - -/// The type of object holding HTTP Upgrade responses -using response_type = http::response<http::string_body>; - -/** The type of received control frame. - - Values of this type are passed to the control frame - callback set using @ref stream::control_callback. -*/ -enum class frame_type -{ - /// A close frame was received - close, - - /// A ping frame was received - ping, - - /// A pong frame was received - pong -}; - -namespace detail { -class frame_test; -} // detail - -//-------------------------------------------------------------------- - -/** Provides message-oriented functionality using WebSocket. - - The @ref stream class template provides asynchronous and blocking - message-oriented functionality necessary for clients and servers - to utilize the WebSocket protocol. - - For asynchronous operations, the application must ensure - that they are are all performed within the same implicit - or explicit strand. - - @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 the @ref stream template with an `ip::tcp::socket`, - you would write: - - @code - websocket::stream<ip::tcp::socket> ws{io_context}; - @endcode - Alternatively, you can write: - @code - ip::tcp::socket sock{io_context}; - websocket::stream<ip::tcp::socket&> ws{sock}; - @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. - - @tparam deflateSupported A `bool` indicating whether or not the - stream will be capable of negotiating the permessage-deflate websocket - extension. Note that even if this is set to `true`, the permessage - deflate options (set by the caller at runtime) must still have the - feature enabled for a successful negotiation to occur. - - @note A stream object must not be moved or destroyed while there - are pending asynchronous operations associated with it. - - @par Concepts - @b AsyncStream, - @b DynamicBuffer, - @b SyncStream -*/ -template< - class NextLayer, - bool deflateSupported> -class stream -#ifndef BOOST_BEAST_DOXYGEN - : private detail::stream_base<deflateSupported> -#endif -{ - friend class close_test; - friend class frame_test; - friend class ping_test; - friend class read1_test; - friend class read2_test; - friend class stream_test; - friend class write_test; - - /* The read buffer has to be at least as large - as the largest possible control frame including - the frame header. - */ - static std::size_t constexpr max_control_frame_size = 2 + 8 + 4 + 125; - static std::size_t constexpr tcp_frame_size = 1536; - - using control_cb_type = - std::function<void(frame_type, string_view)>; - - enum class status - { - open, - closing, - closed, - failed - }; - - NextLayer stream_; // the wrapped stream - close_reason cr_; // set from received close frame - control_cb_type ctrl_cb_; // control callback - - std::size_t rd_msg_max_ // max message size - = 16 * 1024 * 1024; - std::uint64_t rd_size_ // total size of current message so far - = 0; - std::uint64_t rd_remain_ // message frame bytes left in current frame - = 0; - detail::frame_header rd_fh_; // current frame header - detail::prepared_key rd_key_; // current stateful mask key - detail::frame_buffer rd_fb_; // to write control frames (during reads) - detail::utf8_checker rd_utf8_; // to validate utf8 - static_buffer< - +tcp_frame_size> rd_buf_; // buffer for reads - detail::opcode rd_op_ // current message binary or text - = detail::opcode::text; - bool rd_cont_ // `true` if the next frame is a continuation - = false; - bool rd_done_ // set when a message is done - = true; - bool rd_close_ // did we read a close frame? - = false; - detail::soft_mutex rd_block_; // op currently reading - - role_type role_ // server or client - = role_type::client; - status status_ - = status::closed; - - detail::soft_mutex wr_block_; // op currently writing - bool wr_close_ // did we write a close frame? - = false; - bool wr_cont_ // next write is a continuation - = false; - bool wr_frag_ // autofrag the current message - = false; - bool wr_frag_opt_ // autofrag option setting - = true; - bool wr_compress_ // compress current message - = false; - detail::opcode wr_opcode_ // message type - = detail::opcode::text; - std::unique_ptr< - std::uint8_t[]> wr_buf_; // write buffer - std::size_t wr_buf_size_ // write buffer size (current message) - = 0; - std::size_t wr_buf_opt_ // write buffer size option setting - = 4096; - detail::fh_buffer wr_fb_; // header buffer used for writes - detail::maskgen wr_gen_; // source of mask keys - - detail::pausation paused_rd_; // paused read op - detail::pausation paused_wr_; // paused write op - detail::pausation paused_ping_; // paused ping op - detail::pausation paused_close_; // paused close op - detail::pausation paused_r_rd_; // paused read op (async read) - detail::pausation paused_r_close_;// paused close op (async read) - -public: - /// Indicates if the permessage-deflate extension is supported - using is_deflate_supported = - std::integral_constant<bool, deflateSupported>; - - /// 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 = get_lowest_layer<next_layer_type>; - - /// The type of the executor associated with the object. - using executor_type = typename next_layer_type::executor_type; - - /** Destructor - - Destroys the stream and all associated resources. - - @note A stream object must not be destroyed while there - are pending asynchronous operations associated with it. - */ - ~stream() = default; - - /** Constructor - - If `NextLayer` is move constructible, this function - will move-construct a new stream from the existing stream. - - @note The behavior of move assignment on or from streams - with active or pending operations is undefined. - */ - stream(stream&&) = default; - - /** Assignment - - If `NextLayer` is move assignable, this function - will move-assign a new stream from the existing stream. - - @note The behavior of move assignment on or from streams - with active or pending operations is undefined. - */ - stream& operator=(stream&&) = default; - - /** Constructor - - This constructor creates a websocket stream and initializes - the next layer object. - - @throws Any exceptions thrown by the NextLayer constructor. - - @param args The arguments to be passed to initialize the - next layer object. The arguments are forwarded to the next - layer's constructor. - */ - template<class... Args> - explicit - 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(); - } - - //-------------------------------------------------------------------------- - // - // Observers - // - //-------------------------------------------------------------------------- - - /** Returns `true` if the stream is open. - - The stream is open after a successful handshake, and when - no error has occurred. - */ - bool - is_open() const - { - return status_ == status::open; - } - - /** Returns `true` if the latest message data indicates binary. - - This function informs the caller of whether the last - received message frame represents a message with the - binary opcode. - - If there is no last message frame, the return value is - undefined. - */ - bool - got_binary() const - { - return rd_op_ == detail::opcode::binary; - } - - /** Returns `true` if the latest message data indicates text. - - This function informs the caller of whether the last - received message frame represents a message with the - text opcode. - - If there is no last message frame, the return value is - undefined. - */ - bool - got_text() const - { - return ! got_binary(); - } - - /// Returns `true` if the last completed read finished the current message. - bool - is_message_done() const - { - return rd_done_; - } - - /** Returns the close reason received from the peer. - - This is only valid after a read completes with error::closed. - */ - close_reason const& - reason() const - { - return cr_; - } - - /** Returns a suggested maximum buffer size for the next call to read. - - This function returns a reasonable upper limit on the number - of bytes for the size of the buffer passed in the next call - to read. The number is determined by the state of the current - frame and whether or not the permessage-deflate extension is - enabled. - - @param initial_size A non-zero size representing the caller's - desired buffer size for when there is no information which may - be used to calculate a more specific value. For example, when - reading the first frame header of a message. - */ - std::size_t - read_size_hint( - std::size_t initial_size = +tcp_frame_size) const - { - return read_size_hint(initial_size, - is_deflate_supported{}); - } - - /** Returns a suggested maximum buffer size for the next call to read. - - This function returns a reasonable upper limit on the number - of bytes for the size of the buffer passed in the next call - to read. The number is determined by the state of the current - frame and whether or not the permessage-deflate extension is - enabled. - - @param buffer The buffer which will be used for reading. The - implementation will query the buffer to obtain the optimum - size of a subsequent call to `buffer.prepare` based on the - state of the current frame, if any. - */ - template<class DynamicBuffer -#if ! BOOST_BEAST_DOXYGEN - , class = typename std::enable_if< - ! std::is_integral<DynamicBuffer>::value>::type -#endif - > - std::size_t - read_size_hint( - DynamicBuffer& buffer) const; - - //-------------------------------------------------------------------------- - // - // Settings - // - //-------------------------------------------------------------------------- - - /** Set the permessage-deflate extension options - - @throws invalid_argument if `deflateSupported == false`, and either - `client_enable` or `server_enable` is `true`. - */ - void - set_option(permessage_deflate const& o) - { - set_option(o, is_deflate_supported{}); - } - - /// Get the permessage-deflate extension options - void - get_option(permessage_deflate& o) - { - get_option(o, is_deflate_supported{}); - } - - /** Set the automatic fragmentation option. - - Determines if outgoing message payloads are broken up into - multiple pieces. - - When the automatic fragmentation size is turned on, outgoing - message payloads are broken up into multiple frames no larger - than the write buffer size. - - The default setting is to fragment messages. - - @param value A `bool` indicating if auto fragmentation should be on. - - @par Example - Setting the automatic fragmentation option: - @code - ws.auto_fragment(true); - @endcode - */ - void - auto_fragment(bool value) - { - wr_frag_opt_ = value; - } - - /// Returns `true` if the automatic fragmentation option is set. - bool - auto_fragment() const - { - return wr_frag_opt_; - } - - /** Set the binary message option. - - This controls whether or not outgoing message opcodes - are set to binary or text. The setting is only applied - at the start when a caller begins a new message. Changing - the opcode after a message is started will only take effect - after the current message being sent is complete. - - The default setting is to send text messages. - - @param value `true` if outgoing messages should indicate - binary, or `false` if they should indicate text. - - @par Example - Setting the message type to binary. - @code - ws.binary(true); - @endcode - */ - void - binary(bool value) - { - wr_opcode_ = value ? - detail::opcode::binary : - detail::opcode::text; - } - - /// Returns `true` if the binary message option is set. - bool - binary() const - { - return wr_opcode_ == detail::opcode::binary; - } - - /** Set a callback to be invoked on each incoming control frame. - - Sets the callback to be invoked whenever a ping, pong, - or close control frame is received during a call to one - of the following functions: - - @li @ref beast::websocket::stream::read - @li @ref beast::websocket::stream::read_some - @li @ref beast::websocket::stream::async_read - @li @ref beast::websocket::stream::async_read_some - - Unlike completion handlers, the callback will be invoked - for each control frame during a call to any synchronous - or asynchronous read function. The operation is passive, - with no associated error code, and triggered by reads. - - For close frames, the close reason code may be obtained by - calling the function @ref reason. - - @param cb The function object to call, which must be - invocable with this equivalent signature: - @code - void - callback( - frame_type kind, // The type of frame - string_view payload // The payload in the frame - ); - @endcode - The implementation type-erases the callback which may require - a dynamic allocation. To prevent the possiblity of a dynamic - allocation, use `std::ref` to wrap the callback. - If the read operation which receives the control frame is - an asynchronous operation, the callback will be invoked using - the same method as that used to invoke the final handler. - - @note Incoming ping and close frames are automatically - handled. Pings are responded to with pongs, and a close frame - is responded to with a close frame leading to the closure of - the stream. It is not necessary to manually send pings, pongs, - or close frames from inside the control callback. - Attempting to manually send a close frame from inside the - control callback after receiving a close frame will result - in undefined behavior. - */ - void - control_callback(std::function<void(frame_type, string_view)> cb) - { - ctrl_cb_ = std::move(cb); - } - - /** Reset the control frame callback. - - This function removes any previously set control frame callback. - */ - void - control_callback() - { - ctrl_cb_ = {}; - } - - /** Set the maximum incoming message size option. - - Sets the largest permissible incoming message size. Message - frame fields indicating a size that would bring the total - message size over this limit will cause a protocol failure. - - The default setting is 16 megabytes. A value of zero indicates - a limit of the maximum value of a `std::uint64_t`. - - @par Example - Setting the maximum read message size. - @code - ws.read_message_max(65536); - @endcode - - @param amount The limit on the size of incoming messages. - */ - void - read_message_max(std::size_t amount) - { - rd_msg_max_ = amount; - } - - /// Returns the maximum incoming message size setting. - std::size_t - read_message_max() const - { - return rd_msg_max_; - } - - /** Set the write buffer size option. - - Sets the size of the write buffer used by the implementation to - send frames. The write buffer is needed when masking payload data - in the client role, compressing frames, or auto-fragmenting message - data. - - Lowering the size of the buffer can decrease the memory requirements - for each connection, while increasing the size of the buffer can reduce - the number of calls made to the next layer to write data. - - The default setting is 4096. The minimum value is 8. - - The write buffer size can only be changed when the stream is not - open. Undefined behavior results if the option is modified after a - successful WebSocket handshake. - - @par Example - Setting the write buffer size. - @code - ws.write_buffer_size(8192); - @endcode - - @param amount The size of the write buffer in bytes. - */ - void - write_buffer_size(std::size_t amount) - { - if(amount < 8) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "write buffer size underflow"}); - wr_buf_opt_ = amount; - }; - - /// Returns the size of the write buffer. - std::size_t - write_buffer_size() const - { - return wr_buf_opt_; - } - - /** Set the text message option. - - This controls whether or not outgoing message opcodes - are set to binary or text. The setting is only applied - at the start when a caller begins a new message. Changing - the opcode after a message is started will only take effect - after the current message being sent is complete. - - The default setting is to send text messages. - - @param value `true` if outgoing messages should indicate - text, or `false` if they should indicate binary. - - @par Example - Setting the message type to text. - @code - ws.text(true); - @endcode - */ - void - text(bool value) - { - wr_opcode_ = value ? - detail::opcode::text : - detail::opcode::binary; - } - - /// Returns `true` if the text message option is set. - bool - text() const - { - return wr_opcode_ == detail::opcode::text; - } - - //-------------------------------------------------------------------------- - // - // Handshaking (Client) - // - //-------------------------------------------------------------------------- - - /** Send an HTTP WebSocket Upgrade request and receive the response. - - This function is used to synchronously send the WebSocket - upgrade HTTP request. The call blocks until one of the - following conditions is true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This function is implemented in terms of one or more calls to the - next layer's `read_some` and `write_some` functions. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param host The name of the remote host, - required by the HTTP protocol. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. - - @throws system_error Thrown on failure. - - @par Example - @code - websocket::stream<ip::tcp::socket> ws{io_context}; - ... - try - { - ws.handshake("localhost", "/"); - } - catch(...) - { - // An error occurred. - } - @endcode - */ - void - handshake( - string_view host, - string_view target); - - /** Send an HTTP WebSocket Upgrade request and receive the response. - - This function is used to synchronously send the WebSocket - upgrade HTTP request. The call blocks until one of the - following conditions is true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This function is implemented in terms of one or more calls to the - next layer's `read_some` and `write_some` functions. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param res The HTTP Upgrade response returned by the remote - endpoint. - - @param host The name of the remote host, - required by the HTTP protocol. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. - - @throws system_error Thrown on failure. - - @par Example - @code - websocket::stream<ip::tcp::socket> ws{io_context}; - ... - try - { - response_type res; - ws.handshake(res, "localhost", "/"); - } - catch(...) - { - // An error occurred. - } - @endcode - */ - void - handshake( - response_type& res, - string_view host, - string_view target); - - /** Send an HTTP WebSocket Upgrade request and receive the response. - - This function is used to synchronously send the WebSocket - upgrade HTTP request. The call blocks until one of the - following conditions is true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This function is implemented in terms of one or more calls to the - next layer's `read_some` and `write_some` functions. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param host The name of the remote host, - required by the HTTP protocol. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. - - @param decorator A function object which will be called to modify - the HTTP request object generated by the implementation. This - could be used to set the User-Agent field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - request_type& req - ); @endcode - - @throws system_error Thrown on failure. - - @par Example - @code - websocket::stream<ip::tcp::socket> ws{io_context}; - ... - try - { - ws.handshake("localhost", "/", - [](request_type& req) - { - req.set(field::user_agent, "Beast"); - }); - } - catch(...) - { - // An error occurred. - } - @endcode - */ - template<class RequestDecorator> - void - handshake_ex( - string_view host, - string_view target, - RequestDecorator const& decorator); - - /** Send an HTTP WebSocket Upgrade request and receive the response. - - This function is used to synchronously send the WebSocket - upgrade HTTP request. The call blocks until one of the - following conditions is true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This function is implemented in terms of one or more calls to the - next layer's `read_some` and `write_some` functions. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param res The HTTP Upgrade response returned by the remote - endpoint. - - @param host The name of the remote host, - required by the HTTP protocol. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. - - @param decorator A function object which will be called to modify - the HTTP request object generated by the implementation. This - could be used to set the User-Agent field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - request_type& req - ); @endcode - - @throws system_error Thrown on failure. - - @par Example - @code - websocket::stream<ip::tcp::socket> ws{io_context}; - ... - try - { - response_type res; - ws.handshake(res, "localhost", "/", - [](request_type& req) - { - req.set(field::user_agent, "Beast"); - }); - } - catch(...) - { - // An error occurred. - } - @endcode - */ - template<class RequestDecorator> - void - handshake_ex( - response_type& res, - string_view host, - string_view target, - RequestDecorator const& decorator); - - /** Send an HTTP WebSocket Upgrade request and receive the response. - - This function is used to synchronously send the WebSocket - upgrade HTTP request. The call blocks until one of the - following conditions is true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This function is implemented in terms of one or more calls to the - next layer's `read_some` and `write_some` functions. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param host The name of the remote host, - required by the HTTP protocol. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. - - @param ec Set to indicate what error occurred, if any. - - @par Example - @code - websocket::stream<ip::tcp::socket> ws{io_context}; - ... - error_code ec; - ws.handshake(host, target, ec); - if(ec) - { - // An error occurred. - } - @endcode - */ - void - handshake( - string_view host, - string_view target, - error_code& ec); - - /** Send an HTTP WebSocket Upgrade request and receive the response. - - This function is used to synchronously send the WebSocket - upgrade HTTP request. The call blocks until one of the - following conditions is true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This function is implemented in terms of one or more calls to the - next layer's `read_some` and `write_some` functions. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param res The HTTP Upgrade response returned by the remote - endpoint. If `ec` is set, the returned value is undefined. - - @param host The name of the remote host, - required by the HTTP protocol. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. - - @param ec Set to indicate what error occurred, if any. - - @par Example - @code - websocket::stream<ip::tcp::socket> ws{io_context}; - ... - error_code ec; - response_type res; - ws.handshake(res, host, target, ec); - if(ec) - { - // An error occurred. - } - @endcode - */ - void - handshake( - response_type& res, - string_view host, - string_view target, - error_code& ec); - - /** Send an HTTP WebSocket Upgrade request and receive the response. - - This function is used to synchronously send the WebSocket - upgrade HTTP request. The call blocks until one of the - following conditions is true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This function is implemented in terms of one or more calls to the - next layer's `read_some` and `write_some` functions. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param host The name of the remote host, - required by the HTTP protocol. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. - - @param decorator A function object which will be called to modify - the HTTP request object generated by the implementation. This - could be used to set the User-Agent field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - request_type& req - ); @endcode - - @param ec Set to indicate what error occurred, if any. - - @par Example - @code - websocket::stream<ip::tcp::socket> ws{io_context}; - ... - error_code ec; - ws.handshake("localhost", "/", - [](request_type& req) - { - req.set(field::user_agent, "Beast"); - }, - ec); - if(ec) - { - // An error occurred. - } - @endcode - */ - template<class RequestDecorator> - void - handshake_ex( - string_view host, - string_view target, - RequestDecorator const& decorator, - error_code& ec); - - /** Send an HTTP WebSocket Upgrade request and receive the response. - - This function is used to synchronously send the WebSocket - upgrade HTTP request. The call blocks until one of the - following conditions is true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This function is implemented in terms of one or more calls to the - next layer's `read_some` and `write_some` functions. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param res The HTTP Upgrade response returned by the remote - endpoint. - - @param host The name of the remote host, - required by the HTTP protocol. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. - - @param decorator A function object which will be called to modify - the HTTP request object generated by the implementation. This - could be used to set the User-Agent field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - request_type& req - ); @endcode - - @param ec Set to indicate what error occurred, if any. - - @par Example - @code - websocket::stream<ip::tcp::socket> ws{io_context}; - ... - error_code ec; - response_type res; - ws.handshake(res, "localhost", "/", - [](request_type& req) - { - req.set(field::user_agent, "Beast"); - }, - ec); - if(ec) - { - // An error occurred. - } - @endcode - */ - template<class RequestDecorator> - void - handshake_ex( - response_type& res, - string_view host, - string_view target, - RequestDecorator const& decorator, - error_code& ec); - - /** Start an asynchronous operation to send an upgrade request and receive the response. - - This function is used to asynchronously send the HTTP WebSocket - upgrade request and receive the HTTP WebSocket Upgrade response. - This function call always returns immediately. The asynchronous - operation will continue until one of the following conditions is - true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This operation is implemented in terms of one or more calls to the - next layer's `async_read_some` and `async_write_some` functions, and - is known as a <em>composed operation</em>. The program must ensure - that the stream performs no other operations until this operation - completes. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param host The name of the remote host, required by - the HTTP protocol. Copies may be made as needed. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. Copies of this parameter may - be made as needed. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 HandshakeHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - HandshakeHandler, void(error_code)) - async_handshake( - string_view host, - string_view target, - HandshakeHandler&& handler); - - /** Start an asynchronous operation to send an upgrade request and receive the response. - - This function is used to asynchronously send the HTTP WebSocket - upgrade request and receive the HTTP WebSocket Upgrade response. - This function call always returns immediately. The asynchronous - operation will continue until one of the following conditions is - true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This operation is implemented in terms of one or more calls to the - next layer's `async_read_some` and `async_write_some` functions, and - is known as a <em>composed operation</em>. The program must ensure - that the stream performs no other operations until this operation - completes. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param res The HTTP Upgrade response returned by the remote - endpoint. The caller must ensure this object is valid for at - least until the completion handler is invoked. - - @param host The name of the remote host, required by - the HTTP protocol. Copies may be made as needed. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. Copies of this parameter may - be made as needed. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 HandshakeHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - HandshakeHandler, void(error_code)) - async_handshake( - response_type& res, - string_view host, - string_view target, - HandshakeHandler&& handler); - - /** Start an asynchronous operation to send an upgrade request and receive the response. - - This function is used to asynchronously send the HTTP WebSocket - upgrade request and receive the HTTP WebSocket Upgrade response. - This function call always returns immediately. The asynchronous - operation will continue until one of the following conditions is - true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This operation is implemented in terms of one or more calls to the - next layer's `async_read_some` and `async_write_some` functions, and - is known as a <em>composed operation</em>. The program must ensure - that the stream performs no other operations until this operation - completes. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param host The name of the remote host, required by - the HTTP protocol. Copies may be made as needed. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. Copies of this parameter may - be made as needed. - - @param decorator A function object which will be called to modify - the HTTP request object generated by the implementation. This - could be used to set the User-Agent field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - request_type& req - ); @endcode - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 RequestDecorator, class HandshakeHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - HandshakeHandler, void(error_code)) - async_handshake_ex( - string_view host, - string_view target, - RequestDecorator const& decorator, - HandshakeHandler&& handler); - - /** Start an asynchronous operation to send an upgrade request and receive the response. - - This function is used to asynchronously send the HTTP WebSocket - upgrade request and receive the HTTP WebSocket Upgrade response. - This function call always returns immediately. The asynchronous - operation will continue until one of the following conditions is - true: - - @li The request is sent and the response is received. - - @li An error occurs on the stream - - This operation is implemented in terms of one or more calls to the - next layer's `async_read_some` and `async_write_some` functions, and - is known as a <em>composed operation</em>. The program must ensure - that the stream performs no other operations until this operation - completes. - - The operation is successful if the received HTTP response indicates - a successful HTTP Upgrade (represented by a Status-Code of 101, - "switching protocols"). - - @param res The HTTP Upgrade response returned by the remote - endpoint. The caller must ensure this object is valid for at - least until the completion handler is invoked. - - @param host The name of the remote host, required by - the HTTP protocol. Copies may be made as needed. - - @param target The Request Target, which may not be empty, - required by the HTTP protocol. Copies of this parameter may - be made as needed. - - @param decorator A function object which will be called to modify - the HTTP request object generated by the implementation. This - could be used to set the User-Agent field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - request_type& req - ); @endcode - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 RequestDecorator, class HandshakeHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - HandshakeHandler, void(error_code)) - async_handshake_ex( - response_type& res, - string_view host, - string_view target, - RequestDecorator const& decorator, - HandshakeHandler&& handler); - - //-------------------------------------------------------------------------- - // - // Handshaking (Server) - // - //-------------------------------------------------------------------------- - - /** Read and respond to a WebSocket HTTP Upgrade request. - - This function is used to synchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The call blocks - until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @throws system_error Thrown on failure. - */ - void - accept(); - - /** Read and respond to a WebSocket HTTP Upgrade request. - - This function is used to synchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The call blocks - until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param decorator A function object which will be called to modify - the HTTP response object delivered by the implementation. This - could be used to set the Server field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - response_type& res - ); @endcode - - @throws system_error Thrown on failure. - */ - template<class ResponseDecorator> - void - accept_ex(ResponseDecorator const& decorator); - - /** Read and respond to a WebSocket HTTP Upgrade request. - - This function is used to synchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The call blocks - until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param ec Set to indicate what error occurred, if any. - */ - void - accept(error_code& ec); - - /** Read and respond to a WebSocket HTTP Upgrade request. - - This function is used to synchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The call blocks - until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param decorator A function object which will be called to modify - the HTTP response object delivered by the implementation. This - could be used to set the Server field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - response_type& res - ); @endcode - - @param ec Set to indicate what error occurred, if any. - */ - template<class ResponseDecorator> - void - accept_ex( - ResponseDecorator const& decorator, - error_code& ec); - - /** Read and respond to a WebSocket HTTP Upgrade request. - - This function is used to synchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The call blocks - until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param buffers Caller provided data that has already been - received on the stream. The implementation will copy the - caller provided data before the function returns. - - @throws system_error Thrown on failure. - */ - template<class ConstBufferSequence> -#if BOOST_BEAST_DOXYGEN - void -#else - typename std::enable_if<! http::detail::is_header< - ConstBufferSequence>::value>::type -#endif - accept(ConstBufferSequence const& buffers); - - /** Read and respond to a WebSocket HTTP Upgrade request. - - This function is used to synchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The call blocks - until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param buffers Caller provided data that has already been - received on the stream. The implementation will copy the - caller provided data before the function returns. - - @param decorator A function object which will be called to modify - the HTTP response object delivered by the implementation. This - could be used to set the Server field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - response_type& res - ); @endcode - - @throws system_error Thrown on failure. - */ - template<class ConstBufferSequence, - class ResponseDecorator> -#if BOOST_BEAST_DOXYGEN - void -#else - typename std::enable_if<! http::detail::is_header< - ConstBufferSequence>::value>::type -#endif - accept_ex( - ConstBufferSequence const& buffers, - ResponseDecorator const& decorator); - - /** Read and respond to a WebSocket HTTP Upgrade request. - - This function is used to synchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The call blocks - until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param buffers Caller provided data that has already been - received on the stream. The implementation will copy the - caller provided data before the function returns. - - @param ec Set to indicate what error occurred, if any. - */ - template<class ConstBufferSequence> -#if BOOST_BEAST_DOXYGEN - void -#else - typename std::enable_if<! http::detail::is_header< - ConstBufferSequence>::value>::type -#endif - accept( - ConstBufferSequence const& buffers, - error_code& ec); - - /** Read and respond to a WebSocket HTTP Upgrade request. - - This function is used to synchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The call blocks - until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param buffers Caller provided data that has already been - received on the stream. The implementation will copy the - caller provided data before the function returns. - - @param decorator A function object which will be called to modify - the HTTP response object delivered by the implementation. This - could be used to set the Server field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - response_type& res - ); @endcode - - @param ec Set to indicate what error occurred, if any. - */ - template<class ConstBufferSequence, class ResponseDecorator> -#if BOOST_BEAST_DOXYGEN - void -#else - typename std::enable_if<! http::detail::is_header< - ConstBufferSequence>::value>::type -#endif - accept_ex( - ConstBufferSequence const& buffers, - ResponseDecorator const& decorator, - error_code& ec); - - /** Respond to a WebSocket HTTP Upgrade request - - This function is used to synchronously send the HTTP response - to an HTTP request possibly containing a WebSocket Upgrade. - The call blocks until one of the following conditions is true: - - @li The response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - @param req An object containing the HTTP Upgrade request. - Ownership is not transferred, the implementation will not - access this object from other threads. - - @throws system_error Thrown on failure. - */ - template<class Body, class Allocator> - void - accept(http::request<Body, - http::basic_fields<Allocator>> const& req); - - /** Respond to a WebSocket HTTP Upgrade request - - This function is used to synchronously send the HTTP response - to an HTTP request possibly containing a WebSocket Upgrade. - The call blocks until one of the following conditions is true: - - @li The response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - @param req An object containing the HTTP Upgrade request. - Ownership is not transferred, the implementation will not - access this object from other threads. - - @param decorator A function object which will be called to modify - the HTTP response object delivered by the implementation. This - could be used to set the Server field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - response_type& res - ); @endcode - - @throws system_error Thrown on failure. - */ - template<class Body, class Allocator, - class ResponseDecorator> - void - accept_ex(http::request<Body, - http::basic_fields<Allocator>> const& req, - ResponseDecorator const& decorator); - - /** Respond to a WebSocket HTTP Upgrade request - - This function is used to synchronously send the HTTP response - to an HTTP request possibly containing a WebSocket Upgrade. - The call blocks until one of the following conditions is true: - - @li The response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - @param req An object containing the HTTP Upgrade request. - Ownership is not transferred, the implementation will not - access this object from other threads. - - @param ec Set to indicate what error occurred, if any. - */ - template<class Body, class Allocator> - void - accept(http::request<Body, - http::basic_fields<Allocator>> const& req, - error_code& ec); - - /** Respond to a WebSocket HTTP Upgrade request - - This function is used to synchronously send the HTTP response - to an HTTP request possibly containing a WebSocket Upgrade. - The call blocks until one of the following conditions is true: - - @li The response finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to - the next layer's `read_some` and `write_some` functions. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When this call returns, the stream is then ready to send and - receive WebSocket protocol frames and messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure. - - @param req An object containing the HTTP Upgrade request. - Ownership is not transferred, the implementation will not - access this object from other threads. - - @param decorator A function object which will be called to modify - the HTTP response object delivered by the implementation. This - could be used to set the Server field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - response_type& res - ); @endcode - - @param ec Set to indicate what error occurred, if any. - */ - template<class Body, class Allocator, - class ResponseDecorator> - void - accept_ex(http::request<Body, - http::basic_fields<Allocator>> const& req, - ResponseDecorator const& decorator, - error_code& ec); - - /** Start reading and responding to a WebSocket HTTP Upgrade request. - - This function is used to asynchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The function call - always returns immediately. The asynchronous operation will - continue until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to - the next layer's `async_read_some` and `async_write_some` - functions, and is known as a <em>composed operation</em>. The - program must ensure that the stream performs no other - asynchronous operations until this operation completes. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When the completion handler is invoked, the stream is then - ready to send and receive WebSocket protocol frames and - messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure, and - the completion handler will be invoked with a suitable error - code set. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 AcceptHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code)) - async_accept(AcceptHandler&& handler); - - /** Start reading and responding to a WebSocket HTTP Upgrade request. - - This function is used to asynchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The function call - always returns immediately. The asynchronous operation will - continue until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to - the next layer's `async_read_some` and `async_write_some` - functions, and is known as a <em>composed operation</em>. The - program must ensure that the stream performs no other - asynchronous operations until this operation completes. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When the completion handler is invoked, the stream is then - ready to send and receive WebSocket protocol frames and - messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure, and - the completion handler will be invoked with a suitable error - code set. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param decorator A function object which will be called to modify - the HTTP response object delivered by the implementation. This - could be used to set the Server field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - response_type& res - ); @endcode - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 ResponseDecorator, - class AcceptHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code)) - async_accept_ex( - ResponseDecorator const& decorator, - AcceptHandler&& handler); - - /** Start reading and responding to a WebSocket HTTP Upgrade request. - - This function is used to asynchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The function call - always returns immediately. The asynchronous operation will - continue until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to - the next layer's `async_read_some` and `async_write_some` - functions, and is known as a <em>composed operation</em>. The - program must ensure that the stream performs no other - asynchronous operations until this operation completes. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When the completion handler is invoked, the stream is then - ready to send and receive WebSocket protocol frames and - messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure, and - the completion handler will be invoked with a suitable error - code set. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param buffers Caller provided data that has already been - received on the stream. This may be used for implementations - allowing multiple protocols on the same stream. The - buffered data will first be applied to the handshake, and - then to received WebSocket frames. The implementation will - copy the caller provided data before the function returns. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 AcceptHandler> -#if BOOST_BEAST_DOXYGEN - void_or_deduced -#else - typename std::enable_if< - ! http::detail::is_header<ConstBufferSequence>::value, - BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code))>::type -#endif - async_accept( - ConstBufferSequence const& buffers, - AcceptHandler&& handler); - - /** Start reading and responding to a WebSocket HTTP Upgrade request. - - This function is used to asynchronously read an HTTP WebSocket - Upgrade request and send the HTTP response. The function call - always returns immediately. The asynchronous operation will - continue until one of the following conditions is true: - - @li The request is received and the response finishes sending. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to - the next layer's `async_read_some` and `async_write_some` - functions, and is known as a <em>composed operation</em>. The - program must ensure that the stream performs no other - asynchronous operations until this operation completes. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When the completion handler is invoked, the stream is then - ready to send and receive WebSocket protocol frames and - messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure, and - the completion handler will be invoked with a suitable error - code set. - - The implementation uses fixed size internal storage to - receive the request. If the request is too large, the error - @ref error::buffer_overflow will be indicated. Applications - that wish to receive larger requests should first read the - request using their own buffer and a suitable overload of - @ref http::read or @ref http::async_read, then call @ref accept - or @ref async_accept with the request. - - @param buffers Caller provided data that has already been - received on the stream. This may be used for implementations - allowing multiple protocols on the same stream. The - buffered data will first be applied to the handshake, and - then to received WebSocket frames. The implementation will - copy the caller provided data before the function returns. - - @param decorator A function object which will be called to modify - the HTTP response object delivered by the implementation. This - could be used to set the Server field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - response_type& res - ); @endcode - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 ResponseDecorator, - class AcceptHandler> -#if BOOST_BEAST_DOXYGEN - void_or_deduced -#else - typename std::enable_if< - ! http::detail::is_header<ConstBufferSequence>::value, - BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code))>::type -#endif - async_accept_ex( - ConstBufferSequence const& buffers, - ResponseDecorator const& decorator, - AcceptHandler&& handler); - - /** Start responding to a WebSocket HTTP Upgrade request. - - This function is used to asynchronously send the HTTP response - to an HTTP request possibly containing a WebSocket Upgrade - request. The function call always returns immediately. The - asynchronous operation will continue until one of the following - conditions is true: - - @li The response finishes sending. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to - the next layer's `async_write_some` functions, and is known as - a <em>composed operation</em>. The program must ensure that the - stream performs no other operations until this operation - completes. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When the completion handler is invoked, the stream is then - ready to send and receive WebSocket protocol frames and - messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure, and - the completion handler will be invoked with a suitable error - code set. - - @param req An object containing the HTTP Upgrade request. - Ownership is not transferred, the implementation will not access - this object from other threads. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 Body, class Allocator, - class AcceptHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code)) - async_accept( - http::request<Body, - http::basic_fields<Allocator>> const& req, - AcceptHandler&& handler); - - /** Start responding to a WebSocket HTTP Upgrade request. - - This function is used to asynchronously send the HTTP response - to an HTTP request possibly containing a WebSocket Upgrade - request. The function call always returns immediately. The - asynchronous operation will continue until one of the following - conditions is true: - - @li The response finishes sending. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to - the next layer's `async_write_some` functions, and is known as - a <em>composed operation</em>. The program must ensure that the - stream performs no other operations until this operation - completes. - - If the stream receives a valid HTTP WebSocket Upgrade request, - an HTTP response is sent back indicating a successful upgrade. - When the completion handler is invoked, the stream is then - ready to send and receive WebSocket protocol frames and - messages. - If the HTTP Upgrade request is invalid or cannot be satisfied, - an HTTP response is sent indicating the reason and status code - (typically 400, "Bad Request"). This counts as a failure, and - the completion handler will be invoked with a suitable error - code set. - - @param req An object containing the HTTP Upgrade request. - Ownership is not transferred, the implementation will not access - this object from other threads. - - @param decorator A function object which will be called to modify - the HTTP response object delivered by the implementation. This - could be used to set the Server field, subprotocols, or other - application or HTTP specific fields. The object will be called - with this equivalent signature: - @code void decorator( - response_type& res - ); @endcode - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec // Result of operation - ); @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 Body, class Allocator, - class ResponseDecorator, - class AcceptHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - AcceptHandler, void(error_code)) - async_accept_ex( - http::request<Body, - http::basic_fields<Allocator>> const& req, - ResponseDecorator const& decorator, - AcceptHandler&& handler); - - //-------------------------------------------------------------------------- - // - // Control Frames - // - //-------------------------------------------------------------------------- - - /** Send a WebSocket close frame. - - This function is used to synchronously send a close frame on - the stream. The call blocks until one of the following is true: - - @li The close frame finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls - to the next layer's `write_some` functions. - - If the close reason specifies a close code other than - @ref beast::websocket::close_code::none, the close frame is - sent with the close code and optional reason string. Otherwise, - the close frame is sent with no payload. - - Callers should not attempt to write WebSocket data after - initiating the close. Instead, callers should continue - reading until an error occurs. A read returning @ref error::closed - indicates a successful connection closure. - - @param cr The reason for the close. - - @throws system_error Thrown on failure. - */ - void - close(close_reason const& cr); - - /** Send a WebSocket close frame. - - This function is used to synchronously send a close frame on - the stream. The call blocks until one of the following is true: - - @li The close frame finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls - to the next layer's `write_some` functions. - - If the close reason specifies a close code other than - @ref beast::websocket::close_code::none, the close frame is - sent with the close code and optional reason string. Otherwise, - the close frame is sent with no payload. - - Callers should not attempt to write WebSocket data after - initiating the close. Instead, callers should continue - reading until an error occurs. A read returning @ref error::closed - indicates a successful connection closure. - - @param cr The reason for the close. - - @param ec Set to indicate what error occurred, if any. - */ - void - close(close_reason const& cr, error_code& ec); - - /** Start an asynchronous operation to send a WebSocket close frame. - - This function is used to asynchronously send a close frame on - the stream. This function call always returns immediately. The - asynchronous operation will continue until one of the following - conditions is true: - - @li The close frame finishes sending. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the - next layer's `async_write_some` functions, and is known as a - <em>composed operation</em>. The program must ensure that the - stream performs no other write operations (such as @ref async_ping, - @ref async_write, @ref async_write_some, or @ref async_close) - until this operation completes. - - If the close reason specifies a close code other than - @ref beast::websocket::close_code::none, the close frame is - sent with the close code and optional reason string. Otherwise, - the close frame is sent with no payload. - - Callers should not attempt to write WebSocket data after - initiating the close. Instead, callers should continue - reading until an error occurs. A read returning @ref error::closed - indicates a successful connection closure. - - @param cr The reason for the close. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The function signature of the handler must be: - @code - void handler( - error_code const& ec // Result of operation - ); - @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 CloseHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - CloseHandler, void(error_code)) - async_close(close_reason const& cr, CloseHandler&& handler); - - /** Send a WebSocket ping frame. - - This function is used to synchronously send a ping frame on - the stream. The call blocks until one of the following is true: - - @li The ping frame finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to the - next layer's `write_some` functions. - - @param payload The payload of the ping message, which may be empty. - - @throws system_error Thrown on failure. - */ - void - ping(ping_data const& payload); - - /** Send a WebSocket ping frame. - - This function is used to synchronously send a ping frame on - the stream. The call blocks until one of the following is true: - - @li The ping frame finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to the - next layer's `write_some` functions. - - @param payload The payload of the ping message, which may be empty. - - @param ec Set to indicate what error occurred, if any. - */ - void - ping(ping_data const& payload, error_code& ec); - - /** Start an asynchronous operation to send a WebSocket ping frame. - - This function is used to asynchronously send a ping frame to - the stream. The function call always returns immediately. The - asynchronous operation will continue until one of the following - is true: - - @li The entire ping frame is sent. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the - next layer's `async_write_some` functions, and is known as a - <em>composed operation</em>. The program must ensure that the - stream performs no other writes until this operation completes. - - If a close frame is sent or received before the ping frame is - sent, the completion handler will be called with the error - set to `boost::asio::error::operation_aborted`. - - @param payload The payload of the ping message, which may be empty. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The function signature of the handler must be: - @code - void handler( - error_code const& ec // Result of operation - ); - @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 WriteHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code)) - async_ping(ping_data const& payload, WriteHandler&& handler); - - /** Send a WebSocket pong frame. - - This function is used to synchronously send a pong frame on - the stream. The call blocks until one of the following is true: - - @li The pong frame finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to the - next layer's `write_some` functions. - - The WebSocket protocol allows pong frames to be sent from either - end at any time. It is not necessary to first receive a ping in - order to send a pong. The remote peer may use the receipt of a - pong frame as an indication that the connection is not dead. - - @param payload The payload of the pong message, which may be empty. - - @throws system_error Thrown on failure. - */ - void - pong(ping_data const& payload); - - /** Send a WebSocket pong frame. - - This function is used to synchronously send a pong frame on - the stream. The call blocks until one of the following is true: - - @li The pong frame finishes sending. - - @li An error occurs on the stream. - - This function is implemented in terms of one or more calls to the - next layer's `write_some` functions. - - The WebSocket protocol allows pong frames to be sent from either - end at any time. It is not necessary to first receive a ping in - order to send a pong. The remote peer may use the receipt of a - pong frame as an indication that the connection is not dead. - - @param payload The payload of the pong message, which may be empty. - - @param ec Set to indicate what error occurred, if any. - */ - void - pong(ping_data const& payload, error_code& ec); - - /** Start an asynchronous operation to send a WebSocket pong frame. - - This function is used to asynchronously send a pong frame to - the stream. The function call always returns immediately. The - asynchronous operation will continue until one of the following - is true: - - @li The entire pong frame is sent. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the - next layer's `async_write_some` functions, and is known as a - <em>composed operation</em>. The program must ensure that the - stream performs no other writes until this operation completes. - - The WebSocket protocol allows pong frames to be sent from either - end at any time. It is not necessary to first receive a ping in - order to send a pong. The remote peer may use the receipt of a - pong frame as an indication that the connection is not dead. - - If a close frame is sent or received before the pong frame is - sent, the completion handler will be called with the error - set to `boost::asio::error::operation_aborted`. - - @param payload The payload of the pong message, which may be empty. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The function signature of the handler must be: - @code - void handler( - error_code const& ec // Result of operation - ); - @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 WriteHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code)) - async_pong(ping_data const& payload, WriteHandler&& handler); - - //-------------------------------------------------------------------------- - // - // Reading - // - //-------------------------------------------------------------------------- - - /** Read a message - - This function is used to synchronously read a complete - message from the stream. - The call blocks until one of the following is true: - - @li A complete message is received. - - @li A close frame is received. In this case the error indicated by - the function will be @ref error::closed. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the next - layer's `read_some` and `write_some` functions. - - Received message data, if any, is appended to the input area of the - buffer. The functions @ref got_binary and @ref got_text may be used - to query the stream and determine the type of the last received message. - - While this operation is active, the implementation will read incoming - control frames and handle them automatically as follows: - - @li The @ref control_callback will be invoked for each control frame. - - @li For each received ping frame, a pong frame will be - automatically sent. - - @li If a close frame is received, the WebSocket close procedure is - performed. In this case, when the function returns, the error - @ref error::closed will be indicated. - - @return The number of message payload bytes appended to the buffer. - - @param buffer A dynamic buffer to hold the message data after any - masking or decompression has been applied. - - @throws system_error Thrown to indicate an error. The corresponding - error code may be retrieved from the exception object for inspection. - */ - template<class DynamicBuffer> - std::size_t - read(DynamicBuffer& buffer); - - /** Read a message - - This function is used to synchronously read a complete - message from the stream. - The call blocks until one of the following is true: - - @li A complete message is received. - - @li A close frame is received. In this case the error indicated by - the function will be @ref error::closed. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the next - layer's `read_some` and `write_some` functions. - - Received message data, if any, is appended to the input area of the - buffer. The functions @ref got_binary and @ref got_text may be used - to query the stream and determine the type of the last received message. - - While this operation is active, the implementation will read incoming - control frames and handle them automatically as follows: - - @li The @ref control_callback will be invoked for each control frame. - - @li For each received ping frame, a pong frame will be - automatically sent. - - @li If a close frame is received, the WebSocket close procedure is - performed. In this case, when the function returns, the error - @ref error::closed will be indicated. - - @return The number of message payload bytes appended to the buffer. - - @param buffer A dynamic buffer to hold the message data after any - masking or decompression has been applied. - - @param ec Set to indicate what error occurred, if any. - */ - template<class DynamicBuffer> - std::size_t - read(DynamicBuffer& buffer, error_code& ec); - - /** Read a message asynchronously - - This function is used to asynchronously read a complete - message from the stream. - The function call always returns immediately. - The asynchronous operation will continue until one of the - following is true: - - @li A complete message is received. - - @li A close frame is received. In this case the error indicated by - the function will be @ref error::closed. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the - next layer's `async_read_some` and `async_write_some` functions, - and is known as a <em>composed operation</em>. The program must - ensure that the stream performs no other reads until this operation - completes. - - Received message data, if any, is appended to the input area of the - buffer. The functions @ref got_binary and @ref got_text may be used - to query the stream and determine the type of the last received message. - - While this operation is active, the implementation will read incoming - control frames and handle them automatically as follows: - - @li The @ref control_callback will be invoked for each control frame. - - @li For each received ping frame, a pong frame will be - automatically sent. - - @li If a close frame is received, the WebSocket close procedure is - performed. In this case, when the function returns, the error - @ref error::closed will be indicated. - - Because of the need to handle control frames, asynchronous read - operations can cause writes to take place. These writes are managed - transparently; callers can still have one active asynchronous - read and asynchronous write operation pending simultaneously - (a user initiated call to @ref async_close counts as a write). - - @param buffer A dynamic buffer to hold the message data after - any masking or decompression has been applied. This object must - remain valid until the handler is called. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code - void handler( - error_code const& ec, // Result of operation - std::size_t bytes_written // Number of bytes appended to buffer - ); - @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 DynamicBuffer, class ReadHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) - async_read( - DynamicBuffer& buffer, - ReadHandler&& handler); - - //-------------------------------------------------------------------------- - - /** Read part of a message - - This function is used to synchronously read some - message data from the stream. - The call blocks until one of the following is true: - - @li Some or all of the message is received. - - @li A close frame is received. In this case the error indicated by - the function will be @ref error::closed. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the next - layer's `read_some` and `write_some` functions. - - Received message data, if any, is appended to the input area of the - buffer. The functions @ref got_binary and @ref got_text may be used - to query the stream and determine the type of the last received message. - The function @ref is_message_done may be called to determine if the - message received by the last read operation is complete. - - While this operation is active, the implementation will read incoming - control frames and handle them automatically as follows: - - @li The @ref control_callback will be invoked for each control frame. - - @li For each received ping frame, a pong frame will be - automatically sent. - - @li If a close frame is received, the WebSocket close procedure is - performed. In this case, when the function returns, the error - @ref error::closed will be indicated. - - @return The number of message payload bytes appended to the buffer. - - @param buffer A dynamic buffer to hold the message data after any - masking or decompression has been applied. - - @param limit An upper limit on the number of bytes this function - will append into the buffer. If this value is zero, then a reasonable - size will be chosen automatically. - - @throws system_error Thrown to indicate an error. The corresponding - error code may be retrieved from the exception object for inspection. - */ - template<class DynamicBuffer> - std::size_t - read_some( - DynamicBuffer& buffer, - std::size_t limit); - - /** Read part of a message - - This function is used to synchronously read some - message data from the stream. - The call blocks until one of the following is true: - - @li Some or all of the message is received. - - @li A close frame is received. In this case the error indicated by - the function will be @ref error::closed. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the next - layer's `read_some` and `write_some` functions. - - Received message data, if any, is appended to the input area of the - buffer. The functions @ref got_binary and @ref got_text may be used - to query the stream and determine the type of the last received message. - The function @ref is_message_done may be called to determine if the - message received by the last read operation is complete. - - While this operation is active, the implementation will read incoming - control frames and handle them automatically as follows: - - @li The @ref control_callback will be invoked for each control frame. - - @li For each received ping frame, a pong frame will be - automatically sent. - - @li If a close frame is received, the WebSocket close procedure is - performed. In this case, when the function returns, the error - @ref error::closed will be indicated. - - @return The number of message payload bytes appended to the buffer. - - @param buffer A dynamic buffer to hold the message data after any - masking or decompression has been applied. - - @param limit An upper limit on the number of bytes this function - will append into the buffer. If this value is zero, then a reasonable - size will be chosen automatically. - - @param ec Set to indicate what error occurred, if any. - */ - template<class DynamicBuffer> - std::size_t - read_some( - DynamicBuffer& buffer, - std::size_t limit, - error_code& ec); - - /** Read part of a message asynchronously - - This function is used to asynchronously read part of a - message from the stream. - The function call always returns immediately. - The asynchronous operation will continue until one of the - following is true: - - @li Some or all of the message is received. - - @li A close frame is received. In this case the error indicated by - the function will be @ref error::closed. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the - next layer's `async_read_some` and `async_write_some` functions, - and is known as a <em>composed operation</em>. The program must - ensure that the stream performs no other reads until this operation - completes. - - Received message data, if any, is appended to the input area of the - buffer. The functions @ref got_binary and @ref got_text may be used - to query the stream and determine the type of the last received message. - The function @ref is_message_done may be called to determine if the - message received by the last read operation is complete. - - While this operation is active, the implementation will read incoming - control frames and handle them automatically as follows: - - @li The @ref control_callback will be invoked for each control frame. - - @li For each received ping frame, a pong frame will be - automatically sent. - - @li If a close frame is received, the WebSocket close procedure is - performed. In this case, when the function returns, the error - @ref error::closed will be indicated. - - Because of the need to handle control frames, asynchronous read - operations can cause writes to take place. These writes are managed - transparently; callers can still have one active asynchronous - read and asynchronous write operation pending simultaneously - (a user initiated call to @ref async_close counts as a write). - - @param buffer A dynamic buffer to hold the message data after - any masking or decompression has been applied. This object must - remain valid until the handler is called. - - @param limit An upper limit on the number of bytes this function - will append into the buffer. If this value is zero, then a reasonable - size will be chosen automatically. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code - void handler( - error_code const& ec, // Result of operation - std::size_t bytes_written // Number of bytes appended to buffer - ); - @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 DynamicBuffer, class ReadHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - ReadHandler, void(error_code, std::size_t)) - async_read_some( - DynamicBuffer& buffer, - std::size_t limit, - ReadHandler&& handler); - - //-------------------------------------------------------------------------- - - /** Read part of a message - - This function is used to synchronously read some - message data from the stream. - The call blocks until one of the following is true: - - @li Some or all of the message is received. - - @li A close frame is received. In this case the error indicated by - the function will be @ref error::closed. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the next - layer's `read_some` and `write_some` functions. - - Received message data, if any, is written to the buffer sequence. - The functions @ref got_binary and @ref got_text may be used - to query the stream and determine the type of the last received message. - The function @ref is_message_done may be called to determine if the - message received by the last read operation is complete. - - While this operation is active, the implementation will read incoming - control frames and handle them automatically as follows: - - @li The @ref control_callback will be invoked for each control frame. - - @li For each received ping frame, a pong frame will be - automatically sent. - - @li If a close frame is received, the WebSocket close procedure is - performed. In this case, when the function returns, the error - @ref error::closed will be indicated. - - @return The number of message payload bytes written to the - buffer sequence. - - @param buffers A buffer sequence to hold the message data after any - masking or decompression has been applied. - - @throws system_error Thrown to indicate an error. The corresponding - error code may be retrieved from the exception object for inspection. - */ - template<class MutableBufferSequence> - std::size_t - read_some( - MutableBufferSequence const& buffers); - - /** Read part of a message - - This function is used to synchronously read some - message data from the stream. - The call blocks until one of the following is true: - - @li Some or all of the message is received. - - @li A close frame is received. In this case the error indicated by - the function will be @ref error::closed. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the next - layer's `read_some` and `write_some` functions. - - Received message data, if any, is written to the buffer sequence. - The functions @ref got_binary and @ref got_text may be used - to query the stream and determine the type of the last received message. - The function @ref is_message_done may be called to determine if the - message received by the last read operation is complete. - - While this operation is active, the implementation will read incoming - control frames and handle them automatically as follows: - - @li The @ref control_callback will be invoked for each control frame. - - @li For each received ping frame, a pong frame will be - automatically sent. - - @li If a close frame is received, the WebSocket close procedure is - performed. In this case, when the function returns, the error - @ref error::closed will be indicated. - - @return The number of message payload bytes written to the - buffer sequence. - - @param buffers A buffer sequence to hold the message data after any - masking or decompression has been applied. - - @param ec Set to indicate what error occurred, if any. - */ - template<class MutableBufferSequence> - std::size_t - read_some( - MutableBufferSequence const& buffers, - error_code& ec); - - /** Read part of a message asynchronously - - This function is used to asynchronously read part of a - message from the stream. - The function call always returns immediately. - The asynchronous operation will continue until one of the - following is true: - - @li Some or all of the message is received. - - @li A close frame is received. In this case the error indicated by - the function will be @ref error::closed. - - @li An error occurs on the stream. - - This operation is implemented in terms of one or more calls to the - next layer's `async_read_some` and `async_write_some` functions, - and is known as a <em>composed operation</em>. The program must - ensure that the stream performs no other reads until this operation - completes. - - Received message data, if any, is written to the buffer sequence. - The functions @ref got_binary and @ref got_text may be used - to query the stream and determine the type of the last received message. - The function @ref is_message_done may be called to determine if the - message received by the last read operation is complete. - - While this operation is active, the implementation will read incoming - control frames and handle them automatically as follows: - - @li The @ref control_callback will be invoked for each control frame. - - @li For each received ping frame, a pong frame will be - automatically sent. - - @li If a close frame is received, the WebSocket close procedure is - performed. In this case, when the function returns, the error - @ref error::closed will be indicated. - - Because of the need to handle control frames, asynchronous read - operations can cause writes to take place. These writes are managed - transparently; callers can still have one active asynchronous - read and asynchronous write operation pending simultaneously - (a user initiated call to @ref async_close counts as a write). - - @param buffers The buffer sequence into which message data will - be placed after any masking or decompresison has been applied. - The implementation will make copies of this object as needed, - but ownership of the underlying memory is not transferred. - The caller is responsible for ensuring that the memory - locations pointed to by the buffer sequence remains valid - until the completion handler is called. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code - void handler( - error_code const& ec, // Result of operation - std::size_t bytes_written // Number of bytes written to the buffer sequence - ); - @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(error_code, std::size_t)) - async_read_some( - MutableBufferSequence const& buffers, - ReadHandler&& handler); - - //-------------------------------------------------------------------------- - // - // Writing - // - //-------------------------------------------------------------------------- - - /** Write a message to the stream. - - This function is used to synchronously write a message to - the stream. The call blocks until one of the following conditions - is met: - - @li The entire message is sent. - - @li An error occurs. - - This operation is implemented in terms of one or more calls to the - next layer's `write_some` function. - - The current setting of the @ref binary option controls - whether the message opcode is set to text or binary. If the - @ref auto_fragment option is set, the message will be split - into one or more frames as necessary. The actual payload contents - sent may be transformed as per the WebSocket protocol settings. - - @param buffers The buffers containing the entire message - payload. The implementation will make copies of this object - as needed, but ownership of the underlying memory is not - transferred. The caller is responsible for ensuring that - the memory locations pointed to by buffers remains valid - until the completion handler is called. - - @return The number of bytes written from the buffers. - If an error occurred, this will be less than the sum - of the buffer sizes. - - @throws system_error Thrown on failure. - - @note This function always sends an entire message. To - send a message in fragments, use @ref write_some. - */ - template<class ConstBufferSequence> - std::size_t - write(ConstBufferSequence const& buffers); - - /** Write a message to the stream. - - This function is used to synchronously write a message to - the stream. The call blocks until one of the following conditions - is met: - - @li The entire message is sent. - - @li An error occurs. - - This operation is implemented in terms of one or more calls to the - next layer's `write_some` function. - - The current setting of the @ref binary option controls - whether the message opcode is set to text or binary. If the - @ref auto_fragment option is set, the message will be split - into one or more frames as necessary. The actual payload contents - sent may be transformed as per the WebSocket protocol settings. - - @param buffers The buffers containing the entire message - payload. The implementation will make copies of this object - as needed, but ownership of the underlying memory is not - transferred. The caller is responsible for ensuring that - the memory locations pointed to by buffers remains valid - until the completion handler is called. - - @return The number of bytes written from the buffers. - If an error occurred, this will be less than the sum - of the buffer sizes. - - @param ec Set to indicate what error occurred, if any. - - @throws system_error Thrown on failure. - - @note This function always sends an entire message. To - send a message in fragments, use @ref write_some. - */ - template<class ConstBufferSequence> - std::size_t - write(ConstBufferSequence const& buffers, error_code& ec); - - /** Start an asynchronous operation to write a message to the stream. - - This function is used to asynchronously write a message to - the stream. The function call always returns immediately. - The asynchronous operation will continue until one of the - following conditions is true: - - @li The entire message is sent. - - @li An error occurs. - - This operation is implemented in terms of one or more calls - to the next layer's `async_write_some` functions, and is known - as a <em>composed operation</em>. The program must ensure that - the stream performs no other write operations (such as - @ref async_write, @ref async_write_some, or - @ref async_close). - - The current setting of the @ref binary option controls - whether the message opcode is set to text or binary. If the - @ref auto_fragment option is set, the message will be split - into one or more frames as necessary. The actual payload contents - sent may be transformed as per the WebSocket protocol settings. - - @param buffers The buffers containing the entire message - payload. The implementation will make copies of this object - as needed, but ownership of the underlying memory is not - transferred. The caller is responsible for ensuring that - the memory locations pointed to by buffers remains valid - until the completion handler is called. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The function signature of the handler must be: - @code - void handler( - error_code const& ec, // Result of operation - std::size_t bytes_transferred // Number of bytes written from the - // buffers. If an error occurred, - // this will be less than the sum - // of the buffer sizes. - ); - @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(error_code, std::size_t)) - async_write( - ConstBufferSequence const& buffers, - WriteHandler&& handler); - - /** Write partial message data on the stream. - - This function is used to write some or all of a message's - payload to the stream. The call will block until one of the - following conditions is true: - - @li A frame is sent. - - @li Message data is transferred to the write buffer. - - @li An error occurs. - - This operation is implemented in terms of one or more calls - to the stream's `write_some` function. - - If this is the beginning of a new message, the message opcode - will be set to text or binary as per the current setting of - the @ref binary option. The actual payload sent may be - transformed as per the WebSocket protocol settings. - - @param fin `true` if this is the last part of the message. - - @param buffers The input buffer sequence holding the data to write. - - @return The number of bytes written from the buffers. - If an error occurred, this will be less than the sum - of the buffer sizes. - - @throws system_error Thrown on failure. - */ - template<class ConstBufferSequence> - std::size_t - write_some(bool fin, ConstBufferSequence const& buffers); - - /** Write partial message data on the stream. - - This function is used to write some or all of a message's - payload to the stream. The call will block until one of the - following conditions is true: - - @li A frame is sent. - - @li Message data is transferred to the write buffer. - - @li An error occurs. - - This operation is implemented in terms of one or more calls - to the stream's `write_some` function. - - If this is the beginning of a new message, the message opcode - will be set to text or binary as per the current setting of - the @ref binary option. The actual payload sent may be - transformed as per the WebSocket protocol settings. - - @param fin `true` if this is the last part of the message. - - @param buffers The input buffer sequence holding the data to write. - - @param ec Set to indicate what error occurred, if any. - - @return The number of bytes written from the buffers. - If an error occurred, this will be less than the sum - of the buffer sizes. - - @return The number of bytes consumed in the input buffers. - */ - template<class ConstBufferSequence> - std::size_t - write_some(bool fin, - ConstBufferSequence const& buffers, error_code& ec); - - /** Start an asynchronous operation to send a message frame on the stream. - - This function is used to asynchronously write a message frame - on the stream. This function call always returns immediately. - The asynchronous operation will continue until one of the following - conditions is true: - - @li The entire frame is sent. - - @li An error occurs. - - This operation is implemented in terms of one or more calls - to the next layer's `async_write_some` functions, and is known - as a <em>composed operation</em>. The actual payload sent - may be transformed as per the WebSocket protocol settings. The - program must ensure that the stream performs no other write - operations (such as @ref async_write, @ref async_write_some, - or @ref async_close). - - If this is the beginning of a new message, the message opcode - will be set to text or binary as per the current setting of - the @ref binary option. The actual payload sent may be - transformed as per the WebSocket protocol settings. - - @param fin `true` if this is the last part of the message. - - @param buffers A object meeting the requirements of - ConstBufferSequence which holds the payload data before any - masking or compression. 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 Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& ec, // Result of operation - std::size_t bytes_transferred // Number of bytes written from the - // buffers. If an error occurred, - // this will be less than the sum - // of the buffer sizes. - ); @endcode - */ - template<class ConstBufferSequence, class WriteHandler> - BOOST_ASIO_INITFN_RESULT_TYPE( - WriteHandler, void(error_code, std::size_t)) - async_write_some(bool fin, - ConstBufferSequence const& buffers, WriteHandler&& handler); - -private: - template<class, class> class accept_op; - template<class> class close_op; - template<class> class handshake_op; - template<class> class ping_op; - template<class, class> class read_some_op; - template<class, class> class read_op; - template<class> class response_op; - template<class, class> class write_some_op; - template<class, class> class write_op; - - static void default_decorate_req(request_type&) {} - static void default_decorate_res(response_type&) {} - - void - set_option(permessage_deflate const& o, std::true_type); - - void - set_option(permessage_deflate const&, std::false_type); - - void - get_option(permessage_deflate& o, std::true_type) - { - o = this->pmd_opts_; - } - - void - get_option(permessage_deflate& o, std::false_type) - { - o = {}; - o.client_enable = false; - o.server_enable = false; - } - - void open(role_type role); - - void open_pmd(std::true_type); - - void open_pmd(std::false_type) - { - } - - void close(); - - void close_pmd(std::true_type) - { - this->pmd_.reset(); - } - - void close_pmd(std::false_type) - { - } - - void reset(); - - void begin_msg() - { - begin_msg(is_deflate_supported{}); - } - - void begin_msg(std::true_type); - - void begin_msg(std::false_type); - - std::size_t - read_size_hint( - std::size_t initial_size, - std::true_type) const; - - std::size_t - read_size_hint( - std::size_t initial_size, - std::false_type) const; - - bool - check_open(error_code& ec) - { - if(status_ != status::open) - { - ec = boost::asio::error::operation_aborted; - return false; - } - ec.assign(0, ec.category()); - return true; - } - - bool - check_ok(error_code& ec) - { - if(ec) - { - if(status_ != status::closed) - status_ = status::failed; - return false; - } - return true; - } - - template<class DynamicBuffer> - bool - parse_fh( - detail::frame_header& fh, - DynamicBuffer& b, - error_code& ec); - - template<class DynamicBuffer> - void - write_close(DynamicBuffer& b, close_reason const& rc); - - template<class DynamicBuffer> - void - write_ping(DynamicBuffer& b, - detail::opcode op, ping_data const& data); - - // - // upgrade - // - - template<class Decorator> - request_type - build_request(detail::sec_ws_key_type& key, - string_view host, - string_view target, - Decorator const& decorator); - - void - build_request_pmd(request_type& req, std::true_type); - - void - build_request_pmd(request_type&, std::false_type) - { - } - - template< - class Body, class Allocator, class Decorator> - response_type - build_response( - http::request<Body, - http::basic_fields<Allocator>> const& req, - Decorator const& decorator, - error_code& ec); - - template<class Body, class Allocator> - void - build_response_pmd( - response_type& res, - http::request<Body, - http::basic_fields<Allocator>> const& req, - std::true_type); - - template<class Body, class Allocator> - void - build_response_pmd( - response_type&, - http::request<Body, - http::basic_fields<Allocator>> const&, - std::false_type) - { - } - - void - on_response( - response_type const& res, - detail::sec_ws_key_type const& key, - error_code& ec); - - void - on_response_pmd( - response_type const& res, - std::true_type); - - void - on_response_pmd( - response_type const&, - std::false_type) - { - } - - // - // accept / handshake - // - - template<class Allocator> - void - do_pmd_config( - http::basic_fields<Allocator> const& h, - std::true_type) - { - pmd_read(this->pmd_config_, h); - } - - template<class Allocator> - void - do_pmd_config( - http::basic_fields<Allocator> const&, - std::false_type) - { - } - - template<class Decorator> - void - do_accept( - Decorator const& decorator, - error_code& ec); - - template< - class Body, class Allocator, - class Decorator> - void - do_accept( - http::request<Body, - http::basic_fields<Allocator>> const& req, - Decorator const& decorator, - error_code& ec); - - template<class RequestDecorator> - void - do_handshake(response_type* res_p, - string_view host, string_view target, - RequestDecorator const& decorator, - error_code& ec); - - // - // fail - // - - void - do_fail( - std::uint16_t code, - error_code ev, - error_code& ec); -}; - -} // websocket -} // beast -} // boost - -#include <boost/beast/websocket/impl/accept.ipp> -#include <boost/beast/websocket/impl/close.ipp> -#include <boost/beast/websocket/impl/handshake.ipp> -#include <boost/beast/websocket/impl/ping.ipp> -#include <boost/beast/websocket/impl/read.ipp> -#include <boost/beast/websocket/impl/stream.ipp> -#include <boost/beast/websocket/impl/write.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/stream_fwd.hpp b/contrib/restricted/boost/boost/beast/websocket/stream_fwd.hpp deleted file mode 100644 index 97ffcb49ed..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/stream_fwd.hpp +++ /dev/null @@ -1,28 +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_WEBSOCKET_STREAM_FWD_HPP -#define BOOST_BEAST_WEBSOCKET_STREAM_FWD_HPP - -#include <boost/beast/core/detail/config.hpp> - -namespace boost { -namespace beast { -namespace websocket { - -template< - class NextLayer, - bool deflateSupported = true> -class stream; - -} // websocket -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/websocket/teardown.hpp b/contrib/restricted/boost/boost/beast/websocket/teardown.hpp deleted file mode 100644 index a255756dad..0000000000 --- a/contrib/restricted/boost/boost/beast/websocket/teardown.hpp +++ /dev/null @@ -1,174 +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_WEBSOCKET_TEARDOWN_HPP -#define BOOST_BEAST_WEBSOCKET_TEARDOWN_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> -#include <boost/beast/websocket/role.hpp> -#include <boost/asio/ip/tcp.hpp> -#include <type_traits> - -namespace boost { -namespace beast { -namespace websocket { - -/** Tear down a connection. - - This tears down a connection. The implementation will call - the overload of this function based on the `Socket` parameter - used to consruct the socket. When `Socket` is a user defined - type, and not a `boost::asio::ip::tcp::socket` or any - `boost::asio::ssl::stream`, callers are responsible for - providing a suitable overload of this function. - - @param role The role of the local endpoint - - @param socket The socket to tear down. - - @param ec Set to the error if any occurred. -*/ -template<class Socket> -void -teardown( - role_type role, - Socket& socket, - error_code& ec) -{ - boost::ignore_unused(role, socket, ec); -/* - If you are trying to use OpenSSL and this goes off, you need to - add an include for <boost/beast/websocket/ssl.hpp>. - - If you are creating an instance of beast::websocket::stream with your - own user defined type, you must provide an overload of teardown with - the corresponding signature (including the role_type). -*/ - static_assert(sizeof(Socket)==-1, - "Unknown Socket type in teardown."); -} - -/** Start tearing down a connection. - - This begins tearing down a connection asynchronously. - The implementation will call the overload of this function - based on the `Socket` parameter used to consruct the socket. - When `Stream` is a user defined type, and not a - `boost::asio::ip::tcp::socket` or any `boost::asio::ssl::stream`, - callers are responsible for providing a suitable overload - of this function. - - @param role The role of the local endpoint - - @param socket The socket to tear down. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error // result of operation - ); - @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 Socket, - class TeardownHandler> -void -async_teardown( - role_type role, - Socket& socket, - TeardownHandler&& handler) -{ - boost::ignore_unused(role, socket, handler); -/* - If you are trying to use OpenSSL and this goes off, you need to - add an include for <boost/beast/websocket/ssl.hpp>. - - If you are creating an instance of beast::websocket::stream with your - own user defined type, you must provide an overload of teardown with - the corresponding signature (including the role_type). -*/ - static_assert(sizeof(Socket)==-1, - "Unknown Socket type in async_teardown."); -} - -} // websocket - -//------------------------------------------------------------------------------ - -namespace websocket { - -/** Tear down a `boost::asio::ip::tcp::socket`. - - This tears down a connection. The implementation will call - the overload of this function based on the `Stream` parameter - used to consruct the socket. When `Stream` is a user defined - type, and not a `boost::asio::ip::tcp::socket` or any - `boost::asio::ssl::stream`, callers are responsible for - providing a suitable overload of this function. - - @param role The role of the local endpoint - - @param socket The socket to tear down. - - @param ec Set to the error if any occurred. -*/ -void -teardown( - role_type role, - boost::asio::ip::tcp::socket& socket, - error_code& ec); - -/** Start tearing down a `boost::asio::ip::tcp::socket`. - - This begins tearing down a connection asynchronously. - The implementation will call the overload of this function - based on the `Stream` parameter used to consruct the socket. - When `Stream` is a user defined type, and not a - `boost::asio::ip::tcp::socket` or any `boost::asio::ssl::stream`, - callers are responsible for providing a suitable overload - of this function. - - @param role The role of the local endpoint - - @param socket The socket to tear down. - - @param handler Invoked when the operation completes. - The handler may be moved or copied as needed. - The equivalent function signature of the handler must be: - @code void handler( - error_code const& error // result of operation - ); - @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 TeardownHandler> -void -async_teardown( - role_type role, - boost::asio::ip::tcp::socket& socket, - TeardownHandler&& handler); - -} // websocket -} // beast -} // boost - -#include <boost/beast/websocket/impl/teardown.ipp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib.hpp b/contrib/restricted/boost/boost/beast/zlib.hpp deleted file mode 100644 index 87ce609625..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib.hpp +++ /dev/null @@ -1,20 +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_ZLIB_HPP -#define BOOST_BEAST_ZLIB_HPP - -#include <boost/beast/core/detail/config.hpp> - -#include <boost/beast/zlib/deflate_stream.hpp> -#include <boost/beast/zlib/error.hpp> -#include <boost/beast/zlib/inflate_stream.hpp> -#include <boost/beast/zlib/zlib.hpp> - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib/deflate_stream.hpp b/contrib/restricted/boost/boost/beast/zlib/deflate_stream.hpp deleted file mode 100644 index f57a0a5042..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/deflate_stream.hpp +++ /dev/null @@ -1,404 +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_ZLIB_DEFLATE_STREAM_HPP -#define BOOST_BEAST_ZLIB_DEFLATE_STREAM_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/zlib/error.hpp> -#include <boost/beast/zlib/zlib.hpp> -#include <boost/beast/zlib/detail/deflate_stream.hpp> -#include <algorithm> -#include <cstdlib> -#include <cstdint> -#include <cstring> -#include <memory> - -namespace boost { -namespace beast { -namespace zlib { - -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -/** Raw deflate compressor. - - This is a port of zlib's "deflate" functionality to C++. -*/ -class deflate_stream - : private detail::deflate_stream -{ -public: - /** Construct a default deflate stream. - - Upon construction, the stream settings will be set - to these default values: - - @li `level = 6` - - @li `windowBits = 15` - - @li `memLevel = 8` - - @li `strategy = Strategy::normal` - - Although the stream is ready to be used immediately - after construction, any required internal buffers are - not dynamically allocated until needed. - */ - deflate_stream() - { - reset(6, 15, DEF_MEM_LEVEL, Strategy::normal); - } - - /** Reset the stream and compression settings. - - This function initializes the stream to the specified - compression settings. - - Although the stream is ready to be used immediately - after a reset, any required internal buffers are not - dynamically allocated until needed. - - @note Any unprocessed input or pending output from - previous calls are discarded. - */ - void - reset( - int level, - int windowBits, - int memLevel, - Strategy strategy) - { - doReset(level, windowBits, memLevel, strategy); - } - - /** Reset the stream without deallocating memory. - - This function performs the equivalent of calling `clear` - followed by `reset` with the same compression settings, - without deallocating the internal buffers. - - @note Any unprocessed input or pending output from - previous calls are discarded. - */ - void - reset() - { - doReset(); - } - - /** Clear the stream. - - This function resets the stream and frees all dynamically - allocated internal buffers. The compression settings are - left unchanged. - - @note Any unprocessed input or pending output from - previous calls are discarded. - */ - void - clear() - { - doClear(); - } - - /** Returns the upper limit on the size of a compressed block. - - This function makes a conservative estimate of the maximum number - of bytes needed to store the result of compressing a block of - data based on the current compression level and strategy. - - @param sourceLen The size of the uncompressed data. - - @return The maximum number of resulting compressed bytes. - */ - std::size_t - upper_bound(std::size_t sourceLen) const - { - return doUpperBound(sourceLen); - } - - /** Fine tune internal compression parameters. - - Compression parameters should only be tuned by someone who - understands the algorithm used by zlib's deflate for searching - for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit - for their specific input data. Read the deflate.c source code - (ZLib) for the meaning of the max_lazy, good_length, nice_length, - and max_chain parameters. - */ - void - tune( - int good_length, - int max_lazy, - int nice_length, - int max_chain) - { - doTune(good_length, max_lazy, nice_length, max_chain); - } - - /** Compress input and write output. - - This function compresses as much data as possible, and stops when - the input buffer becomes empty or the output buffer becomes full. - It may introduce some output latency (reading input without - producing any output) except when forced to flush. - - In each call, one or both of these actions are performed: - - @li Compress more input starting at `zs.next_in` and update - `zs.next_in` and `zs.avail_in` accordingly. If not all - input can be processed (because there is not enough room in - the output buffer), `zs.next_in` and `zs.avail_in` are updated - and processing will resume at this point for the next call. - - @li Provide more output starting at `zs.next_out` and update - `zs.next_out` and `zs.avail_out` accordingly. This action is - forced if the parameter flush is not `Flush::none`. Forcing - flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call, the application must ensure that at least one - of the actions is possible, by providing more input and/or - consuming more output, and updating `zs.avail_in` or `zs.avail_out` - accordingly; `zs.avail_out` should never be zero before the call. - The application can consume the compressed output when it wants, - for example when the output buffer is full (`zs.avail_out == 0`), - or after each call of `write`. If `write` returns no error - with zero `zs.avail_out`, it must be called again after making - room in the output buffer because there might be more output - pending. - - Normally the parameter flush is set to `Flush::none`, which allows - deflate to decide how much data to accumulate before producing - output, in order to maximize compression. - - If the parameter flush is set to `Flush::sync`, all pending output - is flushed to the output buffer and the output is aligned on a - byte boundary, so that the decompressor can get all input data - available so far. In particular `zs.avail_in` is zero after the - call if enough output space has been provided before the call. - Flushing may degrade compression for some compression algorithms - and so it should be used only when necessary. This completes the - current deflate block and follows it with an empty stored block - that is three bits plus filler bits to the next byte, followed - by the four bytes `{ 0x00, 0x00 0xff 0xff }`. - - If flush is set to `Flush::partial`, all pending output is flushed - to the output buffer, but the output is not aligned to a byte - boundary. All of the input data so far will be available to the - decompressor, as for Z_SYNC_FLUSH. This completes the current - deflate block and follows it with an empty fixed codes block that - is 10 bits long. This assures that enough bytes are output in order - for the decompressor to finish the block before the empty fixed - code block. - - If flush is set to `Flush::block`, a deflate block is completed - and emitted, as for `Flush::sync`, but the output is not aligned - on a byte boundary, and up to seven bits of the current block are - held to be written as the next byte after the next deflate block - is completed. In this case, the decompressor may not be provided - enough bits at this point in order to complete decompression of - the data provided so far to the compressor. It may need to wait - for the next block to be emitted. This is for advanced applications - that need to control the emission of deflate blocks. - - If flush is set to `Flush::full`, all output is flushed as with - `Flush::sync`, and the compression state is reset so that - decompression can restart from this point if previous compressed - data has been damaged or if random access is desired. Using - `Flush::full` too often can seriously degrade compression. - - If `write` returns with `zs.avail_out == 0`, this function must - be called again with the same value of the flush parameter and - more output space (updated `zs.avail_out`), until the flush is - complete (`write` returns with non-zero `zs.avail_out`). In the - case of a `Flush::full`or `Flush::sync`, make sure that - `zs.avail_out` is greater than six to avoid repeated flush markers - due to `zs.avail_out == 0` on return. - - If the parameter flush is set to `Flush::finish`, pending input - is processed, pending output is flushed and deflate returns the - error `error::end_of_stream` if there was enough output space; - if deflate returns with no error, this function must be called - again with `Flush::finish` and more output space (updated - `zs.avail_out`) but no more input data, until it returns the - error `error::end_of_stream` or another error. After `write` has - returned the `error::end_of_stream` error, the only possible - operations on the stream are to reset or destroy. - - `Flush::finish` can be used immediately after initialization - if all the compression is to be done in a single step. In this - case, `zs.avail_out` must be at least value returned by - `upper_bound` (see below). Then `write` is guaranteed to return - the `error::end_of_stream` error. If not enough output space - is provided, deflate will not return `error::end_of_stream`, - and it must be called again as described above. - - `write` returns no error if some progress has been made (more - input processed or more output produced), `error::end_of_stream` - if all input has been consumed and all output has been produced - (only when flush is set to `Flush::finish`), `error::stream_error` - if the stream state was inconsistent (for example if `zs.next_in` - or `zs.next_out` was `nullptr`), `error::need_buffers` if no - progress is possible (for example `zs.avail_in` or `zs.avail_out` - was zero). Note that `error::need_buffers` is not fatal, and - `write` can be called again with more input and more output space - to continue compressing. - */ - void - write( - z_params& zs, - Flush flush, - error_code& ec) - { - doWrite(zs, flush, ec); - } - - /** Update the compression level and strategy. - - This function dynamically updates the compression level and - compression strategy. The interpretation of level and strategy - is as in @ref reset. This can be used to switch between compression - and straight copy of the input data, or to switch to a different kind - of input data requiring a different strategy. If the compression level - is changed, the input available so far is compressed with the old level - (and may be flushed); the new level will take effect only at the next - call of @ref write. - - Before the call of `params`, the stream state must be set as for a - call of @ref write, since the currently available input may have to be - compressed and flushed. In particular, `zs.avail_out` must be non-zero. - - @return `Z_OK` if success, `Z_STREAM_ERROR` if the source stream state - was inconsistent or if a parameter was invalid, `error::need_buffers` - if `zs.avail_out` was zero. - */ - void - params( - z_params& zs, - int level, - Strategy strategy, - error_code& ec) - { - doParams(zs, level, strategy, ec); - } - - /** Return bits pending in the output. - - This function returns the number of bytes and bits of output - that have been generated, but not yet provided in the available - output. The bytes not provided would be due to the available - output space having being consumed. The number of bits of output - not provided are between 0 and 7, where they await more bits to - join them in order to fill out a full byte. If pending or bits - are `nullptr`, then those values are not set. - - @return `Z_OK` if success, or `Z_STREAM_ERROR` if the source - stream state was inconsistent. - */ - void - pending(unsigned *value, int *bits) - { - doPending(value, bits); - } - - /** Insert bits into the compressed output stream. - - This function inserts bits in the deflate output stream. The - intent is that this function is used to start off the deflate - output with the bits leftover from a previous deflate stream when - appending to it. As such, this function can only be used for raw - deflate, and must be used before the first `write` call after an - initialization. `bits` must be less than or equal to 16, and that - many of the least significant bits of `value` will be inserted in - the output. - - @return `error::need_buffers` if there was not enough room in - the internal buffer to insert the bits. - */ - void - prime(int bits, int value, error_code& ec) - { - return doPrime(bits, value, ec); - } -}; - -/** Returns the upper limit on the size of a compressed block. - - This function makes a conservative estimate of the maximum number - of bytes needed to store the result of compressing a block of - data. - - @param bytes The size of the uncompressed data. - - @return The maximum number of resulting compressed bytes. -*/ -std::size_t -deflate_upper_bound(std::size_t bytes); - -/* For the default windowBits of 15 and memLevel of 8, this function returns - a close to exact, as well as small, upper bound on the compressed size. - They are coded as constants here for a reason--if the #define's are - changed, then this function needs to be changed as well. The return - value for 15 and 8 only works for those exact settings. - - For any setting other than those defaults for windowBits and memLevel, - the value returned is a conservative worst case for the maximum expansion - resulting from using fixed blocks instead of stored blocks, which deflate - can emit on compressed data for some combinations of the parameters. - - This function could be more sophisticated to provide closer upper bounds for - every combination of windowBits and memLevel. But even the conservative - upper bound of about 14% expansion does not seem onerous for output buffer - allocation. -*/ -inline -std::size_t -deflate_upper_bound(std::size_t bytes) -{ - return bytes + - ((bytes + 7) >> 3) + - ((bytes + 63) >> 6) + 5 + - 6; -} - -} // zlib -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib/detail/bitstream.hpp b/contrib/restricted/boost/boost/beast/zlib/detail/bitstream.hpp deleted file mode 100644 index eca32bc424..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/detail/bitstream.hpp +++ /dev/null @@ -1,207 +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 -// -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef BOOST_BEAST_ZLIB_DETAIL_BITSTREAM_HPP -#define BOOST_BEAST_ZLIB_DETAIL_BITSTREAM_HPP - -#include <boost/assert.hpp> -#include <cstdint> -#include <iterator> - -namespace boost { -namespace beast { -namespace zlib { -namespace detail { - -class bitstream -{ - using value_type = std::uint32_t; - - value_type v_ = 0; - unsigned n_ = 0; - -public: - // returns the number of bits in the reservoir - unsigned - size() const - { - return n_; - } - - // discard n bits - void - drop(std::size_t n) - { - BOOST_ASSERT(n <= n_); - n_ -= static_cast<unsigned>(n); - v_ >>= n; - } - - // flush everything - void - flush() - { - n_ = 0; - v_ = 0; - } - - // flush to the next byte boundary - void - flush_byte() - { - drop(n_ % 8); - } - - // ensure at least n bits - template<class FwdIt> - bool - fill(std::size_t n, FwdIt& first, FwdIt const& last); - - // fill 8 bits, unchecked - template<class FwdIt> - void - fill_8(FwdIt& it); - - // fill 16 bits, unchecked - template<class FwdIt> - void - fill_16(FwdIt& it); - - // return n bits - template<class Unsigned> - void - peek(Unsigned& value, std::size_t n); - - // return everything in the reservoir - value_type - peek_fast() const - { - return v_; - } - - // return n bits, and consume - template<class Unsigned> - void - read(Unsigned& value, std::size_t n); - - // rewind by the number of whole bytes stored (unchecked) - template<class BidirIt> - void - rewind(BidirIt& it); -}; - -template<class FwdIt> -inline -bool -bitstream:: -fill(std::size_t n, FwdIt& first, FwdIt const& last) -{ - while(n_ < n) - { - if(first == last) - return false; - v_ += static_cast<value_type>(*first++) << n_; - n_ += 8; - } - return true; -} - -template<class FwdIt> -inline -void -bitstream:: -fill_8(FwdIt& it) -{ - v_ += static_cast<value_type>(*it++) << n_; - n_ += 8; -} - -template<class FwdIt> -inline -void -bitstream:: -fill_16(FwdIt& it) -{ - v_ += static_cast<value_type>(*it++) << n_; - n_ += 8; - v_ += static_cast<value_type>(*it++) << n_; - n_ += 8; -} - -template<class Unsigned> -inline -void -bitstream:: -peek(Unsigned& value, std::size_t n) -{ - BOOST_ASSERT(n <= sizeof(value)*8); - BOOST_ASSERT(n <= n_); - value = static_cast<Unsigned>( - v_ & ((1ULL << n) - 1)); -} - -template<class Unsigned> -inline -void -bitstream:: -read(Unsigned& value, std::size_t n) -{ - BOOST_ASSERT(n < sizeof(v_)*8); - BOOST_ASSERT(n <= n_); - value = static_cast<Unsigned>( - v_ & ((1ULL << n) - 1)); - v_ >>= n; - n_ -= static_cast<unsigned>(n); -} - -template<class BidirIt> -inline -void -bitstream:: -rewind(BidirIt& it) -{ - auto len = n_ >> 3; - it = std::prev(it, len); - n_ &= 7; - v_ &= (1U << n_) - 1; -} - -} // detail -} // zlib -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib/detail/deflate_stream.hpp b/contrib/restricted/boost/boost/beast/zlib/detail/deflate_stream.hpp deleted file mode 100644 index f0a91e8ad1..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/detail/deflate_stream.hpp +++ /dev/null @@ -1,3006 +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 -// -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef BOOST_BEAST_ZLIB_DETAIL_DEFLATE_STREAM_HPP -#define BOOST_BEAST_ZLIB_DETAIL_DEFLATE_STREAM_HPP - -#include <boost/beast/zlib/zlib.hpp> -#include <boost/beast/zlib/detail/ranges.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/assert.hpp> -#include <boost/config.hpp> -#include <boost/make_unique.hpp> -#include <boost/optional.hpp> -#include <boost/throw_exception.hpp> -#include <cstdint> -#include <cstdlib> -#include <cstring> -#include <memory> -#include <stdexcept> -#include <type_traits> - -namespace boost { -namespace beast { -namespace zlib { -namespace detail { - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://tools.ietf.org/html/rfc1951 - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -class deflate_stream -{ -protected: - // Upper limit on code length - static std::uint8_t constexpr maxBits = 15; - - // Number of length codes, not counting the special END_BLOCK code - static std::uint16_t constexpr lengthCodes = 29; - - // Number of literal bytes 0..255 - static std::uint16_t constexpr literals = 256; - - // Number of Literal or Length codes, including the END_BLOCK code - static std::uint16_t constexpr lCodes = literals + 1 + lengthCodes; - - // Number of distance code lengths - static std::uint16_t constexpr dCodes = 30; - - // Number of codes used to transfer the bit lengths - static std::uint16_t constexpr blCodes = 19; - - // Number of distance codes - static std::uint16_t constexpr distCodeLen = 512; - - // Size limit on bit length codes - static std::uint8_t constexpr maxBlBits= 7; - - static std::uint16_t constexpr minMatch = 3; - static std::uint16_t constexpr maxMatch = 258; - - // Can't change minMatch without also changing code, see original zlib - BOOST_STATIC_ASSERT(minMatch == 3); - - // end of block literal code - static std::uint16_t constexpr END_BLOCK = 256; - - // repeat previous bit length 3-6 times (2 bits of repeat count) - static std::uint8_t constexpr REP_3_6 = 16; - - // repeat a zero length 3-10 times (3 bits of repeat count) - static std::uint8_t constexpr REPZ_3_10 = 17; - - // repeat a zero length 11-138 times (7 bits of repeat count) - static std::uint8_t constexpr REPZ_11_138 = 18; - - // The three kinds of block type - static std::uint8_t constexpr STORED_BLOCK = 0; - static std::uint8_t constexpr STATIC_TREES = 1; - static std::uint8_t constexpr DYN_TREES = 2; - - // Maximum value for memLevel in deflateInit2 - static std::uint8_t constexpr max_mem_level = 9; - - // Default memLevel - static std::uint8_t constexpr DEF_MEM_LEVEL = max_mem_level; - - /* Note: the deflate() code requires max_lazy >= minMatch and max_chain >= 4 - For deflate_fast() (levels <= 3) good is ignored and lazy has a different - meaning. - */ - - // maximum heap size - static std::uint16_t constexpr HEAP_SIZE = 2 * lCodes + 1; - - // size of bit buffer in bi_buf - static std::uint8_t constexpr Buf_size = 16; - - // Matches of length 3 are discarded if their distance exceeds kTooFar - static std::size_t constexpr kTooFar = 4096; - - /* Minimum amount of lookahead, except at the end of the input file. - See deflate.c for comments about the minMatch+1. - */ - static std::size_t constexpr kMinLookahead = maxMatch + minMatch+1; - - /* Number of bytes after end of data in window to initialize in order - to avoid memory checker errors from longest match routines - */ - static std::size_t constexpr kWinInit = maxMatch; - - // Describes a single value and its code string. - struct ct_data - { - std::uint16_t fc; // frequency count or bit string - std::uint16_t dl; // parent node in tree or length of bit string - - bool - operator==(ct_data const& rhs) const - { - return fc == rhs.fc && dl == rhs.dl; - } - }; - - struct static_desc - { - ct_data const* static_tree;// static tree or NULL - std::uint8_t const* extra_bits; // extra bits for each code or NULL - std::uint16_t extra_base; // base index for extra_bits - std::uint16_t elems; // max number of elements in the tree - std::uint8_t max_length; // max bit length for the codes - }; - - struct lut_type - { - // Number of extra bits for each length code - std::uint8_t const extra_lbits[lengthCodes] = { - 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0 - }; - - // Number of extra bits for each distance code - std::uint8_t const extra_dbits[dCodes] = { - 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 - }; - - // Number of extra bits for each bit length code - std::uint8_t const extra_blbits[blCodes] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7 - }; - - // The lengths of the bit length codes are sent in order - // of decreasing probability, to avoid transmitting the - // lengths for unused bit length codes. - std::uint8_t const bl_order[blCodes] = { - 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 - }; - - ct_data ltree[lCodes + 2]; - - ct_data dtree[dCodes]; - - // Distance codes. The first 256 values correspond to the distances - // 3 .. 258, the last 256 values correspond to the top 8 bits of - // the 15 bit distances. - std::uint8_t dist_code[distCodeLen]; - - std::uint8_t length_code[maxMatch-minMatch+1]; - - std::uint8_t base_length[lengthCodes]; - - std::uint16_t base_dist[dCodes]; - - static_desc l_desc = { - ltree, extra_lbits, literals+1, lCodes, maxBits - }; - - static_desc d_desc = { - dtree, extra_dbits, 0, dCodes, maxBits - }; - - static_desc bl_desc = - { - nullptr, extra_blbits, 0, blCodes, maxBlBits - }; - }; - - struct tree_desc - { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - static_desc const* stat_desc; /* the corresponding static tree */ - }; - - enum block_state - { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ - }; - - // VFALCO This might not be needed, e.g. for zip/gzip - enum StreamStatus - { - EXTRA_STATE = 69, - NAME_STATE = 73, - COMMENT_STATE = 91, - HCRC_STATE = 103, - BUSY_STATE = 113, - FINISH_STATE = 666 - }; - - /* A std::uint16_t is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - using IPos = unsigned; - - using self = deflate_stream; - typedef block_state(self::*compress_func)(z_params& zs, Flush flush); - - //-------------------------------------------------------------------------- - - lut_type const& lut_; - - bool inited_ = false; - std::size_t buf_size_; - std::unique_ptr<std::uint8_t[]> buf_; - - int status_; // as the name implies - Byte* pending_buf_; // output still pending - std::uint32_t - pending_buf_size_; // size of pending_buf - Byte* pending_out_; // next pending byte to output to the stream - uInt pending_; // nb of bytes in the pending buffer - boost::optional<Flush> - last_flush_; // value of flush param for previous deflate call - - uInt w_size_; // LZ77 window size (32K by default) - uInt w_bits_; // log2(w_size) (8..16) - uInt w_mask_; // w_size - 1 - - /* Sliding window. Input bytes are read into the second half of the window, - and move to the first half later to keep a dictionary of at least wSize - bytes. With this organization, matches are limited to a distance of - wSize-maxMatch bytes, but this ensures that IO is always - performed with a length multiple of the block size. Also, it limits - the window size to 64K. - To do: use the user input buffer as sliding window. - */ - Byte *window_ = nullptr; - - /* Actual size of window: 2*wSize, except when the user input buffer - is directly used as sliding window. - */ - std::uint32_t window_size_; - - /* Link to older string with same hash index. To limit the size of this - array to 64K, this link is maintained only for the last 32K strings. - An index in this array is thus a window index modulo 32K. - */ - std::uint16_t* prev_; - - std::uint16_t* head_; // Heads of the hash chains or 0 - - uInt ins_h_; // hash index of string to be inserted - uInt hash_size_; // number of elements in hash table - uInt hash_bits_; // log2(hash_size) - uInt hash_mask_; // hash_size-1 - - /* Number of bits by which ins_h must be shifted at each input - step. It must be such that after minMatch steps, - the oldest byte no longer takes part in the hash key, that is: - hash_shift * minMatch >= hash_bits - */ - uInt hash_shift_; - - /* Window position at the beginning of the current output block. - Gets negative when the window is moved backwards. - */ - long block_start_; - - uInt match_length_; // length of best match - IPos prev_match_; // previous match - int match_available_; // set if previous match exists - uInt strstart_; // start of string to insert - uInt match_start_; // start of matching string - uInt lookahead_; // number of valid bytes ahead in window - - /* Length of the best match at previous step. Matches not greater - than this are discarded. This is used in the lazy match evaluation. - */ - uInt prev_length_; - - /* To speed up deflation, hash chains are never searched beyond - this length. A higher limit improves compression ratio but - degrades the speed. - */ - uInt max_chain_length_; - - /* Attempt to find a better match only when the current match is strictly - smaller than this value. This mechanism is used only for compression - levels >= 4. - - OR Insert new strings in the hash table only if the match length is not - greater than this length. This saves time but degrades compression. - used only for compression levels <= 3. - */ - uInt max_lazy_match_; - - int level_; // compression level (1..9) - Strategy strategy_; // favor or force Huffman coding - - // Use a faster search when the previous match is longer than this - uInt good_match_; - - int nice_match_; // Stop searching when current match exceeds this - - ct_data dyn_ltree_[ - HEAP_SIZE]; // literal and length tree - ct_data dyn_dtree_[ - 2*dCodes+1]; // distance tree - ct_data bl_tree_[ - 2*blCodes+1]; // Huffman tree for bit lengths - - tree_desc l_desc_; // desc. for literal tree - tree_desc d_desc_; // desc. for distance tree - tree_desc bl_desc_; // desc. for bit length tree - - // number of codes at each bit length for an optimal tree - std::uint16_t bl_count_[maxBits+1]; - - // Index within the heap array of least frequent node in the Huffman tree - static std::size_t constexpr kSmallest = 1; - - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. - heap[0] is not used. The same heap array is used to build all trees. - */ - - int heap_[2*lCodes+1]; // heap used to build the Huffman trees - int heap_len_; // number of elements in the heap - int heap_max_; // element of largest frequency - - // Depth of each subtree used as tie breaker for trees of equal frequency - std::uint8_t depth_[2*lCodes+1]; - - std::uint8_t *l_buf_; // buffer for literals or lengths - - /* Size of match buffer for literals/lengths. - There are 4 reasons for limiting lit_bufsize to 64K: - - frequencies can be kept in 16 bit counters - - if compression is not successful for the first block, all input - data is still in the window so we can still emit a stored block even - when input comes from standard input. (This can also be done for - all blocks if lit_bufsize is not greater than 32K.) - - if compression is not successful for a file smaller than 64K, we can - even emit a stored file instead of a stored block (saving 5 bytes). - This is applicable only for zip (not gzip or zlib). - - creating new Huffman trees less frequently may not provide fast - adaptation to changes in the input data statistics. (Take for - example a binary file with poorly compressible code followed by - a highly compressible string table.) Smaller buffer sizes give - fast adaptation but have of course the overhead of transmitting - trees more frequently. - - I can't count above 4 - */ - uInt lit_bufsize_; - uInt last_lit_; // running index in l_buf_ - - /* Buffer for distances. To simplify the code, d_buf_ and l_buf_ - have the same number of elements. To use different lengths, an - extra flag array would be necessary. - */ - std::uint16_t* d_buf_; - - std::uint32_t opt_len_; // bit length of current block with optimal trees - std::uint32_t static_len_; // bit length of current block with static trees - uInt matches_; // number of string matches in current block - uInt insert_; // bytes at end of window left to insert - - /* Output buffer. - Bits are inserted starting at the bottom (least significant bits). - */ - std::uint16_t bi_buf_; - - /* Number of valid bits in bi_buf._ All bits above the last valid - bit are always zero. - */ - int bi_valid_; - - /* High water mark offset in window for initialized bytes -- bytes - above this are set to zero in order to avoid memory check warnings - when longest match routines access bytes past the input. This is - then updated to the new high water mark. - */ - std::uint32_t high_water_; - - //-------------------------------------------------------------------------- - - deflate_stream() - : lut_(get_lut()) - { - } - - /* In order to simplify the code, particularly on 16 bit machines, match - distances are limited to MAX_DIST instead of WSIZE. - */ - std::size_t - max_dist() const - { - return w_size_ - kMinLookahead; - } - - void - put_byte(std::uint8_t c) - { - pending_buf_[pending_++] = c; - } - - void - put_short(std::uint16_t w) - { - put_byte(w & 0xff); - put_byte(w >> 8); - } - - /* Send a value on a given number of bits. - IN assertion: length <= 16 and value fits in length bits. - */ - void - send_bits(int value, int length) - { - if(bi_valid_ > (int)Buf_size - length) - { - bi_buf_ |= (std::uint16_t)value << bi_valid_; - put_short(bi_buf_); - bi_buf_ = (std::uint16_t)value >> (Buf_size - bi_valid_); - bi_valid_ += length - Buf_size; - } - else - { - bi_buf_ |= (std::uint16_t)(value) << bi_valid_; - bi_valid_ += length; - } - } - - // Send a code of the given tree - void - send_code(int value, ct_data const* tree) - { - send_bits(tree[value].fc, tree[value].dl); - } - - /* Mapping from a distance to a distance code. dist is the - distance - 1 and must not have side effects. _dist_code[256] - and _dist_code[257] are never used. - */ - std::uint8_t - d_code(unsigned dist) - { - if(dist < 256) - return lut_.dist_code[dist]; - return lut_.dist_code[256+(dist>>7)]; - } - - /* Update a hash value with the given input byte - IN assertion: all calls to to update_hash are made with - consecutive input characters, so that a running hash - key can be computed from the previous key instead of - complete recalculation each time. - */ - void - update_hash(uInt& h, std::uint8_t c) - { - h = ((h << hash_shift_) ^ c) & hash_mask_; - } - - /* Initialize the hash table (avoiding 64K overflow for 16 - bit systems). prev[] will be initialized on the fly. - */ - void - clear_hash() - { - head_[hash_size_-1] = 0; - std::memset((Byte *)head_, 0, - (unsigned)(hash_size_-1)*sizeof(*head_)); - } - - /* Compares two subtrees, using the tree depth as tie breaker - when the subtrees have equal frequency. This minimizes the - worst case length. - */ - bool - smaller(ct_data const* tree, int n, int m) - { - return tree[n].fc < tree[m].fc || - (tree[n].fc == tree[m].fc && - depth_[n] <= depth_[m]); - } - - /* Insert string str in the dictionary and set match_head to the - previous head of the hash chain (the most recent string with - same hash key). Return the previous length of the hash chain. - If this file is compiled with -DFASTEST, the compression level - is forced to 1, and no hash chains are maintained. - IN assertion: all calls to to INSERT_STRING are made with - consecutive input characters and the first minMatch - bytes of str are valid (except for the last minMatch-1 - bytes of the input file). - */ - void - insert_string(IPos& hash_head) - { - update_hash(ins_h_, window_[strstart_ + (minMatch-1)]); - hash_head = prev_[strstart_ & w_mask_] = head_[ins_h_]; - head_[ins_h_] = (std::uint16_t)strstart_; - } - - //-------------------------------------------------------------------------- - - /* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ - struct config - { - std::uint16_t good_length; /* reduce lazy search above this match length */ - std::uint16_t max_lazy; /* do not perform lazy search above this match length */ - std::uint16_t nice_length; /* quit search above this match length */ - std::uint16_t max_chain; - compress_func func; - - config( - std::uint16_t good_length_, - std::uint16_t max_lazy_, - std::uint16_t nice_length_, - std::uint16_t max_chain_, - compress_func func_) - : good_length(good_length_) - , max_lazy(max_lazy_) - , nice_length(nice_length_) - , max_chain(max_chain_) - , func(func_) - { - } - }; - - static - config - get_config(std::size_t level) - { - switch(level) - { - // good lazy nice chain - case 0: return { 0, 0, 0, 0, &self::deflate_stored}; // store only - case 1: return { 4, 4, 8, 4, &self::deflate_fast}; // max speed, no lazy matches - case 2: return { 4, 5, 16, 8, &self::deflate_fast}; - case 3: return { 4, 6, 32, 32, &self::deflate_fast}; - case 4: return { 4, 4, 16, 16, &self::deflate_slow}; // lazy matches - case 5: return { 8, 16, 32, 32, &self::deflate_slow}; - case 6: return { 8, 16, 128, 128, &self::deflate_slow}; - case 7: return { 8, 32, 128, 256, &self::deflate_slow}; - case 8: return { 32, 128, 258, 1024, &self::deflate_slow}; - default: - case 9: return { 32, 258, 258, 4096, &self::deflate_slow}; // max compression - } - } - - void - maybe_init() - { - if(! inited_) - init(); - } - - template<class Unsigned> - static - Unsigned - bi_reverse(Unsigned code, unsigned len); - - template<class = void> - static - void - gen_codes(ct_data *tree, int max_code, std::uint16_t *bl_count); - - template<class = void> - static - lut_type const& - get_lut(); - - template<class = void> void doReset (int level, int windowBits, int memLevel, Strategy strategy); - template<class = void> void doReset (); - template<class = void> void doClear (); - template<class = void> std::size_t doUpperBound (std::size_t sourceLen) const; - template<class = void> void doTune (int good_length, int max_lazy, int nice_length, int max_chain); - template<class = void> void doParams (z_params& zs, int level, Strategy strategy, error_code& ec); - template<class = void> void doWrite (z_params& zs, boost::optional<Flush> flush, error_code& ec); - template<class = void> void doDictionary (Byte const* dict, uInt dictLength, error_code& ec); - template<class = void> void doPrime (int bits, int value, error_code& ec); - template<class = void> void doPending (unsigned* value, int* bits); - - template<class = void> void init (); - template<class = void> void lm_init (); - template<class = void> void init_block (); - template<class = void> void pqdownheap (ct_data const* tree, int k); - template<class = void> void pqremove (ct_data const* tree, int& top); - template<class = void> void gen_bitlen (tree_desc *desc); - template<class = void> void build_tree (tree_desc *desc); - template<class = void> void scan_tree (ct_data *tree, int max_code); - template<class = void> void send_tree (ct_data *tree, int max_code); - template<class = void> int build_bl_tree (); - template<class = void> void send_all_trees (int lcodes, int dcodes, int blcodes); - template<class = void> void compress_block (ct_data const* ltree, ct_data const* dtree); - template<class = void> int detect_data_type (); - template<class = void> void bi_windup (); - template<class = void> void bi_flush (); - template<class = void> void copy_block (char *buf, unsigned len, int header); - - template<class = void> void tr_init (); - template<class = void> void tr_align (); - template<class = void> void tr_flush_bits (); - template<class = void> void tr_stored_block (char *bu, std::uint32_t stored_len, int last); - template<class = void> void tr_tally_dist (std::uint16_t dist, std::uint8_t len, bool& flush); - template<class = void> void tr_tally_lit (std::uint8_t c, bool& flush); - - template<class = void> void tr_flush_block (z_params& zs, char *buf, std::uint32_t stored_len, int last); - template<class = void> void fill_window (z_params& zs); - template<class = void> void flush_pending (z_params& zs); - template<class = void> void flush_block (z_params& zs, bool last); - template<class = void> int read_buf (z_params& zs, Byte *buf, unsigned size); - template<class = void> uInt longest_match (IPos cur_match); - - template<class = void> block_state f_stored (z_params& zs, Flush flush); - template<class = void> block_state f_fast (z_params& zs, Flush flush); - template<class = void> block_state f_slow (z_params& zs, Flush flush); - template<class = void> block_state f_rle (z_params& zs, Flush flush); - template<class = void> block_state f_huff (z_params& zs, Flush flush); - - block_state - deflate_stored(z_params& zs, Flush flush) - { - return f_stored(zs, flush); - } - - block_state - deflate_fast(z_params& zs, Flush flush) - { - return f_fast(zs, flush); - } - - block_state - deflate_slow(z_params& zs, Flush flush) - { - return f_slow(zs, flush); - } - - block_state - deflate_rle(z_params& zs, Flush flush) - { - return f_rle(zs, flush); - } - - block_state - deflate_huff(z_params& zs, Flush flush) - { - return f_huff(zs, flush); - } -}; - -//-------------------------------------------------------------------------- - -// Reverse the first len bits of a code -template<class Unsigned> -inline -Unsigned -deflate_stream:: -bi_reverse(Unsigned code, unsigned len) -{ - BOOST_STATIC_ASSERT(std::is_unsigned<Unsigned>::value); - BOOST_ASSERT(len <= 8 * sizeof(unsigned)); - Unsigned res = 0; - do - { - res |= code & 1; - code >>= 1; - res <<= 1; - } - while(--len > 0); - return res >> 1; -} - -/* Generate the codes for a given tree and bit counts (which need not be optimal). - IN assertion: the array bl_count contains the bit length statistics for - the given tree and the field len is set for all tree elements. - OUT assertion: the field code is set for all tree elements of non - zero code length. -*/ -template<class> -void -deflate_stream:: -gen_codes(ct_data *tree, int max_code, std::uint16_t *bl_count) -{ - std::uint16_t next_code[maxBits+1]; /* next code value for each bit length */ - std::uint16_t code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - // The distribution counts are first used to - // generate the code values without bit reversal. - for(bits = 1; bits <= maxBits; bits++) - { - code = (code + bl_count[bits-1]) << 1; - next_code[bits] = code; - } - // Check that the bit counts in bl_count are consistent. - // The last code must be all ones. - BOOST_ASSERT(code + bl_count[maxBits]-1 == (1<<maxBits)-1); - for(n = 0; n <= max_code; n++) - { - int len = tree[n].dl; - if(len == 0) - continue; - tree[n].fc = bi_reverse(next_code[len]++, len); - } -} - -template<class> -auto -deflate_stream::get_lut() -> - lut_type const& -{ - struct init - { - lut_type tables; - - init() - { - // number of codes at each bit length for an optimal tree - //std::uint16_t bl_count[maxBits+1]; - - // Initialize the mapping length (0..255) -> length code (0..28) - std::uint8_t length = 0; - for(std::uint8_t code = 0; code < lengthCodes-1; ++code) - { - tables.base_length[code] = length; - auto const run = 1U << tables.extra_lbits[code]; - for(unsigned n = 0; n < run; ++n) - tables.length_code[length++] = code; - } - BOOST_ASSERT(length == 0); - // Note that the length 255 (match length 258) can be represented - // in two different ways: code 284 + 5 bits or code 285, so we - // overwrite length_code[255] to use the best encoding: - tables.length_code[255] = lengthCodes-1; - - // Initialize the mapping dist (0..32K) -> dist code (0..29) - { - std::uint8_t code; - std::uint16_t dist = 0; - for(code = 0; code < 16; code++) - { - tables.base_dist[code] = dist; - auto const run = 1U << tables.extra_dbits[code]; - for(unsigned n = 0; n < run; ++n) - tables.dist_code[dist++] = code; - } - BOOST_ASSERT(dist == 256); - // from now on, all distances are divided by 128 - dist >>= 7; - for(; code < dCodes; ++code) - { - tables.base_dist[code] = dist << 7; - auto const run = 1U << (tables.extra_dbits[code]-7); - for(std::size_t n = 0; n < run; ++n) - tables.dist_code[256 + dist++] = code; - } - BOOST_ASSERT(dist == 256); - } - - // Construct the codes of the static literal tree - std::uint16_t bl_count[maxBits+1]; - std::memset(bl_count, 0, sizeof(bl_count)); - unsigned n = 0; - while (n <= 143) - tables.ltree[n++].dl = 8; - bl_count[8] += 144; - while (n <= 255) - tables.ltree[n++].dl = 9; - bl_count[9] += 112; - while (n <= 279) - tables.ltree[n++].dl = 7; - bl_count[7] += 24; - while (n <= 287) - tables.ltree[n++].dl = 8; - bl_count[8] += 8; - // Codes 286 and 287 do not exist, but we must include them in the tree - // construction to get a canonical Huffman tree (longest code all ones) - gen_codes(tables.ltree, lCodes+1, bl_count); - - for(n = 0; n < dCodes; ++n) - { - tables.dtree[n].dl = 5; - tables.dtree[n].fc = - static_cast<std::uint16_t>(bi_reverse(n, 5)); - } - } - }; - static init const data; - return data.tables; -} - -template<class> -void -deflate_stream:: -doReset( - int level, - int windowBits, - int memLevel, - Strategy strategy) -{ - if(level == default_size) - level = 6; - - // VFALCO What do we do about this? - // until 256-byte window bug fixed - if(windowBits == 8) - windowBits = 9; - - if(level < 0 || level > 9) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "invalid level"}); - - if(windowBits < 8 || windowBits > 15) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "invalid windowBits"}); - - if(memLevel < 1 || memLevel > max_mem_level) - BOOST_THROW_EXCEPTION(std::invalid_argument{ - "invalid memLevel"}); - - w_bits_ = windowBits; - - hash_bits_ = memLevel + 7; - - // 16K elements by default - lit_bufsize_ = 1 << (memLevel + 6); - - level_ = level; - strategy_ = strategy; - inited_ = false; -} - -template<class> -void -deflate_stream:: -doReset() -{ - inited_ = false; -} - -template<class> -void -deflate_stream:: -doClear() -{ - inited_ = false; - buf_.reset(); -} - -template<class> -std::size_t -deflate_stream:: -doUpperBound(std::size_t sourceLen) const -{ - std::size_t complen; - std::size_t wraplen; - - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; - - /* compute wrapper length */ - wraplen = 0; - - /* if not default parameters, return conservative bound */ - if(w_bits_ != 15 || hash_bits_ != 8 + 7) - return complen + wraplen; - - /* default settings: return tight bound for that case */ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13 - 6 + wraplen; -} - -template<class> -void -deflate_stream:: -doTune( - int good_length, - int max_lazy, - int nice_length, - int max_chain) -{ - good_match_ = good_length; - nice_match_ = nice_length; - max_lazy_match_ = max_lazy; - max_chain_length_ = max_chain; -} - -template<class> -void -deflate_stream:: -doParams(z_params& zs, int level, Strategy strategy, error_code& ec) -{ - compress_func func; - - if(level == default_size) - level = 6; - if(level < 0 || level > 9) - { - ec = error::stream_error; - return; - } - func = get_config(level_).func; - - if((strategy != strategy_ || func != get_config(level).func) && - zs.total_in != 0) - { - // Flush the last buffer: - doWrite(zs, Flush::block, ec); - if(ec == error::need_buffers && pending_ == 0) - ec.assign(0, ec.category()); - } - if(level_ != level) - { - level_ = level; - max_lazy_match_ = get_config(level).max_lazy; - good_match_ = get_config(level).good_length; - nice_match_ = get_config(level).nice_length; - max_chain_length_ = get_config(level).max_chain; - } - strategy_ = strategy; -} - -// VFALCO boost::optional param is a workaround for -// gcc "maybe uninitialized" warning -// https://github.com/boostorg/beast/issues/532 -// -template<class> -void -deflate_stream:: -doWrite(z_params& zs, boost::optional<Flush> flush, error_code& ec) -{ - maybe_init(); - - if(zs.next_out == 0 || (zs.next_in == 0 && zs.avail_in != 0) || - (status_ == FINISH_STATE && flush != Flush::finish)) - { - ec = error::stream_error; - return; - } - if(zs.avail_out == 0) - { - ec = error::need_buffers; - return; - } - - // value of flush param for previous deflate call - auto old_flush = boost::make_optional<Flush>( - last_flush_.is_initialized(), - last_flush_ ? *last_flush_ : Flush::none); - - last_flush_ = flush; - - // Flush as much pending output as possible - if(pending_ != 0) - { - flush_pending(zs); - if(zs.avail_out == 0) - { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - last_flush_ = boost::none; - return; - } - } - else if(zs.avail_in == 0 && ( - old_flush && flush <= *old_flush - ) && flush != Flush::finish) - { - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Flush::finish, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - ec = error::need_buffers; - return; - } - - // User must not provide more input after the first FINISH: - if(status_ == FINISH_STATE && zs.avail_in != 0) - { - ec = error::need_buffers; - return; - } - - /* Start a new block or continue the current one. - */ - if(zs.avail_in != 0 || lookahead_ != 0 || - (flush != Flush::none && status_ != FINISH_STATE)) - { - block_state bstate; - - switch(strategy_) - { - case Strategy::huffman: - bstate = deflate_huff(zs, flush.get()); - break; - case Strategy::rle: - bstate = deflate_rle(zs, flush.get()); - break; - default: - { - bstate = (this->*(get_config(level_).func))(zs, flush.get()); - break; - } - } - - if(bstate == finish_started || bstate == finish_done) - { - status_ = FINISH_STATE; - } - if(bstate == need_more || bstate == finish_started) - { - if(zs.avail_out == 0) - { - last_flush_ = boost::none; /* avoid BUF_ERROR next call, see above */ - } - return; - /* If flush != Flush::none && avail_out == 0, the next call - of deflate should use the same flush parameter to make sure - that the flush is complete. So we don't have to output an - empty block here, this will be done at next call. This also - ensures that for a very small output buffer, we emit at most - one empty block. - */ - } - if(bstate == block_done) - { - if(flush == Flush::partial) - { - tr_align(); - } - else if(flush != Flush::block) - { - /* FULL_FLUSH or SYNC_FLUSH */ - tr_stored_block((char*)0, 0L, 0); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if(flush == Flush::full) - { - clear_hash(); // forget history - if(lookahead_ == 0) - { - strstart_ = 0; - block_start_ = 0L; - insert_ = 0; - } - } - } - flush_pending(zs); - if(zs.avail_out == 0) - { - last_flush_ = boost::none; /* avoid BUF_ERROR at next call, see above */ - return; - } - } - } - - if(flush == Flush::finish) - { - ec = error::end_of_stream; - return; - } -} - -// VFALCO Warning: untested -template<class> -void -deflate_stream:: -doDictionary(Byte const* dict, uInt dictLength, error_code& ec) -{ - if(lookahead_) - { - ec = error::stream_error; - return; - } - - maybe_init(); - - /* if dict would fill window, just replace the history */ - if(dictLength >= w_size_) - { - clear_hash(); - strstart_ = 0; - block_start_ = 0L; - insert_ = 0; - dict += dictLength - w_size_; /* use the tail */ - dictLength = w_size_; - } - - /* insert dict into window and hash */ - z_params zs; - zs.avail_in = dictLength; - zs.next_in = (const Byte *)dict; - zs.avail_out = 0; - zs.next_out = 0; - fill_window(zs); - while(lookahead_ >= minMatch) - { - uInt str = strstart_; - uInt n = lookahead_ - (minMatch-1); - do - { - update_hash(ins_h_, window_[str + minMatch-1]); - prev_[str & w_mask_] = head_[ins_h_]; - head_[ins_h_] = (std::uint16_t)str; - str++; - } - while(--n); - strstart_ = str; - lookahead_ = minMatch-1; - fill_window(zs); - } - strstart_ += lookahead_; - block_start_ = (long)strstart_; - insert_ = lookahead_; - lookahead_ = 0; - match_length_ = prev_length_ = minMatch-1; - match_available_ = 0; -} - -template<class> -void -deflate_stream:: -doPrime(int bits, int value, error_code& ec) -{ - maybe_init(); - - if((Byte *)(d_buf_) < pending_out_ + ((Buf_size + 7) >> 3)) - { - ec = error::need_buffers; - return; - } - - do - { - int put = Buf_size - bi_valid_; - if(put > bits) - put = bits; - bi_buf_ |= (std::uint16_t)((value & ((1 << put) - 1)) << bi_valid_); - bi_valid_ += put; - tr_flush_bits(); - value >>= put; - bits -= put; - } - while(bits); -} - -template<class> -void -deflate_stream:: -doPending(unsigned* value, int* bits) -{ - if(value != 0) - *value = pending_; - if(bits != 0) - *bits = bi_valid_; -} - -//-------------------------------------------------------------------------- - -// Do lazy initialization -template<class> -void -deflate_stream:: -init() -{ - // Caller must set these: - // w_bits_ - // hash_bits_ - // lit_bufsize_ - // level_ - // strategy_ - - w_size_ = 1 << w_bits_; - w_mask_ = w_size_ - 1; - - hash_size_ = 1 << hash_bits_; - hash_mask_ = hash_size_ - 1; - hash_shift_ = ((hash_bits_+minMatch-1)/minMatch); - - auto const nwindow = w_size_ * 2*sizeof(Byte); - auto const nprev = w_size_ * sizeof(std::uint16_t); - auto const nhead = hash_size_ * sizeof(std::uint16_t); - auto const noverlay = lit_bufsize_ * (sizeof(std::uint16_t)+2); - auto const needed = nwindow + nprev + nhead + noverlay; - - if(! buf_ || buf_size_ != needed) - { - buf_ = boost::make_unique_noinit< - std::uint8_t[]>(needed); - buf_size_ = needed; - } - - window_ = reinterpret_cast<Byte*>(buf_.get()); - prev_ = reinterpret_cast<std::uint16_t*>(buf_.get() + nwindow); - head_ = reinterpret_cast<std::uint16_t*>(buf_.get() + nwindow + nprev); - - /* We overlay pending_buf_ and d_buf_ + l_buf_. This works - since the average output size for(length, distance) - codes is <= 24 bits. - */ - auto overlay = reinterpret_cast<std::uint16_t*>( - buf_.get() + nwindow + nprev + nhead); - - // nothing written to window_ yet - high_water_ = 0; - - pending_buf_ = - reinterpret_cast<std::uint8_t*>(overlay); - pending_buf_size_ = - static_cast<std::uint32_t>(lit_bufsize_) * - (sizeof(std::uint16_t) + 2L); - - d_buf_ = overlay + lit_bufsize_ / sizeof(std::uint16_t); - l_buf_ = pending_buf_ + (1 + sizeof(std::uint16_t)) * lit_bufsize_; - - pending_ = 0; - pending_out_ = pending_buf_; - - status_ = BUSY_STATE; - last_flush_ = Flush::none; - - tr_init(); - lm_init(); - - inited_ = true; -} - -/* Initialize the "longest match" routines for a new zlib stream -*/ -template<class> -void -deflate_stream:: -lm_init() -{ - window_size_ = (std::uint32_t)2L*w_size_; - - clear_hash(); - - /* Set the default configuration parameters: - */ - // VFALCO TODO just copy the config struct - max_lazy_match_ = get_config(level_).max_lazy; - good_match_ = get_config(level_).good_length; - nice_match_ = get_config(level_).nice_length; - max_chain_length_ = get_config(level_).max_chain; - - strstart_ = 0; - block_start_ = 0L; - lookahead_ = 0; - insert_ = 0; - match_length_ = prev_length_ = minMatch-1; - match_available_ = 0; - ins_h_ = 0; -} - -// Initialize a new block. -// -template<class> -void -deflate_stream:: -init_block() -{ - for(int n = 0; n < lCodes; n++) - dyn_ltree_[n].fc = 0; - for(int n = 0; n < dCodes; n++) - dyn_dtree_[n].fc = 0; - for(int n = 0; n < blCodes; n++) - bl_tree_[n].fc = 0; - dyn_ltree_[END_BLOCK].fc = 1; - opt_len_ = 0L; - static_len_ = 0L; - last_lit_ = 0; - matches_ = 0; -} - -/* Restore the heap property by moving down the tree starting at node k, - exchanging a node with the smallest of its two sons if necessary, - stopping when the heap property is re-established (each father smaller - than its two sons). -*/ -template<class> -void -deflate_stream:: -pqdownheap( - ct_data const* tree, // the tree to restore - int k) // node to move down -{ - int v = heap_[k]; - int j = k << 1; // left son of k - while(j <= heap_len_) - { - // Set j to the smallest of the two sons: - if(j < heap_len_ && - smaller(tree, heap_[j+1], heap_[j])) - j++; - // Exit if v is smaller than both sons - if(smaller(tree, v, heap_[j])) - break; - - // Exchange v with the smallest son - heap_[k] = heap_[j]; - k = j; - - // And continue down the tree, - // setting j to the left son of k - j <<= 1; - } - heap_[k] = v; -} - -/* Remove the smallest element from the heap and recreate the heap - with one less element. Updates heap and heap_len. -*/ -template<class> -inline -void -deflate_stream:: -pqremove(ct_data const* tree, int& top) -{ - top = heap_[kSmallest]; - heap_[kSmallest] = heap_[heap_len_--]; - pqdownheap(tree, kSmallest); -} - -/* Compute the optimal bit lengths for a tree and update the total bit length - for the current block. - IN assertion: the fields freq and dad are set, heap[heap_max] and - above are the tree nodes sorted by increasing frequency. - OUT assertions: the field len is set to the optimal bit length, the - array bl_count contains the frequencies for each bit length. - The length opt_len is updated; static_len is also updated if stree is - not null. -*/ -template<class> -void -deflate_stream:: -gen_bitlen(tree_desc *desc) -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - ct_data const* stree = desc->stat_desc->static_tree; - std::uint8_t const *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; // heap index - int n, m; // iterate over the tree elements - int bits; // bit length - int xbits; // extra bits - std::uint16_t f; // frequency - int overflow = 0; // number of elements with bit length too large - - std::fill(&bl_count_[0], &bl_count_[maxBits+1], std::uint16_t{0}); - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[heap_[heap_max_]].dl = 0; // root of the heap - - for(h = heap_max_+1; h < HEAP_SIZE; h++) { - n = heap_[h]; - bits = tree[tree[n].dl].dl + 1; - if(bits > max_length) bits = max_length, overflow++; - // We overwrite tree[n].dl which is no longer needed - tree[n].dl = (std::uint16_t)bits; - - if(n > max_code) - continue; // not a leaf node - - bl_count_[bits]++; - xbits = 0; - if(n >= base) - xbits = extra[n-base]; - f = tree[n].fc; - opt_len_ += (std::uint32_t)f * (bits + xbits); - if(stree) - static_len_ += (std::uint32_t)f * (stree[n].dl + xbits); - } - if(overflow == 0) - return; - - // Find the first bit length which could increase: - do - { - bits = max_length-1; - while(bl_count_[bits] == 0) - bits--; - bl_count_[bits]--; // move one leaf down the tree - bl_count_[bits+1] += 2; // move one overflow item as its brother - bl_count_[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } - while(overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for(bits = max_length; bits != 0; bits--) - { - n = bl_count_[bits]; - while(n != 0) - { - m = heap_[--h]; - if(m > max_code) - continue; - if((unsigned) tree[m].dl != (unsigned) bits) - { - opt_len_ += ((long)bits - (long)tree[m].dl) *(long)tree[m].fc; - tree[m].dl = (std::uint16_t)bits; - } - n--; - } - } -} - -/* Construct one Huffman tree and assigns the code bit strings and lengths. - Update the total bit length for the current block. - IN assertion: the field freq is set for all tree elements. - OUT assertions: the fields len and code are set to the optimal bit length - and corresponding code. The length opt_len is updated; static_len is - also updated if stree is not null. The field max_code is set. -*/ -template<class> -void -deflate_stream:: -build_tree(tree_desc *desc) -{ - ct_data *tree = desc->dyn_tree; - ct_data const* stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; // iterate over heap elements - int max_code = -1; // largest code with non zero frequency - int node; // new node being created - - /* Construct the initial heap, with least frequent element in - * heap[kSmallest]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - heap_len_ = 0; - heap_max_ = HEAP_SIZE; - - for(n = 0; n < elems; n++) - { - if(tree[n].fc != 0) - { - heap_[++(heap_len_)] = max_code = n; - depth_[n] = 0; - } - else - { - tree[n].dl = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while(heap_len_ < 2) - { - node = heap_[++(heap_len_)] = (max_code < 2 ? ++max_code : 0); - tree[node].fc = 1; - depth_[node] = 0; - opt_len_--; - if(stree) - static_len_ -= stree[node].dl; - // node is 0 or 1 so it does not have extra bits - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for(n = heap_len_/2; n >= 1; n--) - pqdownheap(tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do - { - pqremove(tree, n); /* n = node of least frequency */ - m = heap_[kSmallest]; /* m = node of next least frequency */ - - heap_[--(heap_max_)] = n; /* keep the nodes sorted by frequency */ - heap_[--(heap_max_)] = m; - - /* Create a new node father of n and m */ - tree[node].fc = tree[n].fc + tree[m].fc; - depth_[node] = (std::uint8_t)((depth_[n] >= depth_[m] ? - depth_[n] : depth_[m]) + 1); - tree[n].dl = tree[m].dl = (std::uint16_t)node; - /* and insert the new node in the heap */ - heap_[kSmallest] = node++; - pqdownheap(tree, kSmallest); - - } - while(heap_len_ >= 2); - - heap_[--(heap_max_)] = heap_[kSmallest]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen((tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, bl_count_); -} - -/* Scan a literal or distance tree to determine the frequencies - of the codes in the bit length tree. -*/ -template<class> -void -deflate_stream:: -scan_tree( - ct_data *tree, // the tree to be scanned - int max_code) // and its largest code of non zero frequency -{ - int n; // iterates over all tree elements - int prevlen = -1; // last emitted length - int curlen; // length of current code - int nextlen = tree[0].dl; // length of next code - std::uint16_t count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - if(nextlen == 0) - { - max_count = 138; - min_count = 3; - } - tree[max_code+1].dl = (std::uint16_t)0xffff; // guard - - for(n = 0; n <= max_code; n++) - { - curlen = nextlen; nextlen = tree[n+1].dl; - if(++count < max_count && curlen == nextlen) - { - continue; - } - else if(count < min_count) - { - bl_tree_[curlen].fc += count; - } - else if(curlen != 0) - { - if(curlen != prevlen) bl_tree_[curlen].fc++; - bl_tree_[REP_3_6].fc++; - } - else if(count <= 10) - { - bl_tree_[REPZ_3_10].fc++; - } - else - { - bl_tree_[REPZ_11_138].fc++; - } - count = 0; - prevlen = curlen; - if(nextlen == 0) - { - max_count = 138; - min_count = 3; - } - else if(curlen == nextlen) - { - max_count = 6; - min_count = 3; - } - else - { - max_count = 7; - min_count = 4; - } - } -} - -/* Send a literal or distance tree in compressed form, - using the codes in bl_tree. -*/ -template<class> -void -deflate_stream:: -send_tree( - ct_data *tree, // the tree to be scanned - int max_code) // and its largest code of non zero frequency -{ - int n; // iterates over all tree elements - int prevlen = -1; // last emitted length - int curlen; // length of current code - int nextlen = tree[0].dl; // length of next code - int count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - // tree[max_code+1].dl = -1; // guard already set - if(nextlen == 0) - { - max_count = 138; - min_count = 3; - } - - for(n = 0; n <= max_code; n++) - { - curlen = nextlen; - nextlen = tree[n+1].dl; - if(++count < max_count && curlen == nextlen) - { - continue; - } - else if(count < min_count) - { - do - { - send_code(curlen, bl_tree_); - } - while (--count != 0); - } - else if(curlen != 0) - { - if(curlen != prevlen) - { - send_code(curlen, bl_tree_); - count--; - } - BOOST_ASSERT(count >= 3 && count <= 6); - send_code(REP_3_6, bl_tree_); - send_bits(count-3, 2); - } - else if(count <= 10) - { - send_code(REPZ_3_10, bl_tree_); - send_bits(count-3, 3); - } - else - { - send_code(REPZ_11_138, bl_tree_); - send_bits(count-11, 7); - } - count = 0; - prevlen = curlen; - if(nextlen == 0) - { - max_count = 138; - min_count = 3; - } - else if(curlen == nextlen) - { - max_count = 6; - min_count = 3; - } - else - { - max_count = 7; - min_count = 4; - } - } -} - -/* Construct the Huffman tree for the bit lengths and return - the index in bl_order of the last bit length code to send. -*/ -template<class> -int -deflate_stream:: -build_bl_tree() -{ - int max_blindex; // index of last bit length code of non zero freq - - // Determine the bit length frequencies for literal and distance trees - scan_tree((ct_data *)dyn_ltree_, l_desc_.max_code); - scan_tree((ct_data *)dyn_dtree_, d_desc_.max_code); - - // Build the bit length tree: - build_tree((tree_desc *)(&(bl_desc_))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for(max_blindex = blCodes-1; max_blindex >= 3; max_blindex--) - { - if(bl_tree_[lut_.bl_order[max_blindex]].dl != 0) - break; - } - // Update opt_len to include the bit length tree and counts - opt_len_ += 3*(max_blindex+1) + 5+5+4; - return max_blindex; -} - -/* Send the header for a block using dynamic Huffman trees: the counts, - the lengths of the bit length codes, the literal tree and the distance - tree. - IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. -*/ -template<class> -void -deflate_stream:: -send_all_trees( - int lcodes, - int dcodes, - int blcodes) // number of codes for each tree -{ - int rank; // index in bl_order - - BOOST_ASSERT(lcodes >= 257 && dcodes >= 1 && blcodes >= 4); - BOOST_ASSERT(lcodes <= lCodes && dcodes <= dCodes && blcodes <= blCodes); - send_bits(lcodes-257, 5); // not +255 as stated in appnote.txt - send_bits(dcodes-1, 5); - send_bits(blcodes-4, 4); // not -3 as stated in appnote.txt - for(rank = 0; rank < blcodes; rank++) - send_bits(bl_tree_[lut_.bl_order[rank]].dl, 3); - send_tree((ct_data *)dyn_ltree_, lcodes-1); // literal tree - send_tree((ct_data *)dyn_dtree_, dcodes-1); // distance tree -} - -/* Send the block data compressed using the given Huffman trees -*/ -template<class> -void -deflate_stream:: -compress_block( - ct_data const* ltree, // literal tree - ct_data const* dtree) // distance tree -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if(last_lit_ != 0) - { - do - { - dist = d_buf_[lx]; - lc = l_buf_[lx++]; - if(dist == 0) - { - send_code(lc, ltree); /* send a literal byte */ - } - else - { - /* Here, lc is the match length - minMatch */ - code = lut_.length_code[lc]; - send_code(code+literals+1, ltree); /* send the length code */ - extra = lut_.extra_lbits[code]; - if(extra != 0) - { - lc -= lut_.base_length[code]; - send_bits(lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - BOOST_ASSERT(code < dCodes); - - send_code(code, dtree); /* send the distance code */ - extra = lut_.extra_dbits[code]; - if(extra != 0) - { - dist -= lut_.base_dist[code]; - send_bits(dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - BOOST_ASSERT((uInt)(pending_) < lit_bufsize_ + 2*lx); - } - while(lx < last_lit_); - } - - send_code(END_BLOCK, ltree); -} - -/* Check if the data type is TEXT or BINARY, using the following algorithm: - - TEXT if the two conditions below are satisfied: - a) There are no non-portable control characters belonging to the - "black list" (0..6, 14..25, 28..31). - b) There is at least one printable character belonging to the - "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - - BINARY otherwise. - - The following partially-portable control characters form a - "gray list" that is ignored in this detection algorithm: - (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - IN assertion: the fields fc of dyn_ltree are set. -*/ -template<class> -int -deflate_stream:: -detect_data_type() -{ - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - unsigned long black_mask = 0xf3ffc07fUL; - int n; - - // Check for non-textual ("black-listed") bytes. - for(n = 0; n <= 31; n++, black_mask >>= 1) - if((black_mask & 1) && (dyn_ltree_[n].fc != 0)) - return binary; - - // Check for textual ("white-listed") bytes. */ - if(dyn_ltree_[9].fc != 0 || dyn_ltree_[10].fc != 0 - || dyn_ltree_[13].fc != 0) - return text; - for(n = 32; n < literals; n++) - if(dyn_ltree_[n].fc != 0) - return text; - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return binary; -} - -/* Flush the bit buffer and align the output on a byte boundary -*/ -template<class> -void -deflate_stream:: -bi_windup() -{ - if(bi_valid_ > 8) - put_short(bi_buf_); - else if(bi_valid_ > 0) - put_byte((Byte)bi_buf_); - bi_buf_ = 0; - bi_valid_ = 0; -} - -/* Flush the bit buffer, keeping at most 7 bits in it. -*/ -template<class> -void -deflate_stream:: -bi_flush() -{ - if(bi_valid_ == 16) - { - put_short(bi_buf_); - bi_buf_ = 0; - bi_valid_ = 0; - } - else if(bi_valid_ >= 8) - { - put_byte((Byte)bi_buf_); - bi_buf_ >>= 8; - bi_valid_ -= 8; - } -} - -/* Copy a stored block, storing first the length and its - one's complement if requested. -*/ -template<class> -void -deflate_stream:: -copy_block( - char *buf, // the input data - unsigned len, // its length - int header) // true if block header must be written -{ - bi_windup(); // align on byte boundary - - if(header) - { - put_short((std::uint16_t)len); - put_short((std::uint16_t)~len); - } - // VFALCO Use memcpy? - while (len--) - put_byte(*buf++); -} - -//------------------------------------------------------------------------------ - -/* Initialize the tree data structures for a new zlib stream. -*/ -template<class> -void -deflate_stream:: -tr_init() -{ - l_desc_.dyn_tree = dyn_ltree_; - l_desc_.stat_desc = &lut_.l_desc; - - d_desc_.dyn_tree = dyn_dtree_; - d_desc_.stat_desc = &lut_.d_desc; - - bl_desc_.dyn_tree = bl_tree_; - bl_desc_.stat_desc = &lut_.bl_desc; - - bi_buf_ = 0; - bi_valid_ = 0; - - // Initialize the first block of the first file: - init_block(); -} - -/* Send one empty static block to give enough lookahead for inflate. - This takes 10 bits, of which 7 may remain in the bit buffer. -*/ -template<class> -void -deflate_stream:: -tr_align() -{ - send_bits(STATIC_TREES<<1, 3); - send_code(END_BLOCK, lut_.ltree); - bi_flush(); -} - -/* Flush the bits in the bit buffer to pending output (leaves at most 7 bits) -*/ -template<class> -void -deflate_stream:: -tr_flush_bits() -{ - bi_flush(); -} - -/* Send a stored block -*/ -template<class> -void -deflate_stream:: -tr_stored_block( - char *buf, // input block - std::uint32_t stored_len, // length of input block - int last) // one if this is the last block for a file -{ - send_bits((STORED_BLOCK<<1)+last, 3); // send block type - copy_block(buf, (unsigned)stored_len, 1); // with header -} - -template<class> -inline -void -deflate_stream:: -tr_tally_dist(std::uint16_t dist, std::uint8_t len, bool& flush) -{ - d_buf_[last_lit_] = dist; - l_buf_[last_lit_++] = len; - dist--; - dyn_ltree_[lut_.length_code[len]+literals+1].fc++; - dyn_dtree_[d_code(dist)].fc++; - flush = (last_lit_ == lit_bufsize_-1); -} - -template<class> -inline -void -deflate_stream:: -tr_tally_lit(std::uint8_t c, bool& flush) -{ - d_buf_[last_lit_] = 0; - l_buf_[last_lit_++] = c; - dyn_ltree_[c].fc++; - flush = (last_lit_ == lit_bufsize_-1); -} - -//------------------------------------------------------------------------------ - -/* Determine the best encoding for the current block: dynamic trees, - static trees or store, and output the encoded block to the zip file. -*/ -template<class> -void -deflate_stream:: -tr_flush_block( - z_params& zs, - char *buf, // input block, or NULL if too old - std::uint32_t stored_len, // length of input block - int last) // one if this is the last block for a file -{ - std::uint32_t opt_lenb; - std::uint32_t static_lenb; // opt_len and static_len in bytes - int max_blindex = 0; // index of last bit length code of non zero freq - - // Build the Huffman trees unless a stored block is forced - if(level_ > 0) - { - // Check if the file is binary or text - if(zs.data_type == unknown) - zs.data_type = detect_data_type(); - - // Construct the literal and distance trees - build_tree((tree_desc *)(&(l_desc_))); - - build_tree((tree_desc *)(&(d_desc_))); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (opt_len_+3+7)>>3; - static_lenb = (static_len_+3+7)>>3; - - if(static_lenb <= opt_lenb) - opt_lenb = static_lenb; - } - else - { - // VFALCO This assertion fails even in the original ZLib, - // happens with strategy == Z_HUFFMAN_ONLY, see: - // https://github.com/madler/zlib/issues/172 - - #if 0 - BOOST_ASSERT(buf); - #endif - opt_lenb = static_lenb = stored_len + 5; // force a stored block - } - -#ifdef FORCE_STORED - if(buf != (char*)0) { /* force stored block */ -#else - if(stored_len+4 <= opt_lenb && buf != (char*)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - tr_stored_block(buf, stored_len, last); - -#ifdef FORCE_STATIC - } - else if(static_lenb >= 0) - { - // force static trees -#else - } - else if(strategy_ == Strategy::fixed || static_lenb == opt_lenb) - { -#endif - send_bits((STATIC_TREES<<1)+last, 3); - compress_block(lut_.ltree, lut_.dtree); - } - else - { - send_bits((DYN_TREES<<1)+last, 3); - send_all_trees(l_desc_.max_code+1, d_desc_.max_code+1, - max_blindex+1); - compress_block((const ct_data *)dyn_ltree_, - (const ct_data *)dyn_dtree_); - } - /* The above check is made mod 2^32, for files larger than 512 MB - * and std::size_t implemented on 32 bits. - */ - init_block(); - - if(last) - bi_windup(); -} - -template<class> -void -deflate_stream:: -fill_window(z_params& zs) -{ - unsigned n, m; - unsigned more; // Amount of free space at the end of the window. - std::uint16_t *p; - uInt wsize = w_size_; - - do - { - more = (unsigned)(window_size_ - - (std::uint32_t)lookahead_ -(std::uint32_t)strstart_); - - // VFALCO We don't support systems below 32-bit - #if 0 - // Deal with !@#$% 64K limit: - if(sizeof(int) <= 2) - { - if(more == 0 && strstart_ == 0 && lookahead_ == 0) - { - more = wsize; - } - else if(more == (unsigned)(-1)) - { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - #endif - - /* If the window is almost full and there is insufficient lookahead, - move the upper half to the lower one to make room in the upper half. - */ - if(strstart_ >= wsize+max_dist()) - { - std::memcpy(window_, window_+wsize, (unsigned)wsize); - match_start_ -= wsize; - strstart_ -= wsize; // we now have strstart >= max_dist - block_start_ -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - n = hash_size_; - p = &head_[n]; - do - { - m = *--p; - *p = (std::uint16_t)(m >= wsize ? m-wsize : 0); - } - while(--n); - - n = wsize; - p = &prev_[n]; - do - { - m = *--p; - *p = (std::uint16_t)(m >= wsize ? m-wsize : 0); - /* If n is not on any hash chain, prev[n] is garbage but - its value will never be used. - */ - } - while(--n); - more += wsize; - } - if(zs.avail_in == 0) - break; - - /* If there was no sliding: - strstart <= WSIZE+max_dist-1 && lookahead <= kMinLookahead - 1 && - more == window_size - lookahead - strstart - => more >= window_size - (kMinLookahead-1 + WSIZE + max_dist-1) - => more >= window_size - 2*WSIZE + 2 - In the BIG_MEM or MMAP case (not yet supported), - window_size == input_size + kMinLookahead && - strstart + lookahead_ <= input_size => more >= kMinLookahead. - Otherwise, window_size == 2*WSIZE so more >= 2. - If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - n = read_buf(zs, window_ + strstart_ + lookahead_, more); - lookahead_ += n; - - // Initialize the hash value now that we have some input: - if(lookahead_ + insert_ >= minMatch) - { - uInt str = strstart_ - insert_; - ins_h_ = window_[str]; - update_hash(ins_h_, window_[str + 1]); - while(insert_) - { - update_hash(ins_h_, window_[str + minMatch-1]); - prev_[str & w_mask_] = head_[ins_h_]; - head_[ins_h_] = (std::uint16_t)str; - str++; - insert_--; - if(lookahead_ + insert_ < minMatch) - break; - } - } - /* If the whole input has less than minMatch bytes, ins_h is garbage, - but this is not important since only literal bytes will be emitted. - */ - } - while(lookahead_ < kMinLookahead && zs.avail_in != 0); - - /* If the kWinInit bytes after the end of the current data have never been - written, then zero those bytes in order to avoid memory check reports of - the use of uninitialized (or uninitialised as Julian writes) bytes by - the longest match routines. Update the high water mark for the next - time through here. kWinInit is set to maxMatch since the longest match - routines allow scanning to strstart + maxMatch, ignoring lookahead. - */ - if(high_water_ < window_size_) - { - std::uint32_t curr = strstart_ + (std::uint32_t)(lookahead_); - std::uint32_t winit; - - if(high_water_ < curr) - { - /* Previous high water mark below current data -- zero kWinInit - bytes or up to end of window, whichever is less. - */ - winit = window_size_ - curr; - if(winit > kWinInit) - winit = kWinInit; - std::memset(window_ + curr, 0, (unsigned)winit); - high_water_ = curr + winit; - } - else if(high_water_ < (std::uint32_t)curr + kWinInit) - { - /* High water mark at or above current data, but below current data - plus kWinInit -- zero out to current data plus kWinInit, or up - to end of window, whichever is less. - */ - winit = (std::uint32_t)curr + kWinInit - high_water_; - if(winit > window_size_ - high_water_) - winit = window_size_ - high_water_; - std::memset(window_ + high_water_, 0, (unsigned)winit); - high_water_ += winit; - } - } -} - -/* Flush as much pending output as possible. All write() output goes - through this function so some applications may wish to modify it - to avoid allocating a large strm->next_out buffer and copying into it. - (See also read_buf()). -*/ -template<class> -void -deflate_stream:: -flush_pending(z_params& zs) -{ - tr_flush_bits(); - auto len = clamp(pending_, zs.avail_out); - if(len == 0) - return; - - std::memcpy(zs.next_out, pending_out_, len); - zs.next_out = - static_cast<std::uint8_t*>(zs.next_out) + len; - pending_out_ += len; - zs.total_out += len; - zs.avail_out -= len; - pending_ -= len; - if(pending_ == 0) - pending_out_ = pending_buf_; -} - -/* Flush the current block, with given end-of-file flag. - IN assertion: strstart is set to the end of the current match. -*/ -template<class> -inline -void -deflate_stream:: -flush_block(z_params& zs, bool last) -{ - tr_flush_block(zs, - (block_start_ >= 0L ? - (char *)&window_[(unsigned)block_start_] : - (char *)0), - (std::uint32_t)((long)strstart_ - block_start_), - last); - block_start_ = strstart_; - flush_pending(zs); -} - -/* Read a new buffer from the current input stream, update the adler32 - and total number of bytes read. All write() input goes through - this function so some applications may wish to modify it to avoid - allocating a large strm->next_in buffer and copying from it. - (See also flush_pending()). -*/ -template<class> -int -deflate_stream:: -read_buf(z_params& zs, Byte *buf, unsigned size) -{ - auto len = clamp(zs.avail_in, size); - if(len == 0) - return 0; - - zs.avail_in -= len; - - std::memcpy(buf, zs.next_in, len); - zs.next_in = static_cast< - std::uint8_t const*>(zs.next_in) + len; - zs.total_in += len; - return (int)len; -} - -/* Set match_start to the longest match starting at the given string and - return its length. Matches shorter or equal to prev_length are discarded, - in which case the result is equal to prev_length and match_start is - garbage. - IN assertions: cur_match is the head of the hash chain for the current - string (strstart) and its distance is <= max_dist, and prev_length >= 1 - OUT assertion: the match length is not greater than s->lookahead_. - - For 80x86 and 680x0, an optimized version will be provided in match.asm or - match.S. The code will be functionally equivalent. -*/ -template<class> -uInt -deflate_stream:: -longest_match(IPos cur_match) -{ - unsigned chain_length = max_chain_length_;/* max hash chain length */ - Byte *scan = window_ + strstart_; /* current string */ - Byte *match; /* matched string */ - int len; /* length of current match */ - int best_len = prev_length_; /* best match length so far */ - int nice_match = nice_match_; /* stop if match long enough */ - IPos limit = strstart_ > (IPos)max_dist() ? - strstart_ - (IPos)max_dist() : 0; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - std::uint16_t *prev = prev_; - uInt wmask = w_mask_; - - Byte *strend = window_ + strstart_ + maxMatch; - Byte scan_end1 = scan[best_len-1]; - Byte scan_end = scan[best_len]; - - /* The code is optimized for HASH_BITS >= 8 and maxMatch-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - BOOST_ASSERT(hash_bits_ >= 8 && maxMatch == 258); - - /* Do not waste too much time if we already have a good match: */ - if(prev_length_ >= good_match_) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if((uInt)nice_match > lookahead_) - nice_match = lookahead_; - - BOOST_ASSERT((std::uint32_t)strstart_ <= window_size_-kMinLookahead); - - do { - BOOST_ASSERT(cur_match < strstart_); - match = window_ + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - if( match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) - continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - BOOST_ASSERT(*scan == *match); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do - { - } - while( *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - BOOST_ASSERT(scan <= window_+(unsigned)(window_size_-1)); - - len = maxMatch - (int)(strend - scan); - scan = strend - maxMatch; - - if(len > best_len) { - match_start_ = cur_match; - best_len = len; - if(len >= nice_match) break; - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; - } - } - while((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if((uInt)best_len <= lookahead_) - return (uInt)best_len; - return lookahead_; -} - -//------------------------------------------------------------------------------ - -/* Copy without compression as much as possible from the input stream, return - the current block state. - This function does not insert new strings in the dictionary since - uncompressible data is probably not useful. This function is used - only for the level=0 compression option. - NOTE: this function should be optimized to avoid extra copying from - window to pending_buf. -*/ -template<class> -inline -auto -deflate_stream:: -f_stored(z_params& zs, Flush flush) -> - block_state -{ - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - std::uint32_t max_block_size = 0xffff; - std::uint32_t max_start; - - if(max_block_size > pending_buf_size_ - 5) { - max_block_size = pending_buf_size_ - 5; - } - - /* Copy as much as possible from input to output: */ - for(;;) { - /* Fill the window as much as possible: */ - if(lookahead_ <= 1) { - - BOOST_ASSERT(strstart_ < w_size_+max_dist() || - block_start_ >= (long)w_size_); - - fill_window(zs); - if(lookahead_ == 0 && flush == Flush::none) - return need_more; - - if(lookahead_ == 0) break; /* flush the current block */ - } - BOOST_ASSERT(block_start_ >= 0L); - - strstart_ += lookahead_; - lookahead_ = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = block_start_ + max_block_size; - if(strstart_ == 0 || (std::uint32_t)strstart_ >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - lookahead_ = (uInt)(strstart_ - max_start); - strstart_ = (uInt)max_start; - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if(strstart_ - (uInt)block_start_ >= max_dist()) { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - } - insert_ = 0; - if(flush == Flush::finish) - { - flush_block(zs, true); - if(zs.avail_out == 0) - return finish_started; - return finish_done; - } - if((long)strstart_ > block_start_) - { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - return block_done; -} - -/* Compress as much as possible from the input stream, return the current - block state. - This function does not perform lazy evaluation of matches and inserts - new strings in the dictionary only for unmatched strings or for short - matches. It is used only for the fast compression options. -*/ -template<class> -inline -auto -deflate_stream:: -f_fast(z_params& zs, Flush flush) -> - block_state -{ - IPos hash_head; /* head of the hash chain */ - bool bflush; /* set if current block must be flushed */ - - for(;;) - { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need maxMatch bytes - * for the next match, plus minMatch bytes to insert the - * string following the next match. - */ - if(lookahead_ < kMinLookahead) - { - fill_window(zs); - if(lookahead_ < kMinLookahead && flush == Flush::none) - return need_more; - if(lookahead_ == 0) - break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0; - if(lookahead_ >= minMatch) { - insert_string(hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < minMatch - */ - if(hash_head != 0 && strstart_ - hash_head <= max_dist()) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - match_length_ = longest_match (hash_head); - /* longest_match() sets match_start */ - } - if(match_length_ >= minMatch) - { - tr_tally_dist(static_cast<std::uint16_t>(strstart_ - match_start_), - static_cast<std::uint8_t>(match_length_ - minMatch), bflush); - - lookahead_ -= match_length_; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if(match_length_ <= max_lazy_match_ && - lookahead_ >= minMatch) { - match_length_--; /* string at strstart already in table */ - do - { - strstart_++; - insert_string(hash_head); - /* strstart never exceeds WSIZE-maxMatch, so there are - * always minMatch bytes ahead. - */ - } - while(--match_length_ != 0); - strstart_++; - } - else - { - strstart_ += match_length_; - match_length_ = 0; - ins_h_ = window_[strstart_]; - update_hash(ins_h_, window_[strstart_+1]); - /* If lookahead < minMatch, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } - else - { - /* No match, output a literal byte */ - tr_tally_lit(window_[strstart_], bflush); - lookahead_--; - strstart_++; - } - if(bflush) - { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - } - insert_ = strstart_ < minMatch-1 ? strstart_ : minMatch-1; - if(flush == Flush::finish) - { - flush_block(zs, true); - if(zs.avail_out == 0) - return finish_started; - return finish_done; - } - if(last_lit_) - { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - return block_done; -} - -/* Same as above, but achieves better compression. We use a lazy - evaluation for matches: a match is finally adopted only if there is - no better match at the next window position. -*/ -template<class> -inline -auto -deflate_stream:: -f_slow(z_params& zs, Flush flush) -> - block_state -{ - IPos hash_head; /* head of hash chain */ - bool bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for(;;) - { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need maxMatch bytes - * for the next match, plus minMatch bytes to insert the - * string following the next match. - */ - if(lookahead_ < kMinLookahead) - { - fill_window(zs); - if(lookahead_ < kMinLookahead && flush == Flush::none) - return need_more; - if(lookahead_ == 0) - break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0; - if(lookahead_ >= minMatch) - insert_string(hash_head); - - /* Find the longest match, discarding those <= prev_length. - */ - prev_length_ = match_length_, prev_match_ = match_start_; - match_length_ = minMatch-1; - - if(hash_head != 0 && prev_length_ < max_lazy_match_ && - strstart_ - hash_head <= max_dist()) - { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - match_length_ = longest_match(hash_head); - /* longest_match() sets match_start */ - - if(match_length_ <= 5 && (strategy_ == Strategy::filtered - || (match_length_ == minMatch && - strstart_ - match_start_ > kTooFar) - )) - { - /* If prev_match is also minMatch, match_start is garbage - * but we will ignore the current match anyway. - */ - match_length_ = minMatch-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if(prev_length_ >= minMatch && match_length_ <= prev_length_) - { - /* Do not insert strings in hash table beyond this. */ - uInt max_insert = strstart_ + lookahead_ - minMatch; - - tr_tally_dist( - static_cast<std::uint16_t>(strstart_ -1 - prev_match_), - static_cast<std::uint8_t>(prev_length_ - minMatch), bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - lookahead_ -= prev_length_-1; - prev_length_ -= 2; - do { - if(++strstart_ <= max_insert) - insert_string(hash_head); - } - while(--prev_length_ != 0); - match_available_ = 0; - match_length_ = minMatch-1; - strstart_++; - - if(bflush) - { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - - } - else if(match_available_) - { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - tr_tally_lit(window_[strstart_-1], bflush); - if(bflush) - flush_block(zs, false); - strstart_++; - lookahead_--; - if(zs.avail_out == 0) - return need_more; - } - else - { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - match_available_ = 1; - strstart_++; - lookahead_--; - } - } - BOOST_ASSERT(flush != Flush::none); - if(match_available_) - { - tr_tally_lit(window_[strstart_-1], bflush); - match_available_ = 0; - } - insert_ = strstart_ < minMatch-1 ? strstart_ : minMatch-1; - if(flush == Flush::finish) - { - flush_block(zs, true); - if(zs.avail_out == 0) - return finish_started; - return finish_done; - } - if(last_lit_) - { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - return block_done; -} - -/* For Strategy::rle, simply look for runs of bytes, generate matches only of distance - one. Do not maintain a hash table. (It will be regenerated if this run of - deflate switches away from Strategy::rle.) -*/ -template<class> -inline -auto -deflate_stream:: -f_rle(z_params& zs, Flush flush) -> - block_state -{ - bool bflush; // set if current block must be flushed - uInt prev; // byte at distance one to match - Byte *scan, *strend; // scan goes up to strend for length of run - - for(;;) - { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need maxMatch bytes - * for the longest run, plus one for the unrolled loop. - */ - if(lookahead_ <= maxMatch) { - fill_window(zs); - if(lookahead_ <= maxMatch && flush == Flush::none) { - return need_more; - } - if(lookahead_ == 0) break; /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - match_length_ = 0; - if(lookahead_ >= minMatch && strstart_ > 0) { - scan = window_ + strstart_ - 1; - prev = *scan; - if(prev == *++scan && prev == *++scan && prev == *++scan) { - strend = window_ + strstart_ + maxMatch; - do { - } while(prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - scan < strend); - match_length_ = maxMatch - (int)(strend - scan); - if(match_length_ > lookahead_) - match_length_ = lookahead_; - } - BOOST_ASSERT(scan <= window_+(uInt)(window_size_-1)); - } - - /* Emit match if have run of minMatch or longer, else emit literal */ - if(match_length_ >= minMatch) { - tr_tally_dist(std::uint16_t{1}, - static_cast<std::uint8_t>(match_length_ - minMatch), - bflush); - - lookahead_ -= match_length_; - strstart_ += match_length_; - match_length_ = 0; - } else { - /* No match, output a literal byte */ - tr_tally_lit(window_[strstart_], bflush); - lookahead_--; - strstart_++; - } - if(bflush) - { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - } - insert_ = 0; - if(flush == Flush::finish) - { - flush_block(zs, true); - if(zs.avail_out == 0) - return finish_started; - return finish_done; - } - if(last_lit_) - { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - return block_done; -} - -/* =========================================================================== - * For Strategy::huffman, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -template<class> -inline -auto -deflate_stream:: -f_huff(z_params& zs, Flush flush) -> - block_state -{ - bool bflush; // set if current block must be flushed - - for(;;) - { - // Make sure that we have a literal to write. - if(lookahead_ == 0) - { - fill_window(zs); - if(lookahead_ == 0) - { - if(flush == Flush::none) - return need_more; - break; // flush the current block - } - } - - // Output a literal byte - match_length_ = 0; - tr_tally_lit(window_[strstart_], bflush); - lookahead_--; - strstart_++; - if(bflush) - { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - } - insert_ = 0; - if(flush == Flush::finish) - { - flush_block(zs, true); - if(zs.avail_out == 0) - return finish_started; - return finish_done; - } - if(last_lit_) - { - flush_block(zs, false); - if(zs.avail_out == 0) - return need_more; - } - return block_done; -} - -} // detail -} // zlib -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib/detail/inflate_stream.hpp b/contrib/restricted/boost/boost/beast/zlib/detail/inflate_stream.hpp deleted file mode 100644 index 4b40ae11a4..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/detail/inflate_stream.hpp +++ /dev/null @@ -1,1310 +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 -// -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef BOOST_BEAST_ZLIB_DETAIL_INFLATE_STREAM_HPP -#define BOOST_BEAST_ZLIB_DETAIL_INFLATE_STREAM_HPP - -#include <boost/beast/zlib/error.hpp> -#include <boost/beast/zlib/zlib.hpp> -#include <boost/beast/zlib/detail/bitstream.hpp> -#include <boost/beast/zlib/detail/ranges.hpp> -#include <boost/beast/zlib/detail/window.hpp> -#include <boost/beast/core/detail/type_traits.hpp> -#include <boost/throw_exception.hpp> -#include <algorithm> -#include <array> -#include <cstdint> -#include <cstring> -#include <stdexcept> - -namespace boost { -namespace beast { -namespace zlib { -namespace detail { - -class inflate_stream -{ -protected: - inflate_stream() - { - w_.reset(15); - } - - template<class = void> void doClear(); - template<class = void> void doReset(int windowBits); - template<class = void> void doWrite(z_params& zs, Flush flush, error_code& ec); - - void - doReset() - { - doReset(w_.bits()); - } - -private: - enum Mode - { - HEAD, // i: waiting for magic header - FLAGS, // i: waiting for method and flags (gzip) - TIME, // i: waiting for modification time (gzip) - OS, // i: waiting for extra flags and operating system (gzip) - EXLEN, // i: waiting for extra length (gzip) - EXTRA, // i: waiting for extra bytes (gzip) - NAME, // i: waiting for end of file name (gzip) - COMMENT, // i: waiting for end of comment (gzip) - HCRC, // i: waiting for header crc (gzip) - TYPE, // i: waiting for type bits, including last-flag bit - TYPEDO, // i: same, but skip check to exit inflate on new block - STORED, // i: waiting for stored size (length and complement) - COPY_, // i/o: same as COPY below, but only first time in - COPY, // i/o: waiting for input or output to copy stored block - TABLE, // i: waiting for dynamic block table lengths - LENLENS, // i: waiting for code length code lengths - CODELENS, // i: waiting for length/lit and distance code lengths - LEN_, // i: same as LEN below, but only first time in - LEN, // i: waiting for length/lit/eob code - LENEXT, // i: waiting for length extra bits - DIST, // i: waiting for distance code - DISTEXT,// i: waiting for distance extra bits - MATCH, // o: waiting for output space to copy string - LIT, // o: waiting for output space to write literal - CHECK, // i: waiting for 32-bit check value - LENGTH, // i: waiting for 32-bit length (gzip) - DONE, // finished check, done -- remain here until reset - BAD, // got a data error -- remain here until reset - SYNC // looking for synchronization bytes to restart inflate() - }; - - /* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. - - op values as set by inflate_table(): - - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - struct code - { - std::uint8_t op; // operation, extra bits, table bits - std::uint8_t bits; // bits in this part of the code - std::uint16_t val; // offset in table or code value - }; - - /* Maximum size of the dynamic table. The maximum number of code - structures is 1444, which is the sum of 852 for literal/length codes - and 592 for distance codes. These values were found by exhaustive - searches using the program examples/enough.c found in the zlib - distribtution. The arguments to that program are the number of - symbols, the initial root table size, and the maximum bit length - of a code. "enough 286 9 15" for literal/length codes returns - returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument - of the inflate_table() calls in inflate.c and infback.c. If the - root table size is changed, then these maximum sizes would be need - to be recalculated and updated. - */ - static std::uint16_t constexpr kEnoughLens = 852; - static std::uint16_t constexpr kEnoughDists = 592; - static std::uint16_t constexpr kEnough = kEnoughLens + kEnoughDists; - - struct codes - { - code const* lencode; - code const* distcode; - unsigned lenbits; // VFALCO use std::uint8_t - unsigned distbits; - }; - - // Type of code to build for inflate_table() - enum class build - { - codes, - lens, - dists - }; - - template<class = void> - static - void - inflate_table( - build type, - std::uint16_t* lens, - std::size_t codes, - code** table, - unsigned *bits, - std::uint16_t* work, - error_code& ec); - - template<class = void> - static - codes const& - get_fixed_tables(); - - template<class = void> - void - fixedTables(); - - template<class = void> - void - inflate_fast(ranges& r, error_code& ec); - - bitstream bi_; - - Mode mode_ = HEAD; // current inflate mode - int last_ = 0; // true if processing last block - unsigned dmax_ = 32768U; // zlib header max distance (INFLATE_STRICT) - - // sliding window - window w_; - - // for string and stored block copying - unsigned length_; // literal or length of data to copy - unsigned offset_; // distance back to copy string from - - // for table and code decoding - unsigned extra_; // extra bits needed - - // dynamic table building - unsigned ncode_; // number of code length code lengths - unsigned nlen_; // number of length code lengths - unsigned ndist_; // number of distance code lengths - unsigned have_; // number of code lengths in lens[] - unsigned short lens_[320]; // temporary storage for code lengths - unsigned short work_[288]; // work area for code table building - code codes_[kEnough]; // space for code tables - code *next_ = codes_; // next available space in codes[] - int back_ = -1; // bits back of last unprocessed length/lit - unsigned was_; // initial length of match - - // fixed and dynamic code tables - code const* lencode_ = codes_ ; // starting table for length/literal codes - code const* distcode_ = codes_; // starting table for distance codes - unsigned lenbits_; // index bits for lencode - unsigned distbits_; // index bits for distcode -}; - -//------------------------------------------------------------------------------ - -template<class> -void -inflate_stream:: -doReset(int windowBits) -{ - if(windowBits < 8 || windowBits > 15) - BOOST_THROW_EXCEPTION(std::domain_error{ - "windowBits out of range"}); - w_.reset(windowBits); - - bi_.flush(); - mode_ = HEAD; - last_ = 0; - dmax_ = 32768U; - lencode_ = codes_; - distcode_ = codes_; - next_ = codes_; - back_ = -1; -} - -template<class> -void -inflate_stream:: -doClear() -{ -} - -template<class> -void -inflate_stream:: -doWrite(z_params& zs, Flush flush, error_code& ec) -{ - ranges r; - r.in.first = reinterpret_cast< - std::uint8_t const*>(zs.next_in); - r.in.last = r.in.first + zs.avail_in; - r.in.next = r.in.first; - r.out.first = reinterpret_cast< - std::uint8_t*>(zs.next_out); - r.out.last = r.out.first + zs.avail_out; - r.out.next = r.out.first; - - auto const done = - [&] - { - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - - // VFALCO TODO Don't allocate update the window unless necessary - if(/*wsize_ ||*/ (r.out.used() && mode_ < BAD && - (mode_ < CHECK || flush != Flush::finish))) - w_.write(r.out.first, r.out.used()); - - zs.next_in = r.in.next; - zs.avail_in = r.in.avail(); - zs.next_out = r.out.next; - zs.avail_out = r.out.avail(); - zs.total_in += r.in.used(); - zs.total_out += r.out.used(); - zs.data_type = bi_.size() + (last_ ? 64 : 0) + - (mode_ == TYPE ? 128 : 0) + - (mode_ == LEN_ || mode_ == COPY_ ? 256 : 0); - - if(((! r.in.used() && ! r.out.used()) || - flush == Flush::finish) && ! ec) - ec = error::need_buffers; - }; - auto const err = - [&](error e) - { - ec = e; - mode_ = BAD; - }; - - if(mode_ == TYPE) - mode_ = TYPEDO; - - for(;;) - { - switch(mode_) - { - case HEAD: - mode_ = TYPEDO; - break; - - case TYPE: - if(flush == Flush::block || flush == Flush::trees) - return done(); - // fall through - - case TYPEDO: - { - if(last_) - { - bi_.flush_byte(); - mode_ = CHECK; - break; - } - if(! bi_.fill(3, r.in.next, r.in.last)) - return done(); - std::uint8_t v; - bi_.read(v, 1); - last_ = v != 0; - bi_.read(v, 2); - switch(v) - { - case 0: - // uncompressed block - mode_ = STORED; - break; - case 1: - // fixed Huffman table - fixedTables(); - mode_ = LEN_; /* decode codes */ - if(flush == Flush::trees) - return done(); - break; - case 2: - // dynamic Huffman table - mode_ = TABLE; - break; - - default: - return err(error::invalid_block_type); - } - break; - } - - case STORED: - { - bi_.flush_byte(); - std::uint32_t v; - if(! bi_.fill(32, r.in.next, r.in.last)) - return done(); - bi_.peek(v, 32); - length_ = v & 0xffff; - if(length_ != ((v >> 16) ^ 0xffff)) - return err(error::invalid_stored_length); - // flush instead of read, otherwise - // undefined right shift behavior. - bi_.flush(); - mode_ = COPY_; - if(flush == Flush::trees) - return done(); - BOOST_FALLTHROUGH; - } - - case COPY_: - mode_ = COPY; - BOOST_FALLTHROUGH; - - case COPY: - { - auto copy = length_; - if(copy == 0) - { - mode_ = TYPE; - break; - } - copy = clamp(copy, r.in.avail()); - copy = clamp(copy, r.out.avail()); - if(copy == 0) - return done(); - std::memcpy(r.out.next, r.in.next, copy); - r.in.next += copy; - r.out.next += copy; - length_ -= copy; - break; - } - - case TABLE: - if(! bi_.fill(5 + 5 + 4, r.in.next, r.in.last)) - return done(); - bi_.read(nlen_, 5); - nlen_ += 257; - bi_.read(ndist_, 5); - ndist_ += 1; - bi_.read(ncode_, 4); - ncode_ += 4; - if(nlen_ > 286 || ndist_ > 30) - return err(error::too_many_symbols); - have_ = 0; - mode_ = LENLENS; - BOOST_FALLTHROUGH; - - case LENLENS: - { - static std::array<std::uint8_t, 19> constexpr order = {{ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}}; - while(have_ < ncode_) - { - if(! bi_.fill(3, r.in.next, r.in.last)) - return done(); - bi_.read(lens_[order[have_]], 3); - ++have_; - } - while(have_ < order.size()) - lens_[order[have_++]] = 0; - - next_ = &codes_[0]; - lencode_ = next_; - lenbits_ = 7; - inflate_table(build::codes, &lens_[0], - order.size(), &next_, &lenbits_, work_, ec); - if(ec) - { - mode_ = BAD; - break; - } - have_ = 0; - mode_ = CODELENS; - BOOST_FALLTHROUGH; - } - - case CODELENS: - { - while(have_ < nlen_ + ndist_) - { - std::uint16_t v; - if(! bi_.fill(lenbits_, r.in.next, r.in.last)) - return done(); - bi_.peek(v, lenbits_); - auto cp = &lencode_[v]; - if(cp->val < 16) - { - bi_.drop(cp->bits); - lens_[have_++] = cp->val; - } - else - { - std::uint16_t len; - std::uint16_t copy; - if(cp->val == 16) - { - if(! bi_.fill(cp->bits + 2, r.in.next, r.in.last)) - return done(); - bi_.drop(cp->bits); - if(have_ == 0) - return err(error::invalid_bit_length_repeat); - bi_.read(copy, 2); - len = lens_[have_ - 1]; - copy += 3; - - } - else if(cp->val == 17) - { - if(! bi_.fill(cp->bits + 3, r.in.next, r.in.last)) - return done(); - bi_.drop(cp->bits); - bi_.read(copy, 3); - len = 0; - copy += 3; - } - else - { - if(! bi_.fill(cp->bits + 7, r.in.next, r.in.last)) - return done(); - bi_.drop(cp->bits); - bi_.read(copy, 7); - len = 0; - copy += 11; - } - if(have_ + copy > nlen_ + ndist_) - return err(error::invalid_bit_length_repeat); - std::fill(&lens_[have_], &lens_[have_ + copy], len); - have_ += copy; - copy = 0; - } - } - // handle error breaks in while - if(mode_ == BAD) - break; - // check for end-of-block code (better have one) - if(lens_[256] == 0) - return err(error::missing_eob); - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.hpp - concerning the kEnough constants, which depend on those values */ - next_ = &codes_[0]; - lencode_ = next_; - lenbits_ = 9; - inflate_table(build::lens, &lens_[0], - nlen_, &next_, &lenbits_, work_, ec); - if(ec) - { - mode_ = BAD; - return; - } - distcode_ = next_; - distbits_ = 6; - inflate_table(build::dists, lens_ + nlen_, - ndist_, &next_, &distbits_, work_, ec); - if(ec) - { - mode_ = BAD; - return; - } - mode_ = LEN_; - if(flush == Flush::trees) - return done(); - BOOST_FALLTHROUGH; - } - - case LEN_: - mode_ = LEN; - BOOST_FALLTHROUGH; - - case LEN: - { - if(r.in.avail() >= 6 && r.out.avail() >= 258) - { - inflate_fast(r, ec); - if(ec) - { - mode_ = BAD; - return; - } - if(mode_ == TYPE) - back_ = -1; - break; - } - if(! bi_.fill(lenbits_, r.in.next, r.in.last)) - return done(); - std::uint16_t v; - back_ = 0; - bi_.peek(v, lenbits_); - auto cp = &lencode_[v]; - if(cp->op && (cp->op & 0xf0) == 0) - { - auto prev = cp; - if(! bi_.fill(prev->bits + prev->op, r.in.next, r.in.last)) - return done(); - bi_.peek(v, prev->bits + prev->op); - cp = &lencode_[prev->val + (v >> prev->bits)]; - bi_.drop(prev->bits + cp->bits); - back_ += prev->bits + cp->bits; - } - else - { - bi_.drop(cp->bits); - back_ += cp->bits; - } - length_ = cp->val; - if(cp->op == 0) - { - mode_ = LIT; - break; - } - if(cp->op & 32) - { - back_ = -1; - mode_ = TYPE; - break; - } - if(cp->op & 64) - return err(error::invalid_literal_length); - extra_ = cp->op & 15; - mode_ = LENEXT; - BOOST_FALLTHROUGH; - } - - case LENEXT: - if(extra_) - { - if(! bi_.fill(extra_, r.in.next, r.in.last)) - return done(); - std::uint16_t v; - bi_.read(v, extra_); - length_ += v; - back_ += extra_; - } - was_ = length_; - mode_ = DIST; - BOOST_FALLTHROUGH; - - case DIST: - { - if(! bi_.fill(distbits_, r.in.next, r.in.last)) - return done(); - std::uint16_t v; - bi_.peek(v, distbits_); - auto cp = &distcode_[v]; - if((cp->op & 0xf0) == 0) - { - auto prev = cp; - if(! bi_.fill(prev->bits + prev->op, r.in.next, r.in.last)) - return done(); - bi_.peek(v, prev->bits + prev->op); - cp = &distcode_[prev->val + (v >> prev->bits)]; - bi_.drop(prev->bits + cp->bits); - back_ += prev->bits + cp->bits; - } - else - { - bi_.drop(cp->bits); - back_ += cp->bits; - } - if(cp->op & 64) - return err(error::invalid_distance_code); - offset_ = cp->val; - extra_ = cp->op & 15; - mode_ = DISTEXT; - BOOST_FALLTHROUGH; - } - - case DISTEXT: - if(extra_) - { - std::uint16_t v; - if(! bi_.fill(extra_, r.in.next, r.in.last)) - return done(); - bi_.read(v, extra_); - offset_ += v; - back_ += extra_; - } -#ifdef INFLATE_STRICT - if(offset_ > dmax_) - return err(error::invalid_distance); -#endif - mode_ = MATCH; - BOOST_FALLTHROUGH; - - case MATCH: - { - if(! r.out.avail()) - return done(); - if(offset_ > r.out.used()) - { - // copy from window - auto offset = static_cast<std::uint16_t>( - offset_ - r.out.used()); - if(offset > w_.size()) - return err(error::invalid_distance); - auto const n = clamp(clamp( - length_, offset), r.out.avail()); - w_.read(r.out.next, offset, n); - r.out.next += n; - length_ -= n; - } - else - { - // copy from output - auto in = r.out.next - offset_; - auto n = clamp(length_, r.out.avail()); - length_ -= n; - while(n--) - *r.out.next++ = *in++; - } - if(length_ == 0) - mode_ = LEN; - break; - } - - case LIT: - { - if(! r.out.avail()) - return done(); - auto const v = static_cast<std::uint8_t>(length_); - *r.out.next++ = v; - mode_ = LEN; - break; - } - - case CHECK: - mode_ = DONE; - BOOST_FALLTHROUGH; - - case DONE: - ec = error::end_of_stream; - return done(); - - case BAD: - return done(); - - case SYNC: - default: - BOOST_THROW_EXCEPTION(std::logic_error{ - "stream error"}); - } - } -} - -//------------------------------------------------------------------------------ - -/* Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, build::codes, build::lens, or build::dists. On - return, zero is success, -1 is an invalid code, and +1 means that - kEnough isn't enough. table on return points to the next available - entry's address. bits is the requested root table index bits, and - on return it is the actual root table index bits. It will differ if - the request is greater than the longest code or if it is less than - the shortest code. -*/ -template<class> -void -inflate_stream:: -inflate_table( - build type, - std::uint16_t* lens, - std::size_t codes, - code** table, - unsigned *bits, - std::uint16_t* work, - error_code& ec) -{ - unsigned len; // a code's length in bits - unsigned sym; // index of code symbols - unsigned min, max; // minimum and maximum code lengths - unsigned root; // number of index bits for root table - unsigned curr; // number of index bits for current table - unsigned drop; // code bits to drop for sub-table - int left; // number of prefix codes available - unsigned used; // code entries in table used - unsigned huff; // Huffman code - unsigned incr; // for incrementing code, index - unsigned fill; // index for replicating entries - unsigned low; // low bits for current root entry - unsigned mask; // mask for low root bits - code here; // table entry for duplication - code *next; // next available space in table - std::uint16_t const* base; // base value table to use - std::uint16_t const* extra; // extra bits table to use - int end; // use base and extra for symbol > end - std::uint16_t count[15+1]; // number of codes of each length - std::uint16_t offs[15+1]; // offsets in table for each length - - // Length codes 257..285 base - static std::uint16_t constexpr lbase[31] = { - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - - // Length codes 257..285 extra - static std::uint16_t constexpr lext[31] = { - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; - - // Distance codes 0..29 base - static std::uint16_t constexpr dbase[32] = { - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0}; - - // Distance codes 0..29 extra - static std::uint16_t constexpr dext[32] = { - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64}; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..15. The caller must assure this. - 1..15 is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..15) */ - for (len = 0; len <= 15; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = 15; max >= 1; max--) - if (count[max] != 0) - break; - if (root > max) - root = max; - if (max == 0) - { /* no symbols to code at all */ - here.op = (std::uint8_t)64; /* invalid code marker */ - here.bits = (std::uint8_t)1; - here.val = (std::uint16_t)0; - *(*table)++ = here; /* make a table to force an error */ - *(*table)++ = here; - *bits = 1; - return; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) - if (count[min] != 0) - break; - if (root < min) - root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= 15; len++) - { - left <<= 1; - left -= count[len]; - if (left < 0) - { - ec = error::over_subscribed_length; - return; - } - } - if (left > 0 && (type == build::codes || max != 1)) - { - ec = error::incomplete_length_set; - return; - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < 15; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) - work[offs[lens[sym]]++] = (std::uint16_t)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for build::lens and DIST tables against - the constants kEnoughLens and kEnoughDists to guard against changes in - the initial root table size constants. See the comments in inftrees.hpp - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) - { - case build::codes: - base = extra = work; /* dummy value--not used */ - end = 19; - break; - case build::lens: - base = lbase; - base -= 257; - extra = lext; - extra -= 257; - end = 256; - break; - default: /* build::dists */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - auto const not_enough = [] - { - BOOST_THROW_EXCEPTION(std::logic_error{ - "insufficient output size when inflating tables"}); - }; - - // check available table space - if ((type == build::lens && used > kEnoughLens) || - (type == build::dists && used > kEnoughDists)) - return not_enough(); - - /* process all codes and make table entries */ - for (;;) - { - /* create table entry */ - here.bits = (std::uint8_t)(len - drop); - if ((int)(work[sym]) < end) - { - here.op = (std::uint8_t)0; - here.val = work[sym]; - } - else if ((int)(work[sym]) > end) - { - here.op = (std::uint8_t)(extra[work[sym]]); - here.val = base[work[sym]]; - } - else - { - here.op = (std::uint8_t)(32 + 64); /* end of block */ - here.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - min = fill; /* save offset to next table */ - do - { - fill -= incr; - next[(huff >> drop) + fill] = here; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) - { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) - { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) - { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) - { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if ((type == build::lens && used > kEnoughLens) || - (type == build::dists && used > kEnoughDists)) - return not_enough(); - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (std::uint8_t)curr; - (*table)[low].bits = (std::uint8_t)root; - (*table)[low].val = (std::uint16_t)(next - *table); - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff != 0) - { - here.op = 64; // invalid code marker - here.bits = (std::uint8_t)(len - drop); - here.val = 0; - next[huff] = here; - } - - *table += used; - *bits = root; -} - -template<class> -auto -inflate_stream:: -get_fixed_tables() -> - codes const& -{ - struct fixed_codes : codes - { - code len_[512]; - code dist_[32]; - - fixed_codes() - { - lencode = len_; - lenbits = 9; - distcode = dist_; - distbits = 5; - - std::uint16_t lens[320]; - std::uint16_t work[288]; - - std::fill(&lens[ 0], &lens[144], std::uint16_t{8}); - std::fill(&lens[144], &lens[256], std::uint16_t{9}); - std::fill(&lens[256], &lens[280], std::uint16_t{7}); - std::fill(&lens[280], &lens[288], std::uint16_t{8}); - - { - error_code ec; - auto next = &len_[0]; - inflate_table(build::lens, - lens, 288, &next, &lenbits, work, ec); - if(ec) - BOOST_THROW_EXCEPTION(std::logic_error{ec.message()}); - } - - // VFALCO These fixups are from ZLib - len_[ 99].op = 64; - len_[227].op = 64; - len_[355].op = 64; - len_[483].op = 64; - - { - error_code ec; - auto next = &dist_[0]; - std::fill(&lens[0], &lens[32], std::uint16_t{5}); - inflate_table(build::dists, - lens, 32, &next, &distbits, work, ec); - if(ec) - BOOST_THROW_EXCEPTION(std::logic_error{ec.message()}); - } - } - }; - - static fixed_codes const fc; - return fc; -} - -template<class> -void -inflate_stream:: -fixedTables() -{ - auto const fc = get_fixed_tables(); - lencode_ = fc.lencode; - lenbits_ = fc.lenbits; - distcode_ = fc.distcode; - distbits_ = fc.distbits; -} - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode_ == LEN - zs.avail_in >= 6 - zs.avail_out >= 258 - start >= zs.avail_out - state->bits_ < 8 - - On return, state->mode_ is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if zs.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires zs.avail_out >= 258 for each loop to avoid checking for - output space. - - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and wnext == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ -template<class> -void -inflate_stream:: -inflate_fast(ranges& r, error_code& ec) -{ - unsigned char const* last; // have enough input while in < last - unsigned char *end; // while out < end, enough space available - std::size_t op; // code bits, operation, extra bits, or window position, window bytes to copy - unsigned len; // match length, unused bytes - unsigned dist; // match distance - unsigned const lmask = - (1U << lenbits_) - 1; // mask for first level of length codes - unsigned const dmask = - (1U << distbits_) - 1; // mask for first level of distance codes - - last = r.in.next + (r.in.avail() - 5); - end = r.out.next + (r.out.avail() - 257); - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do - { - if(bi_.size() < 15) - bi_.fill_16(r.in.next); - auto cp = &lencode_[bi_.peek_fast() & lmask]; - dolen: - bi_.drop(cp->bits); - op = (unsigned)(cp->op); - if(op == 0) - { - // literal - *r.out.next++ = (unsigned char)(cp->val); - } - else if(op & 16) - { - // length base - len = (unsigned)(cp->val); - op &= 15; // number of extra bits - if(op) - { - if(bi_.size() < op) - bi_.fill_8(r.in.next); - len += (unsigned)bi_.peek_fast() & ((1U << op) - 1); - bi_.drop(op); - } - if(bi_.size() < 15) - bi_.fill_16(r.in.next); - cp = &distcode_[bi_.peek_fast() & dmask]; - dodist: - bi_.drop(cp->bits); - op = (unsigned)(cp->op); - if(op & 16) - { - // distance base - dist = (unsigned)(cp->val); - op &= 15; // number of extra bits - if(bi_.size() < op) - { - bi_.fill_8(r.in.next); - if(bi_.size() < op) - bi_.fill_8(r.in.next); - } - dist += (unsigned)bi_.peek_fast() & ((1U << op) - 1); -#ifdef INFLATE_STRICT - if(dist > dmax_) - { - ec = error::invalid_distance; - mode_ = BAD; - break; - } -#endif - bi_.drop(op); - - op = r.out.used(); - if(dist > op) - { - // copy from window - op = dist - op; // distance back in window - if(op > w_.size()) - { - ec = error::invalid_distance; - mode_ = BAD; - break; - } - auto const n = clamp(len, op); - w_.read(r.out.next, op, n); - r.out.next += n; - len -= n; - } - if(len > 0) - { - // copy from output - auto in = r.out.next - dist; - auto n = clamp(len, r.out.avail()); - len -= n; - while(n--) - *r.out.next++ = *in++; - } - } - else if((op & 64) == 0) - { - // 2nd level distance code - cp = &distcode_[cp->val + (bi_.peek_fast() & ((1U << op) - 1))]; - goto dodist; - } - else - { - ec = error::invalid_distance_code; - mode_ = BAD; - break; - } - } - else if((op & 64) == 0) - { - // 2nd level length code - cp = &lencode_[cp->val + (bi_.peek_fast() & ((1U << op) - 1))]; - goto dolen; - } - else if(op & 32) - { - // end-of-block - mode_ = TYPE; - break; - } - else - { - ec = error::invalid_literal_length; - mode_ = BAD; - break; - } - } - while(r.in.next < last && r.out.next < end); - - // return unused bytes (on entry, bits < 8, so in won't go too far back) - bi_.rewind(r.in.next); -} - -} // detail -} // zlib -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib/detail/ranges.hpp b/contrib/restricted/boost/boost/beast/zlib/detail/ranges.hpp deleted file mode 100644 index aee141f357..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/detail/ranges.hpp +++ /dev/null @@ -1,104 +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 -// -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef BOOST_BEAST_ZLIB_DETAIL_RANGES_HPP -#define BOOST_BEAST_ZLIB_DETAIL_RANGES_HPP - -#include <cstdint> -#include <type_traits> - -namespace boost { -namespace beast { -namespace zlib { -namespace detail { - -struct ranges -{ - template<bool isConst> - struct range - { - using iter_t = - typename std::conditional<isConst, - std::uint8_t const*, - std::uint8_t*>::type; - - iter_t first; - iter_t last; - iter_t next; - - // total bytes in range - std::size_t - size() const - { - return last - first; - } - - // bytes consumed - std::size_t - used() const - { - return next - first; - } - - // bytes remaining - std::size_t - avail() const - { - return last - next; - } - }; - - range<true> in; - range<false> out; -}; - -// Clamp u to v where u and v are different types -template<class U, class V> -inline -U -clamp(U u, V v) -{ - if(u > v) - u = static_cast<U>(v); - return u; -} - -} // detail -} // zlib -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib/detail/window.hpp b/contrib/restricted/boost/boost/beast/zlib/detail/window.hpp deleted file mode 100644 index f089649183..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/detail/window.hpp +++ /dev/null @@ -1,167 +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 -// -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef BOOST_BEAST_ZLIB_DETAIL_WINDOW_HPP -#define BOOST_BEAST_ZLIB_DETAIL_WINDOW_HPP - -#include <boost/assert.hpp> -#include <boost/make_unique.hpp> -#include <cstdint> -#include <cstring> -#include <memory> - -namespace boost { -namespace beast { -namespace zlib { -namespace detail { - -class window -{ - std::unique_ptr<std::uint8_t[]> p_; - std::uint16_t i_ = 0; - std::uint16_t size_ = 0; - std::uint16_t capacity_ = 0; - std::uint8_t bits_ = 0; - -public: - int - bits() const - { - return bits_; - } - - unsigned - capacity() const - { - return capacity_; - } - - unsigned - size() const - { - return size_; - } - - void - reset(int bits); - - void - read(std::uint8_t* out, std::size_t pos, std::size_t n); - - template<class = void> - void - write(std::uint8_t const* in, std::size_t n); -}; - -inline -void -window:: -reset(int bits) -{ - if(bits_ != bits) - { - p_.reset(); - bits_ = static_cast<std::uint8_t>(bits); - capacity_ = 1U << bits_; - } - i_ = 0; - size_ = 0; -} - -inline -void -window:: -read(std::uint8_t* out, std::size_t pos, std::size_t n) -{ - if(i_ >= size_) - { - // window is contiguous - std::memcpy(out, &p_[i_ - pos], n); - return; - } - auto i = ((i_ - pos) + capacity_) % capacity_; - auto m = capacity_ - i; - if(n <= m) - { - std::memcpy(out, &p_[i], n); - return; - } - std::memcpy(out, &p_[i], m); - out += m; - std::memcpy(out, &p_[0], n - m); -} - -template<class> -void -window:: -write(std::uint8_t const* in, std::size_t n) -{ - if(! p_) - p_ = boost::make_unique< - std::uint8_t[]>(capacity_); - if(n >= capacity_) - { - i_ = 0; - size_ = capacity_; - std::memcpy(&p_[0], in + (n - size_), size_); - return; - } - if(i_ + n <= capacity_) - { - std::memcpy(&p_[i_], in, n); - if(size_ >= capacity_ - n) - size_ = capacity_; - else - size_ = static_cast<std::uint16_t>(size_ + n); - - i_ = static_cast<std::uint16_t>( - (i_ + n) % capacity_); - return; - } - auto m = capacity_ - i_; - std::memcpy(&p_[i_], in, m); - in += m; - i_ = static_cast<std::uint16_t>(n - m); - std::memcpy(&p_[0], in, i_); - size_ = capacity_; -} - -} // detail -} // zlib -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib/error.hpp b/contrib/restricted/boost/boost/beast/zlib/error.hpp deleted file mode 100644 index 797c511ba1..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/error.hpp +++ /dev/null @@ -1,139 +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_ZLIB_ERROR_HPP -#define BOOST_BEAST_ZLIB_ERROR_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/core/error.hpp> - -namespace boost { -namespace beast { -namespace zlib { - -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -/** Error codes returned by the codec. -*/ -enum class error -{ - /** Additional buffers are required. - - This error indicates that one or both of the buffers - provided buffers do not have sufficient available bytes - to make forward progress. - - This does not always indicate a failure condition. - - @note This is the same as `Z_BUF_ERROR` returned by ZLib. - */ - need_buffers = 1, - - /** End of stream reached. - - @note This is the same as `Z_STREAM_END` returned by ZLib. - */ - end_of_stream, - - /** Invalid stream or parameters. - - This error is returned when invalid parameters are passed, - or the operation being performed is not consistent with the - state of the stream. For example, attempting to write data - when the end of stream is already reached. - - @note This is the same as `Z_STREAM_ERROR` returned by ZLib. - */ - stream_error, - - // - // Errors generated by basic_deflate_stream - // - - // - // Errors generated by basic_inflate_stream - // - - /// Invalid block type - invalid_block_type, - - /// Invalid stored block length - invalid_stored_length, - - /// Too many length or distance symbols - too_many_symbols, - - /// Invalid code lengths - invalid_code_lenths, - - /// Invalid bit length repeat - invalid_bit_length_repeat, - - /// Missing end of block code - missing_eob, - - /// Invalid literal/length code - invalid_literal_length, - - /// Invalid distance code - invalid_distance_code, - - /// Invalid distance too far back - invalid_distance, - - // - // Errors generated by inflate_table - // - - /// Over-subscribed length code - over_subscribed_length, - - /// Incomplete length set - incomplete_length_set, - - - - /// general error - general -}; - -} // zlib -} // beast -} // boost - -#include <boost/beast/zlib/impl/error.ipp> - -#endif - diff --git a/contrib/restricted/boost/boost/beast/zlib/impl/error.ipp b/contrib/restricted/boost/boost/beast/zlib/impl/error.ipp deleted file mode 100644 index 6aa3d22d47..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/impl/error.ipp +++ /dev/null @@ -1,140 +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 -// -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef BOOST_BEAST_ZLIB_IMPL_ERROR_IPP -#define BOOST_BEAST_ZLIB_IMPL_ERROR_IPP - -#include <boost/beast/core/error.hpp> -#include <type_traits> - -namespace boost { - -namespace system { -template<> -struct is_error_code_enum<beast::zlib::error> -{ - static bool const value = true; -}; -} // system - -namespace beast { -namespace zlib { -namespace detail { - -class zlib_error_category : public error_category -{ -public: - const char* - name() const noexcept override - { - return "beast.zlib"; - } - - std::string - message(int ev) const override - { - switch(static_cast<error>(ev)) - { - case error::need_buffers: return "need buffers"; - case error::end_of_stream: return "unexpected end of deflate stream"; - case error::stream_error: return "stream error"; - - case error::invalid_block_type: return "invalid block type"; - case error::invalid_stored_length: return "invalid stored block length"; - case error::too_many_symbols: return "too many symbols"; - case error::invalid_code_lenths: return "invalid code lengths"; - case error::invalid_bit_length_repeat: return "invalid bit length repeat"; - case error::missing_eob: return "missing end of block code"; - case error::invalid_literal_length: return "invalid literal/length code"; - case error::invalid_distance_code: return "invalid distance code"; - case error::invalid_distance: return "invalid distance"; - - case error::over_subscribed_length: return "over-subscribed length"; - case error::incomplete_length_set: return "incomplete length set"; - - case error::general: - default: - return "beast.zlib error"; - } - } - - error_condition - default_error_condition(int ev) const noexcept override - { - return error_condition{ev, *this}; - } - - bool - equivalent(int ev, - error_condition const& condition - ) const noexcept override - { - return condition.value() == ev && - &condition.category() == this; - } - - bool - equivalent(error_code const& error, int ev) const noexcept override - { - return error.value() == ev && - &error.category() == this; - } -}; - -inline -error_category const& -get_error_category() -{ - static zlib_error_category const cat{}; - return cat; -} - -} // detail - -inline -error_code -make_error_code(error ev) -{ - return error_code{ - static_cast<std::underlying_type<error>::type>(ev), - detail::get_error_category()}; -} - -} // zlib -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib/inflate_stream.hpp b/contrib/restricted/boost/boost/beast/zlib/inflate_stream.hpp deleted file mode 100644 index 8410cb8bc2..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/inflate_stream.hpp +++ /dev/null @@ -1,220 +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_ZLIB_INFLATE_STREAM_HPP -#define BOOST_BEAST_ZLIB_INFLATE_STREAM_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <boost/beast/zlib/detail/inflate_stream.hpp> - -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -namespace boost { -namespace beast { -namespace zlib { - -/** Raw deflate stream decompressor. - - This implements a raw deflate stream decompressor. The deflate - protocol is a compression protocol described in - "DEFLATE Compressed Data Format Specification version 1.3" - located here: https://tools.ietf.org/html/rfc1951 - - The implementation is a refactored port to C++ of ZLib's "inflate". - A more detailed description of ZLib is at http://zlib.net/. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is memory mapped), or can be done - by repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output (providing - more output space) before each call. -*/ -class inflate_stream - : private detail::inflate_stream -{ -public: - /** Construct a raw deflate decompression stream. - - The window size is set to the default of 15 bits. - */ - inflate_stream() = default; - - /** Reset the stream. - - This puts the stream in a newly constructed state with - the previously specified window size, but without de-allocating - any dynamically created structures. - */ - void - reset() - { - doReset(); - } - - /** Reset the stream. - - This puts the stream in a newly constructed state with the - specified window size, but without de-allocating any dynamically - created structures. - */ - void - reset(int windowBits) - { - doReset(windowBits); - } - - /** Put the stream in a newly constructed state. - - All dynamically allocated memory is de-allocated. - */ - void - clear() - { - doClear(); - } - - /** Decompress input and produce output. - - This function decompresses as much data as possible, and stops when - the input buffer becomes empty or the output buffer becomes full. It - may introduce some output latency (reading input without producing any - output) except when forced to flush. - - One or both of the following actions are performed: - - @li Decompress more input starting at `zs.next_in` and update `zs.next_in` - and `zs.avail_in` accordingly. If not all input can be processed (because - there is not enough room in the output buffer), `zs.next_in` is updated - and processing will resume at this point for the next call. - - @li Provide more output starting at `zs.next_out` and update `zs.next_out` - and `zs.avail_out` accordingly. `write` provides as much output as - possible, until there is no more input data or no more space in the output - buffer (see below about the flush parameter). - - Before the call, the application should ensure that at least one of the - actions is possible, by providing more input and/or consuming more output, - and updating the values in `zs` accordingly. The application can consume - the uncompressed output when it wants, for example when the output buffer - is full (`zs.avail_out == 0`), or after each call. If `write` returns no - error and with zero `zs.avail_out`, it must be called again after making - room in the output buffer because there might be more output pending. - - The flush parameter may be `Flush::none`, `Flush::sync`, `Flush::finish`, - `Flush::block`, or `Flush::trees`. `Flush::sync` requests to flush as much - output as possible to the output buffer. `Flush::block` requests to stop if - and when it gets to the next deflate block boundary. When decoding the - zlib or gzip format, this will cause `write` to return immediately after - the header and before the first block. When doing a raw inflate, `write` will - go ahead and process the first block, and will return when it gets to the - end of that block, or when it runs out of data. - - The `Flush::block` option assists in appending to or combining deflate - streams. Also to assist in this, on return `write` will set `zs.data_type` - to the number of unused bits in the last byte taken from `zs.next_in`, plus - 64 if `write` is currently decoding the last block in the deflate stream, - plus 128 if `write` returned immediately after decoding an end-of-block code - or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to `zs.next_out`. The - number of unused bits may in general be greater than seven, except when - bit 7 of `zs.data_type` is set, in which case the number of unused bits - will be less than eight. `zs.data_type` is set as noted here every time - `write` returns for all flush options, and so can be used to determine the - amount of currently consumed input in bits. - - The `Flush::trees` option behaves as `Flush::block` does, but it also returns - when the end of each deflate block header is reached, before any actual data - in that block is decoded. This allows the caller to determine the length of - the deflate block header for later use in random access within a deflate block. - 256 is added to the value of `zs.data_type` when `write` returns immediately - after reaching the end of the deflate block header. - - `write` should normally be called until it returns `error::end_of_stream` or - another error. However if all decompression is to be performed in a single - step (a single call of `write`), the parameter flush should be set to - `Flush::finish`. In this case all pending input is processed and all pending - output is flushed; `zs.avail_out` must be large enough to hold all of the - uncompressed data for the operation to complete. (The size of the uncompressed - data may have been saved by the compressor for this purpose.) The use of - `Flush::finish` is not required to perform an inflation in one step. However - it may be used to inform inflate that a faster approach can be used for the - single call. `Flush::finish` also informs inflate to not maintain a sliding - window if the stream completes, which reduces inflate's memory footprint. - If the stream does not complete, either because not all of the stream is - provided or not enough output space is provided, then a sliding window will be - allocated and `write` can be called again to continue the operation as if - `Flush::none` had been used. - - In this implementation, `write` always flushes as much output as possible to - the output buffer, and always uses the faster approach on the first call. So - the effects of the flush parameter in this implementation are on the return value - of `write` as noted below, when `write` returns early when `Flush::block` or - `Flush::trees` is used, and when `write` avoids the allocation of memory for a - sliding window when `Flush::finsih` is used. - - If a preset dictionary is needed after this call, - `write` sets `zs.adler` to the Adler-32 checksum of the dictionary chosen by - the compressor and returns `error::need_dictionary`; otherwise it sets - `zs.adler` to the Adler-32 checksum of all output produced so far (that is, - `zs.total_out bytes`) and returns no error, `error::end_of_stream`, or an - error code as described below. At the end of the stream, `write` checks that - its computed adler32 checksum is equal to that saved by the compressor and - returns `error::end_of_stream` only if the checksum is correct. - - This function returns no error if some progress has been made (more input - processed or more output produced), `error::end_of_stream` if the end of the - compressed data has been reached and all uncompressed output has been produced, - `error::need_dictionary` if a preset dictionary is needed at this point, - `error::invalid_data` if the input data was corrupted (input stream not - conforming to the zlib format or incorrect check value), `error::stream_error` - if the stream structure was inconsistent (for example if `zs.next_in` or - `zs.next_out` was null), `error::need_buffers` if no progress is possible or - if there was not enough room in the output buffer when `Flush::finish` is - used. Note that `error::need_buffers` is not fatal, and `write` can be called - again with more input and more output space to continue decompressing. - */ - void - write(z_params& zs, Flush flush, error_code& ec) - { - doWrite(zs, flush, ec); - } -}; - -} // zlib -} // beast -} // boost - -#endif diff --git a/contrib/restricted/boost/boost/beast/zlib/zlib.hpp b/contrib/restricted/boost/boost/beast/zlib/zlib.hpp deleted file mode 100644 index b8dddcbfe8..0000000000 --- a/contrib/restricted/boost/boost/beast/zlib/zlib.hpp +++ /dev/null @@ -1,184 +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_ZLIB_ZLIB_HPP -#define BOOST_BEAST_ZLIB_ZLIB_HPP - -#include <boost/beast/core/detail/config.hpp> -#include <cstdint> -#include <cstdlib> - -// This is a derivative work based on Zlib, copyright below: -/* - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -namespace boost { -namespace beast { -namespace zlib { - -#if !defined(__MACTYPES__) -using Byte = unsigned char; // 8 bits -#endif -using uInt = unsigned int; // 16 bits or more - -/* Possible values of the data_type field (though see inflate()) */ -enum kind -{ - binary = 0, - text = 1, - unknown = 2 -}; - -/** Deflate codec parameters. - - Objects of this type are filled in by callers and provided to the - deflate codec to define the input and output areas for the next - compress or decompress operation. - - The application must update next_in and avail_in when avail_in has dropped - to zero. It must update next_out and avail_out when avail_out has dropped - to zero. The application must initialize zalloc, zfree and opaque before - calling the init function. All other fields are set by the compression - library and must not be updated by the application. - - The fields total_in and total_out can be used for statistics or progress - reports. After compression, total_in holds the total size of the - uncompressed data and may be saved for use in the decompressor (particularly - if the decompressor wants to decompress everything in a single step). -*/ -struct z_params -{ - /** A pointer to the next input byte. - - If there is no more input, this may be set to `nullptr`. - */ - void const* next_in; - - /** The number of bytes of input available at `next_in`. - - If there is no more input, this should be set to zero. - */ - std::size_t avail_in; - - /** The total number of input bytes read so far. - */ - std::size_t total_in = 0; - - /** A pointer to the next output byte. - */ - void* next_out; - - /** The remaining bytes of space at `next_out`. - */ - std::size_t avail_out; - - /** The total number of bytes output so far. - */ - std::size_t total_out = 0; - - int data_type = unknown; // best guess about the data type: binary or text -}; - -/** Flush option. -*/ -enum class Flush -{ - // order matters - - none, - block, - partial, - sync, - full, - finish, - trees -}; - -/* compression levels */ -enum compression -{ - none = 0, - best_speed = 1, - best_size = 9, - default_size = -1 -}; - -/** Compression strategy. - - These are used when compressing streams. -*/ -enum class Strategy -{ - /** Default strategy. - - This is suitable for general purpose compression, and works - well in the majority of cases. - */ - normal, - - /** Filtered strategy. - - This strategy should be used when the data be compressed - is produced by a filter or predictor. - */ - filtered, - - /** Huffman-only strategy. - - This strategy only performs Huffman encoding, without doing - any string matching. - */ - huffman, - - /** Run Length Encoding strategy. - - This strategy limits match distances to one, making it - equivalent to run length encoding. This can give better - performance for things like PNG image data. - */ - rle, - - /** Fixed table strategy. - - This strategy prevents the use of dynamic Huffman codes, - allowing for a simpler decoder for special applications. - */ - fixed -}; - -} // zlib -} // beast -} // boost - -#endif - |