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 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 sr{msg};
http::write(stream_, sr, ec_);
}
+
+ void
+ send_chunk_headers()
+ {
+ http::responsehttp::empty_body res {http::status::ok, 11};
+ res.set(http::field::server, "Beast");
+ res.chunked(true);
+
+ http::response_serializerhttp::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_socketboost::asio::ip::tcp]’:
.../server-sync/src/beast.cpp:164:28: required from ‘void
handle_request(boost::beast::string_view, boost::beast::http::request&&, Send&&) [with B
ody = boost::beast::http::basic_string_body<char>; Allocator =
std::allocator<char>; Send =
send_lambdaboost::asio::ip::tcp >&;
boost::beast::string_view = boost::basic_string_view >; boost::beast::http::request =
boost::beast::http::message >]’
.../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_socketboost::asio::ip::tcp&,
boost::beast::http::chunk_bodyboost::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/c...
[1]
https://www.boost.org/doc/libs/1_71_0/libs/beast/example/http/server/sync/ht...