Using `asio::deferred` as a completion token defers the initiation of
operations and creates a lazy operation which might even be discarded.
We need to move mutating operations to the initiator function objects or
the constructor of operation objects, which are guaranteed to run when
the deferred operation is launched.
- websocket supports cancellation.
- Iterating test for ws cancellation.
- Only terminal cancellation is forwarded by default.
- basic_stream supports cancellation.
- supported cancellation is documented.
- http cancellation additions.
- Added cancellation_slot tests to http, utils and saved_handler.
- Added post to write.cpp, to avoid SIGSEV in test.
- Refresher describes cancellation in more detail.
http::basic_fields::set_t::size() is unused
core::multi_buffer::list_type::size() is only compared to 1 (in shrink_to_fit()); compare iterators instead.
close#2498
The maximum number of bytes to write using TransmitFile cannot be
greater than INT_MAX - 1, otherwise the function fails with WSAEINVAL.
https://docs.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-transmitfile
The issue can be reproduced using the http-server-sync example, by
sending a GET request for a file larger than INTMAX.
e.g:
$ curl -v http://127.0.0.1:8080/ubuntu.iso -o ubuntu.iso
* Trying 127.0.0.1:8080...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /ubuntu.iso HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.83.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: Boost.Beast/330
< Content-Type: application/text
< Content-Length: 3654957056
<
{ [0 bytes data]
* transfer closed with 3654957056 bytes remaining to read
0 3485M 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
* Closing connection 0
curl: (18) transfer closed with 3654957056 bytes remaining to read
Signed-off-by: Petre Pircalabu <ppircalabu@bitdefender.com>
The missing error check leads to completely ignoring the body limit,
as the body limit is compared to the "Content-Length" header inside
the "finish_header" method.
closes#2201
API Changes:
`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 required 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#1956