[/
    Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)

    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

    Official repository: https://github.com/boostorg/beast
]

[section 发布说明]

[/-----------------------------------------------------------------------------]

[heading Boost 1.91]

[*Fixes]

* [issue 3066] 修复了 `inflate_with_eb` 中的类型转换警告

[*Improvements]

* [issue 3077] 对分块头部强制实施了 8KB 的合理性限制
* [issue 3085] 将 OpenSSL 设为测试的可选依赖项
* [issue 3074] 移除了对 Boost.StaticAssert 的依赖
* [issue 3091] 在 HTTP 字段枚举中添加了 `HTTP2-Settings`

[heading Boost 1.90]

[*API Changes]

* [issue 3042] `http::parser` 默认拒绝非标准的尾部字段（trailer fields）。
  ['Actions Required]:
  * If your code relies on a non-standard trailer field, consider setting
    [link beast.ref.boost__beast__http__parser.merge_all_trailers.overload2 `http::parser::merge_all_trailers`]
    after you have validated the `Trailer` header field in the header section of the message.
* [issue 3042] `http::basic_parser` 为尾部字段（trailer fields）使用了专用的回调函数。
  ['Actions Required]:
  * Custom parsers derived from `http::basic_parser` must override the new virtual function  
    [link beast.ref.boost__beast__http__basic_parser.on_trailer_field_impl `http::basic_parser::on_trailer_field_impl`]
    which is invoked for each field received while parsing the trailer section
    of a chunked HTTP message.
* [issue 3042] 更新了 `http::field` 常量。
  ['Actions Required]:
  * Most removed constants were unrelated to the HTTP protocol. If your code
    used one of them, please use the corresponding string literal value.

[*Fixes]

* [issue 3034] 修复了 `flat_buffer` 和 `multi_buffer` 中分配器的移动/拷贝赋值问题
* [issue 3028] 修复了 WebSocket 在部分消息消费时出现的 permessage-deflate 错误
* [issue 3032] `http::buffer_body` 会忽略空的分块

[*Improvements]

* [issue 3039] 添加了 `http::basic_fields::contains` 成员函数
* [issue 3050] 移除了对 Boost.Preprocessor 的依赖
* [issue 3048] 移除了对 Boost.StaticAssert 的依赖

[heading Boost 1.89]

[*Fixes]

* [issue 3002] 在 `async_base` 中条件定义了 `immediate_executor_type`
* [issue 2999] 在读操作期间使用 `handshake_timeout` 进行关闭握手
* [issue 3003] 为 `detail/cpu_info.hpp` 添加了缺失的 `cstdint` 头文件
* [issue 3016] 修复了 `std::is_trivial` 的弃用警告
* [issue 3019] 修复了 `-Wmaybe-uninitialized` 警告

[*Improvements]

* [issue 3005] 使用 `net::executor_work_guard` 替换了 `detail/work_guard.hpp`
* [issue 3016] 修复了在 MinGW 中构建测试时的可移植性问题

[*Documentation]

* [issue 3009] 移除了文档中已迁移的章节
* [issue 3009] 移除了测试中多余的日志消息

[heading Boost 1.88]

[*Fixes]

* [issue 2962] 修复了 `iequals` 函数中的越界访问问题

[*Improvements]

* [issue 2974] 更新了 SSL 示例以验证对等证书的主机名
* [issue 2954] 重构了 CMakeLists
* [issue 2955] 从示例中移除了对 Boost.Scope 的依赖
* [issue 2716] WebSockets：对等方的 Ping 帧现在会被计入 `idle_timeout`（空闲超时）的活动状态

[*Documentation]

* [issue 2918] 添加了 Unix 域套接字（Unix domain sockets）的新示例
* [issue 2910] 在文档中新增了 SSL/TLS 证书（SSL/TLS Certificate）章节
* [issue 2730] 改进了 `websocket::stream::async_close` 的文档说明

[heading Boost 1.87]

[*API Changes]

* [issue 2920] 为 `basic_fields::insert()` 添加了 `error_code` 重载
* [issue 2911] 为 `websocket::stream::get_status` 添加了重载，用于查询 permessage-deflate 的状态

[*Fixes]

* [issue 2926] 修复了 `http::basic_stream` 中调用 `net::dispatch` 时发生的“移动后使用（use-after-move）”问题，该问题曾导致在超时时抛出 `bad_executor` 异常
* [issue 2915] 移除了发起函数（initiating functions）中的可变操作
* [issue 2915] 修复了 `teardown_tcp_op` 中的取消处理逻辑
* [issue 2920] 在调用 `on_finish_impl` 之前，在 `basic_parser` 中设置了 `state_`
* [issue 2939] 移除了 `clamp` 函数中的 static 修饰符
* [issue 2903] 解决了测试中的 `-Wattributes` 警告
* [issue 2944] 解决了测试中无法访问的代码（unreachable code）警告

[*Improvements]

* [issue 2940] 为 `beast::http` 命名空间中的类型添加了前向声明头文件
* [issue 2920] 使 `http::parser` 能够使用带有 `error_code` 重载的 `basic_fields::insert()`
* [issue 2920] 将 `header_limit_` 应用于 `http::basic_parser` 的尾部头信息（trailer headers）
* [issue 2920] 改进了 `http::basic_parser`，使其能更早地返回 `http::error::header_limit` 错误
* [issue 2905] 增加了对模块化 Boost 构建结构的支持

[heading Boost 1.86]

[*API Changes]

* [issue 2878] 添加了 HTTP 状态码 418 I'm a teapot

[*Fixes]

* [issue 2879] 修复了 `read_size_hint_db()` 中的窄化转换问题
* [issue 2893] 解决了使用默认完成令牌时存在的重载歧义问题
* [issue 2517] 修复了 `http::basic_fields` 移动赋值运算符中位置错误的 `static_assert`
* [issue 2880] 修复了 WebSocket 部分写入操作中 `bytes_transferred` 的下溢问题
* [issue 2879] 确保 `websocket::stream::read_size_hint()` 不会超出 `read_message_max` 的限制
* [issue 2877] 解决了测试中的各类警告
* [issue 2872] 改进了示例中 SSL 关闭操作的错误处理逻辑
* [issue 2869] 为 zlib 中的 fallthrough case 添加了注解
* [issue 2866] 修复了 `basic_stream::ops::transfer_op` 中过期定时器的处理问题
* [issue 2864] 解决了 `test::basic_stream` 构造函数重载的歧义问题
* [issue 2861] 修复了 `http::parser` 中对最后一个分块（chunk）的部分解析问题

[*Improvements]

* [issue 2897] 在 `server_flex_awaitable` 示例中实现了优雅关闭
* [issue 2897] 简化了 awaitable 相关示例
* [issue 2888] 添加了模糊测试（fuzzing）目标
* [issue 2875] 移除了部分示例中多余的 `std::bind` 使用
* [issue 2875] `ssl_stream` 不再使用 `flat_stream`

[*Documentation]

* [issue 2875] 将 `ssl_stream` 和 `flat_stream` 标记为已弃用（deprecated）
* [issue 2875] 在代码片段和示例中，统一使用 `net::ssl::stream` 作为规范写法
* [issue 2872] 新增了“SSL/TLS 关闭流程（SSL/TLS Shutdown Procedure）”章节

[heading Boost 1.85]

[*API Changes]

* [issue 2811] 更新了状态码列表以符合 IANA 注册表

[*Fixes]

* [issue 2803] 修复了 `buffers_cat.hpp` 中无法访问代码（unreachable code）的警告
* [issue 2778] 改进了 `websocker_server_awaitable` 示例中的连接错误处理
* [issue 2739] 解决了高级服务器示例中对 `async_write` 的并发调用问题
* [issue 2810] 解决了 zlib 与 minizip 之间的名称冲突问题
* [issue 2818] 在调用 `SSL_set_tlsext_host_name()` 后更新主机名字符串

[*Improvements]

* [issue 2782] 为 `bind_wrapper` 和 `bind_front_wrapper` 特化了 `asio::associator`
* [issue 2646] 为错误类别消息函数添加了无需分配内存（non-allocating）的重载

[*Documentation]

* [issue 2789] 明确了调用 `http::message::prepare_payload()` 的可选时机
* [issue 2799] 说明了受 `basic_stream::expires_after()` 影响的操作
* [issue 2808] 将 `teardown()` 和 `async_teardown()` 设定为自定义点（customization points）
* [issue 2814] 明确了在首次使用后移动或复制 `http::serializer` 属于未定义行为（undefined behaviour）
* [issue 2817] 规定 `websocket::permessage_deflate` 必须在执行 WebSocket 握手之前完成配置
* [issue 2816] 修正了 HTTP 读取操作中 `bytes_transferred` 的语义，现在它报告的是被 HTTP 解析器消耗的字节数

[heading Boost 1.84]

[*API Changes]

* 移除了已弃用的分配和调用钩子（hooks）

[*Features]

* 增加了对 `immediate_executor` 的支持

[*Fixes]

* [issue 2766] 在完成 `transfer_op` 时显式使用了 `std::size_t` 类型
* [issue 2727] 用 `BOOST_ASIO_INITFN_AUTO_RES` 替换了 `BOOST_ASIO_INITFN_RESULT_TYPE`
* [issue 2715] `server-flex-awaitable` 示例现在会重置解析器

[*Documentation]

* [issue 2713] 修正了 `websocket::stream::async_ping/pong` 处理程序（handler）的要求
* [issue 2755] 更新了 `websocket::stream::async_write_some` 的文档

[heading Boost 1.83]

[*Fixes]

* [issue 2680] 针对 C++23 弃用了 `aligned_storage`
* [issue 2653] 修复了 MSVC 中文字面量 `not` 的报错问题
* [issue 2661] 解决了 Clang 编译器上 `ssl_stream` 的歧义报错
* [issue 2649] 将 Jamfile 中的依赖更新为使用 openssl.jam

[heading Boost 1.82]

[*Features]

* [issue 2475] 为 `error_code` 增加 `source_location` 支持

[*Fixes]

* [issue 2602] `tcp_stream` 使用计时器的正确执行器（executor）
* [issue 2638] 修复 `std::placeholders` 的歧义问题

[*Improvements]

* `error_categories` 使用数字 ID
* `file_body` 支持 seek


[heading Boost 1.81]

[*Features]

* 新增 `buffers_generator`
* 新增 `http::message_generator`
* 新增 `buffer_ref`
* 支持按操作取消（per-operation cancellation）

[*Fixes]

* [issue 2439] 修复 zlib 流中的 CVE-2018-25032 漏洞
* [issue 264] WebSocket 在协议升级（upgrade）阶段支持 HTTP 100 Continue
* [issue 471] `unquote` 函数改为通过引用接收字符串（s）

[*Improvements]

* [issue 2104] 新增 C++20 awaitable 示例
* [issue 226], [issue 227] 支持逐消息压缩（per-message compression）选项
* [issue 2449] 新增 WebSocket 超时选项 API
* [issue 2468] 修复多重 Content-Length 错误

[*Miscellaneous]

* 使用 Boost.Core 的 `span`
* 使用 Boost.StaticString 的 `static_string`
* `serializer::is_done` 改为 `const`
* 支持默认完成（default-completion）和重新绑定（rebind）
* [issue 2469] 支持 s390x 架构

[*Documentation]

* [issue 891] 新增缓冲区（buffers）功能表
* [issue 516] 明确 HTTP 字段大小写不敏感特性
* [issue 298] 补充 API 版本文档


[heading Boost 1.80]

[*Miscellaneous]

* [issue 2363] 移除 `BOOST_BEAST_USE_STD_STRING_VIEW`
* [issue 2417] 改用 `boost::core::string_view`，提升不同 `string_view` 实现间的互操作性；部分用户可观察到的行为差异如下：
 * `core::string_view` no longer supports the `.to_string()` or `.clear()` extensions from Utility
 * code that relied on `.max_size()` returning `.size(),` needs to be fixed to use `.size()` instead
 * `remove_suffix()` and `remove_prefix()` were more lenient than the standard specs; be sure you don't rely on it clamping the argument to valid range
 * `BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS` no longer suppresses conversions to `std::string`


[heading Boost 1.79]

[*Fixes]

* [issue 2391] 为 `file_body` 测试补充缺失的头文件（include）
* [issue 2364] 修复 WebSocket 握手失败时的响应
* [issue 2280] 修复 `file_posix` 的追加打开（open append）模式
* [issue 2280] 修复 `file_win32` 的追加打开（open append）模式
* [issue 2280] 修复 Windows 下使用 append/append_existing 标志打开文件的问题
* [issue 2354] 修复 `file_win32` 在 clang-cl 下的 UTF-8 路径处理
* [issue 2354] 修复 `file_stdio` 在 clang-cl 下的 UTF-8 路径处理

[*Miscellaneous]

* [issue 2375] 在 Drone CI 中新增 ARM64 构建
* [issue 2217] 修复 `async_base` 的文档链接
* [issue 2280] 新增文件以 append/append_existing 模式打开的测试
* [issue 2351] 更新 CI 环境，纳入 GCC 11、Clang 12 和 MSVC 14.3
* [issue 2350] 在 CMake 工作流中添加独立测试

[heading Boost 1.78]

[*Fixes]

* 修复 zlib 实现中的 CVE-2016-9840 漏洞
* 修复 `websocket_client_async_ssl` 示例中的 TLS SNI 处理
* [issue 2313] 修复 WebSocket `permessage_deflate` 中滑动窗口的复用问题
* 修复 `http_server_async` 示例中的 accept 错误处理

[*Miscellaneous]

* 移除测试框架对 RTTI 的依赖。
* 将库专用的 docca 配置移至 Beast。
* 移除 `test::stream` 中对 RTTI 的依赖。
* 修复测试头文件中缺失的包含项。



[heading Boost 1.77]

[*Fixes]

* [issue 2233] 移除仅用于 POSIX 的常量。

[*Miscellaneous]

* 修复测试相关问题。
* 改进并修复 Github 与 Drone CI 配置。
* 适配 Docca 更新。
* 更新示例根证书。
* 新增用于读取大响应体的示例。
* 移除 Travis CI。
* 更新 CMakeLists.txt。


[heading Boost 1.76]

[*Fixes]

* [issue 2139] 为 `test::stream` 添加执行器重绑定功能。
* 修复 WebSocket 异步关闭操作中编译器提示变量未使用的问题。

[*Improvements]

* [issue 2124] 使用 Beast 不再需要浮点运算支持。
* 为所有操作使用公共缓冲区类型，以减小 WebSocket 编译后代码体积。
* HTTP 解析器针对错误使用情形改进了检测能力。


[*Miscellaneous]

* [issue 2140] 为库元数据添加 cxxstd 标签。
* 迁移至 Drone CI。
* 对文档格式进行小幅改进。
* 在树内构建时，CMake 现可正确查找所需的 Boost::thread 库。


[heading Boost 1.75]

[*Fixes]

* 消除 `detect_ssl` 中无关的参数未使用警告。
* 更新 WebSocket 示例，为 TLS 连接设置 SNI。
* [issue 2023] WebSocket 的 async_shutdown 操作现可关闭底层 TLS 传输层。
* [issue 2011] 在 POSIX 环境下，使用 append_existing 标志打开文件现可正常工作。
* [issue 2039] Windows 构建现按需链接 bcrypt 库，以满足 filesystem 库的依赖。
* [issue 2063] 修复 `advanced_server_flex` 示例中的逻辑错误。
* [issue 1582] 修复 MSVC 上不可达代码的编译错误。
* [issue 2070] 修复 body_limit 为 none 时 HTTP body 的行为。
* [issue 2065] 修复 `basic_stream` 在请求零长度写入时的行为。
* [issue 2080] 新增表示 Sec-* HTTP 头部的枚举。
* [issue 2085] 修复 `fields::set()` 中 `nullptr` 隐式转换的问题。
* [issue 2029] 修复 `basic_stream` 的 C++20 测试。

[*Miscellaneous]

* 为异步操作添加处理器跟踪功能：
  * Define the preprocessor macro `BOOST_ASIO_ENABLE_HANDLER_TRACKING` to enable Asio handler
    tracking in Boost.Beast asynchronous operations. Please see
    [@boost:/doc/html/boost_asio/overview/core/handler_tracking.html asio handler tracking]
    for details.
* 新增 Bishop-Fox 2020 安全评估报告。

[heading Boost 1.74]

[*API Changes]

* Asio 的 API 发生了变更，详见 Asio 版本发布说明。

* Beast 已更新，用于跟踪并遵守开发者在 Asio 使用中的配置选择，具体包括：
 * Define `BOOST_ASIO_NO_DEPRECATED` to disallow deprecated invocation hooks.
 * Define `BOOST_ASIO_NO_TS_EXECUTORS` to ensure that executors conform to the
   [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0443r11.html Standard Executors] proposal.
 * Define `BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT` to select
   [@https://cplusplus.github.io/networking-ts/draft.pdf Networking TS] style executors by default.
   If this macro is not defined, Asio default executors will be the
   [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0443r11.html Standard Executors] implementation.

* [issue 1897] 解析器的 `body_limit` 参数改为可选（API 变更）
  ['Actions Required]
  * The signature of `basic_parser<>::body_limit(n)` has changed. It now accepts an
    optional `std::uint64_t`. The caller may indicate that no body limit is required
    by calling `body_limit(boost::none)`. The default limits remain in place in order
    to maintain 'safe by default' behaviour.

* [issue 1934] 移除已弃用的接口（API 变更）
  ['Actions Required]
  * The macro `BOOST_BEAST_NO_DEPRECATED` will no longer be noticed by Beast. The only way to
    enable deprecated functionality is now the macro `BOOST_BEAST_ALLOW_DEPRECATED` which is
    undefined by default. That is, all deprecated behaviour is disabled by default.
  * The following deprecated functions have been removed:
    * `websocket::async_accept_ex`
    * `websocket::async_handshake_ex`
    * `websocket::accept_ex`
    * `websocket::handshake_ex`
    Programs still using these names should be refactored to use the `decorator` feature and
    the remaining handshake and accept functions.
  * `websocket::role_type` has been removed. Users should use `beast::role_type` instead.
  * `handler_ptr` has been removed. Users should use `net::bind_handler` and/or
    `bind_front_handler` instead.
  * Code that depends on `mutable_data_type` should be refactored to use
    `mutable_buffers_type`. Classes affected are:
    * `buffers_adaptor`
    * `flat_buffer`
    * `flat_static_buffer`
    * `multi_buffer`
    * `static_buffer`
  * The `reset` function has been removed from `flat_static_buffer`. Use the
    `clear` function instead.
  * The `core/type_traits.hpp` public header has been removed and along with it
    the type trait `is_completion_handler`. Beast uses the CompletionHandler correctness
    checks provided by Asio. In a c++20 environment, these convert to concept checks.
  * The error code enum `invalid_code_lenths` (sic) was a synonym of `invalid_code_lengths`.
    Affected programs should be modified to use `invalid_code_lengths`.
  * The file `core/buffers_adapter.hpp` has been removed along with the deprecated
    alias typename `buffers_adapter`. Affected programs should use
  `  core/buffers_adapator.hpp` and the type `buffers_adaptor`.

* [issue 1956] 弃用 `string_param`（API 变更）
  ['Actions Required]
  `string_param`, which was previously the argument type when setting field values
  has been replaced by `string_view`. Because of this, it is no longer possible to
  set message field values directly as integrals.
  Users are requied to convert numeric arguments to a string type prior to calling
  `fields::set` et. al.
  Beast provides the non-allocating `to_static_string()` function for this purpose.
  To set Content-Length field manually, call `message::content_length`.

[*Fixes]

* [issue 1913] 修复使用 `std::string_view` 时的独立编译错误
* [issue 1925] [issue 1916] 修复在 Visual Studio 中使用 /std:c++latest 时的编译错误
* [issue 1924] 修复 `span_body` 中的 C++20 弃用警告
* [issue 1920] 修复 `buffered_read_stream` 与 `use_awaitable` 一起使用时的问题
* [issue 1918] 修复 `async_detect_ssl` 与 `use_awaitable` 一起使用时的问题
* [issue 1944] 修复 `FILE` 的命名空间限定
* [issue 1942] 修复 HTTP 读取中的 `bytes_transferred`
* [issue 1943] 修复 `basic_stream` 中的 `expires_after`
* [issue 1980] 修复 `max` 的编译错误
* [issue 1949] `iless` 和 `iequal` 参与异质查找

[*Miscellaneous]

* [issue 1907] 使用 SSL/TLS 流时需要 OpenSSL 1.0.2 或更高版本。
  This is a requirement inherited from Boost.Asio.

* 新增测试用例，用于确保与 C++20 的正确集成。
  coroutines when avaialable.

[heading Boost 1.73]

[*API Changes]

* Beast 动态缓冲区中的嵌套 `mutable_data_type` 已被弃用。受影响类型如下：
  * `buffers_adaptor`
  * `flat_buffer`
  * `flat_static_buffer`
  * `multi_buffer`
  * `static_buffer`


[*Changes Required]

* 使用嵌套的 `mutable_buffers_type` 替代 `mutable_data_type`
  or define `BOOST_BEAST_ALLOW_DEPRECATED`

[*Miscellaneous]

* 更新示例中的根证书

[*Fixes]

* [issue 1880] 修复 Content-Length 解析问题
* [issue 1852] 修复示例，改为向 strand 派发
* [issue 1875] 确保 `basic_stream::close` 不会抛出异常
* [issue 1863] Digest 字段与字节序无关
* [issue 1853] 修复 ostream 刷新问题
* [issue 1831] `flat_buffer::shrink_to_fit` 为 `noexcept`
* [issue 1828] 修复字段擦除问题
* [issue 1822] 示例正确使用 strand
* [issue 1818] `file_body` 在读取到 EOF 时返回 `short_read`
* [issue 1786] 修复 win32 中 `file_body` 的缺陷
* [issue 1260] 为 `basic_file_body` 的 File 成员添加访问函数
* [issue 793] `file_win32` 支持 UTF-8 路径
* [issue 793] `file_stdio` 支持 Unicode 路径
* [issue 1786] `file_win32` 类型 body 遵守 `http::serializer::split` 设置
* 更正 `buffer_bytes` 文档
* 修复 sha1.hpp 中缺失的头文件包含
* 修复 ostream 警告
* 修复 README 中的失效链接
* 将部分 win32 错误转换为网络错误码
* 被移动后的动态缓冲区在分配器不同时不会清空
* 修复编译宏文档
* 明确 `File::read` 文档中有关 EOF 的行为说明
* ostream_buffer 满足 DynamicBuffer_v1::commit 的前置条件
* 修复文档发布构建问题
* 修复 `echo-op` 测试
* 修复非 MSVC 环境下的 CMake 配置

[heading Boost 1.72]

[*Examples]

* 新增使用 async-ssl-system-executor 的 HTTP 客户端示例

* 新增使用 async-ssl-system-executor 的 WebSocket 客户端示例

[*Features]

* 异步初始化函数使用执行器的默认令牌

* 所有异步操作使用自动推导返回类型（C++14 起）

* 支持为完成令牌参数使用 Concepts

[*Fixes]

* [issue 1664] 添加默认析构函数，用于满足 -Wnon-virtual-dtor 编译选项的要求

* [issue 1682] 同一类型不支持多次 I/O 操作 

* [issue 1687] 修复 file_stdio::seek 中有符号与无符号类型不匹配的问题

* [issue 1688] basic_stream 析构函数不可抛出异常

* [issue 1734] 修复 basic_parser 边界情况中的残留问题： 

* [issue 1751] https_get 示例现在会发送 Host 头字段

* [issue 1754] 修复 async_read 超时时 async_close 的错误码问题 

* [issue 1782] root_certificates.hpp 不适用于生产环境

* 修复 WebSocket 示例中的数据竞争问题
 
* 修复 HTTP 服务器示例中的数据竞争问题

* 屏蔽 WebSocket 计时器中无关的断言

* 在 basic_stream 的计时器中使用执行器类型 

[/-----------------------------------------------------------------------------]

[heading Boost 1.71]



[*Improvements]

* [issue 1280] 为 `buffers_cat` 添加单元素特化支持

* [issue 1556] 即使在达到 body 限制的情况下也设置解析器状态和标志位

* [issue 1567] 放宽 vector_body 的类型要求

* [issue 1568] `detect_ssl` 使用 `bool` 替代 `tribool`

* [issue 1574] 替换 HTTP 解析器中的 `static_string`

* [issue 1606] 改用 `steady_timer` 类型

* [issue 1611] 优化 WebSocket 聊天 JavaScript 客户端的用户交互体验

* [issue 1613] 移除多余的 `static_string` 使用

* [issue 1636] 提升 `http::string_to_verb` 的性能

* 部分消息场景下保留 `operation_aborted` 状态

* 移除未使用的 `<experimental/unit_test/thread.hpp>` 头文件

* 减少 `filter_token_list` 的实例化次数

* 新增空闲 Ping 挂起测试

* 移除 `basic_stream` 中对 `bind_executor` 的使用

* 移除 service_base 中多余的模板参数

* 移除 `http::fields` 中对 `static_string` 的使用 

* 为 `http::basic_fields` 启用分离编译支持

* 移除 WebSocket 中多余的 `static_string` 实例化

* 移除 `flat_stream` 中多余的 `asio::coroutine` 使用 

* rfc7230.hpp 中增加分离编译的支持

* websocket/detail/mask.hpp 中增加分离编译的支持 

* 简化 sec-websocket-key 的生成方式




[*Fixes]

* [issue 1332] 对用户自定义类型使用 `allocator_traits::construct`

* [issue 1559] 成员函数 `get_executor` 的 const 正确性

* [issue 1569] 修复 `async_detect_ssl` 的处理函数类型

* [issue 1570] 对指针进行 launder 操作

* [issue 1578] 修复 MSVC 下的 min/max 问题

* [issue 1586] 修复 deflate_stream 中未初始化内存的使用问题

* [issue 1593] 修复 WebSocket 关闭测试中的未定义行为 

* [issue 1594] 修复测试流中的数据竞争问题

* [issue 1599] 修复空闲 Ping 超时中执行器被移动后的使用问题

* [issue 1607] 移除对已弃用函数 `buffers` 的使用

* [issue 1612] 移除 WebSocket 测试中已弃用的调用方法

* [issue 1620] 修正 WebSocket 聊天 JavaScript 客户端中的拼写错误

* [issue 1621] 修复 `flat_buffer` 的拷贝成员函数

* 屏蔽 gcc-8 的编译警告

* 修复 `buffers_cat` 迭代器测试失败问题

* 避免对移动操作进行过度优化

* 为 basic_parser.ipp 中调用的 `beast::iequals` 添加命名空间限定

* 修复 WebSocket 读取测试中的未定义行为

* 简化 websocket::detail::prng 的实现

* 避免在 http::basic_fields 中进行过度内存分配



[*Documentation]

* 使用 SaxonHE 替代 xsltproc 构建文档



[/-----------------------------------------------------------------------------]

[heading Boost 1.70]

[tip
  全库统一使用命名空间别名 `net` 指代 `boost::asio`。
]

[*New Features]

* 所有组合操作均使用新的实现方式
  [@boost:/doc/html/boost_asio/reference/async_initiate.html `net::async_initiate`]
  internally.

* 新增 `tcp_stream` 以及
  `basic_stream`
  support:
  * Timeouts,
    [link beast.ref.boost__beast__basic_stream.async_read_some `async_read_some`],
    [link beast.ref.boost__beast__basic_stream.async_write_some `async_write_some`]
    complete with
    [link beast.ref.boost__beast__error `error::timeout`]
    on expiration.
  * Traffic-shaping policies
    [link beast.ref.boost__beast__simple_rate_policy `simple`] and
    [link beast.ref.boost__beast__unlimited_rate_policy `unlimited`],
    or a user-defined
    [link beast.concepts.RatePolicy ['RatePolicy]].
  * Supports
    [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1322r0.html P1322R0].

* `websocket::stream`
   supports
   * Configurable handshake timeout
   * Configurable idle timeout
   * Automatic idle pings

* [link beast.ref.boost__beast__ssl_stream `ssl_stream`]
  is a public interface

* ([issue 1305]) Better
  `flat_buffer`,
  `flat_static_buffer`,
  `multi_buffer`, and
  `static_buffer`:
  * Revise all reference documentation
  * Move construction does not always invalidate buffers
  * non-const `data()` returns a mutable buffer sequence
  * Add `cdata()` to also return constant readable bytes
  * Eligible member functions are declared `noexcept`

* ([issue 1345]) Better
  `flat_buffer`,
  `multi_buffer`
  * Add `clear`, `reserve()`, `max_size()`, `shrink_to_fit()`
  * Respect Allocator `max_size()`
  * Specify exception safety

* ([issue 1384]) 新增函数
  `bind_front_handler`

* Better
  `static_buffer`,
  `flat_static_buffer`
  * Add `clear()`
  * More members are `noexcept`
  * Specify exception safety

* Faster
  `http::string_to_field`

* 动态缓冲区的 `clear` 操作会保留已分配的内存容量。

* 新增头文件 <boost/beast/core/buffer_traits.hpp>
  * New variadic `is_const_buffer_sequence`
  * New variadic `is_mutable_buffer_sequence`
  * New trait `buffers_iterator_type`
  * New trait `buffers_type`

* 新增类
  `async_base`,
  `stable_async_base`
  * Handle boilerplate for writing composed operations
  * New
    `allocate_stable`
    is preferred over `handler_ptr`

* New
  `buffer_bytes`
  replacement for `net::buffer_size`

* New:
  * `saved_handler`
  * `buffers_range_ref` 
  * `executor_type`
  * `get_lowest_layer`,
    `lowest_layer_type`
  * `close_socket`,
    `beast_close_socket`
  * `error`,
    `condition`

* 以下接口现已公开（此前为实验性接口）：
  [link beast.ref.boost__beast__flat_stream `flat_stream`],
  [link beast.ref.boost__beast__detect_ssl `detect_ssl`],
  [link beast.ref.boost__beast__async_detect_ssl `async_detect_ssl`].

* WebSocket 流使用 PCG 作为快速随机数生成器，
  for increased security.



[*Documentation]

* WebSocket 参考文档已修订

* 更新 [link beast.using_io.asio_refresher 网络基础知识回顾]

* 修订 [link beast.using_io.writing_composed_operations.echo 异步回显示例]

* 重写 [link beast.using_io.writing_composed_operations.detect_ssl [*检测 SSL 握手]]



[*API Changes]

* __Fields__ 概念已被弃用，后续将予以移除。
  in a future version. ['Actions Required]: Do not rely on
  the ['Fields] concept.

* `handler_ptr` 已被弃用。【需要采取的措施】：改用
  `stable_async_base` and
  `allocate_stable`
  instead.

* 在 Windows 平台上，需使用 Visual Studio 2017 或更高版本。

* 构建示例程序和测试套件时需要 OpenSSL。

* HTTP 流操作算法会返回已传输的字节数。
  from the stream. Previously, they returned the number of bytes
  consumed by the parser.
  ['Actions Required]:
  * Callers depending on the return value of
    `http::read` or
    `http::async_read`
    overloads should adjust the usage of
    the returned value as needed.

* 元函数
  `has_get_executor`,
  `is_sync_stream`,
  `is_sync_read_stream`,
  `is_sync_write_stream`,
  `is_async_stream`,
  `is_async_read_stream`, and
  `is_async_write_stream`
  are in stream_traits.hpp.
  ['Actions Required]: Include stream_traits.hpp as needed.

* `basic_parser`
  is abstract.
  ['Actions Required]
  * Change uses of the `basic_parser` type to omit the `Derived`
    template parameter
  * Classes derived from `basic_parser` no longer need to friend
    the base.
  * Virtual functions in the derived class may be marked `override`.

* 元函数
  `is_file`
  is in file_base.hpp.
  ['Actions Required]: Include file_base.hpp as needed.

* `flat_static_buffer::reset()`
  is deprecated.
  ['Actions Required]:
  * call
    `clear()` instead.

* `buffers_adapter` 的正确拼写为
  `buffers_adaptor`.
  ['Actions Required]:
  * Replace `buffers_adapter` with
    `buffers_adaptor`,
    or define `BOOST_BEAST_ALLOW_DEPRECATED`.

* `buffers` 的正确拼写为
  `make_printable`.
  ['Actions Required]:
  * Replace `buffers` with
    `make_printable`,
    and include "make_printable.hpp" instead of "ostream.hpp".

* 移除 `file_mode::append_new`，该枚举值本身没有实际意义。
  ['Actions Required]:
  * Replace `file_mode::append_new` with either
    `file_mode::append` or
    `file_mode::append_existing`
    as needed.

* `role_type` 已从 `websocket` 命名空间移至 `beast` 命名空间。

* `buffers_range_ref`
  is preferred to `std::reference_wrapper`.
  ['Actions Required]:
  * Call
    `buffers_range_ref`
    with the buffer, instead of calling
    `buffers_range`
    with a reference wrapper constructed from the buffer.

* 移除嵌套的 `lowest_layer` 和 `lowest_layer_type`。
  ['Actions Required]: Use the free function
  `get_lowest_layer` and the
  type trait
  `lowest_layer_type` instead.

* WebSocket 装饰器现作为套接字选项提供：
  * Overloads of the following functions which accept a Decorator
    are deprecated:
    * `accept`, `accept_ex`
    * `handshake`, `handshake_ex`
    * `async_accept`, `async_accept_ex`
    * `async_handshake`, `async_handshake_ex`

* ([issue 1375]) `basic_parser::content_length` 的返回值
  no longer changes as the body of the message is received.
  ['Actions Required]: Call `basic_parser::content_length_remaining` instead
  of `basic_parser::content_length` in order to determine the remaining
  number of bytes in the body.


[*Examples]

* 所有示例程序均已完成更新：
  * Use
    `tcp_stream`
    with timeouts (HTTP)
  * Use
    `ssl_stream`
  * Set timeouts for WebSocket streams.
  * Use
    `bind_front_handler`

* ([issue 1100]) http-crawl 在每次读取前会清空响应缓冲区。

* ([issue 1347]) 重写 echo-op 示例程序。

* ([issue 1401]) 示例程序使用
  `flat_buffer`

* 高级服务器使用 HTTP 解析器接口进行读取操作

* 重写 detect-ssl

* 新增示例 [path_link example/websocket/server/chat-multi example/websocket/server/chat-multi]

* `async_echo` 支持仅可移动的处理函数

* 移除 cppcon2018 示例。



[*Fixes]

* ([issue 38]) 改进对 SSL 短读取的处理方式。

* ([issue 1223]) HTTP 读取在发生错误时正确计数字节数。

* ([issue 1247]) 更新 `ssl_stream`。
  for Asio changes

* ([issue 1279]) 启用对...的显式实例化
  `websocket::stream`

* ([issue 1290]) 不再使用已弃用的 Asio 接口

* ([issue 1306]) `http::message`
  is not-a `boost::empty_value`

* ([issue 1306]) `test::stream`
  has fewer dependencies

* ([issue 1358]) 关闭时销毁残留的 WebSocket 操作

* ([issue 1365]) 处理函数包装器提前对参数进行退化处理。

* ([issue 1408]) `session_alloc`
  is thread-safe

* ([issue 1414]) Boost.System 为仅头文件库。

* ([issue 1418]) `test::stream`
  maintains a handler work guard

* ([issue 1445]) 修复 posix_file::close 对 EINTR 的处理。

* ([issue 1460]) 大型 WebSocket Upgrade 响应不再触发溢出问题。

* 复用 HTTP 解析器时会返回错误。

* 处理函数绑定包装器使用关联分配器。

* `buffers_cat`
  correctly skips empty buffers when iterated

* `ostream`
  does not overflow or exceed the dynamic buffer's maximum size

* 修复...
  `test::stream::async_read`

* `file_mode::append_existing`
  works correctly

* 对于暂停的 WebSocket 操作，系统会保持一个处理函数的工作保护器。

* 默认构造的迭代器的所有行为均符合标准规范。

[/-----------------------------------------------------------------------------]

[heading Boost 1.69]

[*New Videos]

[block'''
<mediaobject>
  <videoobject>
    <videodata fileref="https://www.youtube.com/embed/7FQwAjELMek"
        align="center" contentwidth="448" contentdepth="252"/>
  </videoobject>
</mediaobject>
''']

[*New Features]

* ([issue 1133]) 新增 `BOOST_BEAST_USE_STD_STRING_VIEW` 宏定义。

[*Examples]

* 新增 WebSocket 服务器和基于浏览器的客户端：example/cppcon2018

[*Fixes]

* ([issue 1245]) 修复罕见的 UTF-8 验证错误问题。

* ([issue 1237]) 在客户端示例中增加证书验证功能。

* ([issue 1233]) 改用 [@boost:/doc/html/core/empty_value.html `boost::empty_value`]。

* ([issue 1091]) 修复示例中 WebSocket 升级时的计时器问题。

* ([issue 1270]) [link beast.ref.boost__beast__http__basic_fields `basic_fields`] 改用侵入式基类钩子实现。

* ([issue 1267]) 修复超出范围的十六进制值解析问题。

* ([issue 1263]) 修复缓冲区迭代器中未初始化的比较操作。

* ([issue 1288]) 移除示例中多余的 strand

* 针对 http-server-fast 与 libstdc++ 的临时解决方案

* 对 `BOOST_NO_EXCEPTIONS` 的部分支持

[*Experimental]

* 新增 `timeout_socket`




[heading Boost 1.68]

该版本修复实现中所有组合操作缺少执行器工作保护器的问题。若用户遇到与异步完成处理函数相关的崩溃，建议升级至此版本。此外，该版本还改进客户端模式下用于掩码输出 WebSocket 帧的随机数生成机制，解决 Bishop Fox 的 Beast 混合评估报告中描述的安全漏洞。

[*New Features]

`<beast/experimental>` 目录中的功能不属于稳定公共接口的一部分，但仍可使用。这些功能在后续版本中可能发生变更。

* ([issue 1108]) 新增 [link beast.ref.boost__beast__flat_stream `flat_stream`]，用于解决 SSL 流的性能限制问题。

* ([issue 1151], [issue 595]) 新增 [link beast.ref.boost__beast__http__icy_stream `http::icy_stream`] 流过滤器，用于解析 ICY HTTP 响应握手。

* 新增 [link beast.ref.boost__beast__ssl_stream `ssl_stream`]，用于提高 SSL 性能及支持移动构造。

* New
  [link beast.ref.boost__beast__test__error `test::connect`],
  [link beast.ref.boost__beast__test__error `test::error`],
  [link beast.ref.boost__beast__test__error `test::fail_count`], and
  [link beast.ref.boost__beast__test__error `test::stream`] utilities for writing unit tests.

* 新增 [link beast.ref.boost__beast__http__is_mutable_body_writer `http::is_mutable_body_writer`] 元函数。

* 新增 [link beast.ref.boost__beast__websocket__seed_prng `websocket::seed_prng`]，用于手动向伪随机数生成器提供熵源。

* 新增 [link beast.ref.boost__beast__websocket__stream.secure_prng `websocket::stream::secure_prng`]，用于控制连接是否使用安全伪随机数生成器。

[*Improvements]

* 生成的 WebSocket 掩码默认使用安全伪随机数生成器。

* 改进 [link beast.ref.boost__beast__buffers_adaptor `buffers_adaptor`]

* ([issue 1188]) 为 MSVC 构建设置 "/permissive-" 编译选项。

* ([issue 1109]) 示例 HTTP 服务器的文档根路径改用共享字符串。 

* ([issue 1079]) 为 `handler_ptr` 新增 `has_value` 方法。

[*Fixes]

* ([issue 1073]) 修复高级服务器示例中的数据竞争问题。

* ([issue 1076]) 组合操作改用 executor_work_guard。

* ([issue 1079]) 移除多余的断言。

* ([issue 1113]) 为基于消息的 HTTP 写入操作新增 `const` 与非 `const` 版本的重载。

* ([issue 1119]) 修复未使用变量的编译警告。

* ([issue 1121]) 示例使用与指纹匹配的根证书。

* ([issue 1141]) 整理组合操作文档

* ([issue 1186]) 在 set_option 示例中增加错误检查

* ([issue 1210]) 修复 http_server_stackless_ssl.cpp 示例中的问题

* ([issue 1211]) 修复 parse_dec 算法中的问题

* ([issue 1214]) 屏蔽 ubsan 的误报错误

* 整理 WebSocket 流的 Java 文档

* 修复 [link beast.ref.boost__beast__bind_handler `bind_handler`] 中仅可移动参数的处理问题

* 修复 [link beast.ref.boost__beast__http__parser `http::parser`] 构造函数的 Java 文档错误

* 修复 [link beast.ref.boost__beast__buffers_adaptor `buffers_adaptor`] 迭代器值类型错误

* 修复 [link beast.ref.boost__beast__buffers_adaptor.max_size `buffers_adaptor::max_size`] 中的问题

* 修复 [link beast.ref.boost__beast__buffers_prefix `buffers_prefix`] 迭代器递减操作中的问题

* 修复 __Fields__ 与 __FieldsWriter__ 概念的文档描述

* 修复 __BodyReader__ 构造函数的要求文档

[*Breaking Changes]

* 移除已弃用的 `serializer::reader_impl`

* 移除已弃用的 __Body__ 的 `reader` 与 `writer` 构造函数签名





[heading Boost 1.67]

该版本修复了 [link beast.ref.boost__beast__websocket__stream `websocket::stream`] 中可能导致断言或未定义行为的重大缺陷，建议用户升级到最新的 Boost 版本。

[*New Features]

* 整个库支持仅可移动的完成处理函数

* ([issue 899]) 高级服务器示例支持 WebSocket 空闲 Ping 及超时处理。

* ([issue 849]) WebSocket permessage-deflate 支持现为编译时选项。
  feature.  This adds an additional `bool` template parameter to
  [link beast.ref.boost__beast__websocket__stream `websocket::stream`]
  When `deflateSupported` is `true`, the stream will be capable of
  negotiating the permessage-deflate websocket extension per the
  configured run-time settings.
  When `deflateSupported` is `false`, the stream will never negotiate
  the permessage-deflate websocket extension. Furthermore, all of the
  code necessary for implementing the permessage-deflate extension
  will be excluded from function instantiations. Programs which set
  `deflateSupported` to `false` when instantiating streams will be smaller.

* ([issue 949]) WebSocket 错误码经过修订。新增错误码如下：
  [link beast.ref.boost__beast__websocket__error error codes]
  are added for more fine-grained failure outcomes. Messages for error
  codes are more verbose to help pinpoint the problem. Error codes are
  now also mapped to newly added
  [link beast.ref.boost__beast__websocket__condition error conditions]
  to simplify comparisons. The error codes `websocket::error::failed`
  and `websocket::error::handshake_failed` are removed.
  Actions required:
  Code which explicitly compares `error_code` values against
  the constant `websocket::error::handshake_failed` should compare
  against
  [link beast.ref.boost__beast__websocket__condition `websocket::condition::handshake_failed`]
  instead.
  Code which explicitly compares error_code values against the
  constant `websocket::error::failed` should compare
  against
  [link beast.ref.boost__beast__websocket__condition `websocket::condition::protocol_violation`]
  instead.

[*Improvements]

* ([issue 857])
  [link beast.ref.boost__beast__http__basic_fields `http::basic_fields`]
  uses less storage

* ([issue 894])
  [link beast.ref.boost__beast__http__basic_fields `http::basic_fields`]
  exception specifiers are provided

* 实现中不再使用已弃用的 `asio::null_buffers`。

* 新增 [include_file boost/beast/websocket/stream_fwd.hpp] 头文件。

* ([issue 955]) 异步 SSL 检测器示例改用无栈协程实现。

* [link beast.ref.boost__beast__bind_handler `bind_handler`]
  works with boost placeholders

* 示例中设置 `reuse_address(true)`。

* ([issue 1026]) 高级服务器支持通过 SIGINT 或 SIGTERM 信号实现优雅关闭。

* basic_fields 的部分操作现在提供强异常保证。

[*Fixes]

* 修复“warning: ‘const’ type qualifier on return type has no effect”警告。

* ([issue 916]) 整理 `ssl_stream` 的特殊成员函数。

* ([issue 918]) 对 `<algorithm>` 的调用已进行宏保护处理。

* ([issue 954]) 控制回调函数在正确的执行器上被调用。

* ([issue 994]) 修复迭代器版本的 ... 相关问题。
  [link beast.ref.boost__beast__http__basic_fields.erase.overload1 `http::basic_fields::erase`]

* ([issue 992]) 修复示例请求处理函数中的移动后使用问题。

* ([issue 988]) 增加对完成处理函数的类型检查。

* ([issue 985]) 整理代码
  [link beast.ref.boost__beast__bind_handler `bind_handler`]
  doc

* 修复高级服务器示例中的内存泄漏问题。

* ([issue 1000]) 修复 WebSocket 流中的软互斥断言错误。
  This resolves the assert `"ws_.wr_block_ == tok_"`.

* ([issue 1019]) 修复 fallthrough 编译警告。

* ([issue 1024]) 修复 TIME_WAIT 状态下的连接关闭问题。

* ([issue 1030]) 修复大端序平台下的 WebSocket 掩码处理问题。

* 对 basic_fields 中的零长度字符串参数进行安全处理。

* ([issue 1043]) 示例在读取前清空 HTTP 消息对象。

* ([issue 1012]) 为流算法添加 asio_handler_invoke 重载。

* 新增 Access-Control-Expose-Headers 字段常量。

[*API Changes]

* 移除 ... 中非预期的公有成员。
  `handler_ptr`.
  Actions required: don't call non-public members.

* `handler_ptr`
  is a move-only type, with `unique_ptr` semantics.
  Actions required: user-defined composed operations using `handler_ptr`
  to manage state can only be moved, not copied.

* `handler_ptr`
  gives the strong exception guarantee. The constructor signature
  for managed objects constructed by `handler_ptr` now receives a
  `const` reference to the handler. Actions required: Change the
  constructor signature for state objects used with `handler_ptr`
  to receive a `const` reference to the handler.

* ([issue 896])
  [link beast.ref.boost__beast__http__basic_fields `http::basic_fields`]
  does not support fancy pointers

* [link beast.ref.boost__beast__http__parser `http::parser`]
  is no longer [*MoveConstructible]

* ([issue 930]) `http::serializer::reader_impl` 已被弃用，后续将...
  be removed in the next release. Actions required: Call
  [link beast.ref.boost__beast__http__serializer.writer_impl `http::serializer::writer_impl`]
  instead of `serializer::reader_impl`.

* ([issue 884]) 调整 __BodyReader__ 与 __BodyWriter__ 概念的构造函数要求。
  requirements have changed. They now require the header and body
  elements to be passed as distinct
  [link beast.ref.boost__beast__http__header `http::header`]
  and `value_type` objects. This enables the composition of body types.
  The previous single-argument constructors are deprecated and will be
  removed in the next version.
  Actions required: Change user-defined instances of __BodyReader__ or
  __BodyWriter__ constructor signatures to the two-argument form.
  Alternatively. define the macro `BOOST_BEAST_ALLOW_DEPRECATED` in
  the project (which will cause both the new and the deprecated
  signatures to be accepted).

* [link beast.ref.boost__beast__websocket__stream.control_callback `websocket::stream::control_callback`]
  now copies or moves the function object.

* ([issue 1014]) 动态缓冲区的输入区不可修改。
  Actions required: do not attempt to write to input areas of dynamic
  buffers.

* ([issue 941]) `get_lowest_layer` 现为类型别名。
  Actions required: Replace instances of `typename get_lowest_layer<T>::type`
  with `get_lowest_layer<T>`.

[heading Boost 1.66]

* 首次发布。

[endsect]
