|
Boost Users : |
From: Max D (vdrummermax_at_[hidden])
Date: 2024-05-28 20:38:16
Hi everyone,
I'm trying to integrate the manual chunked encoding example [0] into the
sync-server example [1] and have difficulties understanding a compiler
error. I thought I might find some help in this mailing list.
Here's my diff to the original example:
@@ -151,6 +151,22 @@ handle_request(
req.method() != http::verb::head)
return send(bad_request("Unknown HTTP-method"));
+ if (req.target().find("/chunked") == 0) {
+ std::vector<uint8_t> data;
+ for (int i = 0; i < 10; i++) {
+ data.push_back(0x00);
+ }
+ net::const_buffer buf {data.data(), 10};
+
+ send.send_chunk_headers();
+
+ for (int i = 0; i < 3; i++) {
+ send.send_chunk(buf);
+ }
+
+ send.send_last_chunk();
+ }
+
// Request path must be absolute and not contain "..".
if( req.target().empty() ||
req.target()[0] != '/' ||
@@ -243,6 +259,29 @@ struct send_lambda
http::serializer<isRequest, Body, Fields> sr{msg};
http::write(stream_, sr, ec_);
}
+
+ void
+ send_chunk_headers()
+ {
+ http::response<http::empty_body> res {http::status::ok, 11};
+ res.set(http::field::server, "Beast");
+ res.chunked(true);
+
+ http::response_serializer<http::empty_body> sr{res};
+ http::write_header(stream_, sr);
+ }
+
+ void
+ send_last_chunk()
+ {
+ http::write(stream_, http::make_chunk_last());
+ }
+
+ void
+ send_chunk(net::const_buffer buf) const
+ {
+ http::write(stream_, http::make_chunk(buf));
+ }
};
// Handles an HTTP server connection
I'm passing a TCP socket as well as the result of http::make_chunk() with a
net::const_buffer to http::write() which, if I understand correctly, is the
same thing that is done in the example.
However, I'm getting the following error when compiling:
.../server-sync/src/beast.cpp: In instantiation of âvoid
send_lambda<Stream>::send_chunk(boost::asio::const_buffer) const [with
Stream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]â:
.../server-sync/src/beast.cpp:164:28: required from âvoid
handle_request(boost::beast::string_view, boost::beast::http::request<Body,
boost::beast::http::basic_fields<Allocator> >&&, Send&&) [with B
ody = boost::beast::http::basic_string_body<char>; Allocator =
std::allocator<char>; Send =
send_lambda<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >&;
boost::beast::string_view = boost::basic_string_view<char, std::char_traits<
char> >; boost::beast::http::request<Body,
boost::beast::http::basic_fields<Allocator> > =
boost::beast::http::message<true,
boost::beast::http::basic_string_body<char>,
boost::beast::http::basic_fields<std::allocator<char> > >]â
.../server-sync/src/beast.cpp:313:57: required from here
.../server-sync/src/beast.cpp:283:20: error: no matching function for call
to âwrite(boost::asio::basic_stream_socket<boost::asio::ip::tcp>&,
boost::beast::http::chunk_body<boost::asio::const_buffer>)
â
283 | http::write(stream_, http::make_chunk(buf));
| ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The same thing happens for the send_last_chunk() call.
Why isn't the call to write() working? Did I misunderstand something in the
example?
I'm using boost 1.71 and am compiling with GCC 10.3.0.
Let me know if you need any more details.
Thanks in advance for any help
Max
--- [0] https://www.boost.org/doc/libs/1_71_0/libs/beast/doc/html/beast/using_http/chunked_encoding.html [1] https://www.boost.org/doc/libs/1_71_0/libs/beast/example/http/server/sync/http_server_sync.cpp
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net