Boost logo

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