Hi,

The `http::make_chunk()` function returns a specialization of
`http::chunk_body` that meets the requirements of a
`ConstBufferSequence` in Asio:
https://www.boost.org/doc/libs/1_85_0/doc/html/boost_asio/reference/ConstBufferSequence.html.

Instead of passing this to `http::write`, you should directly use
`asio::write` to write the data to the stream.

Regards,
Mohammad

On Wed, May 29, 2024 at 2:04 AM Max D via Boost-users
<boost-users@lists.boost.org> wrote:
>
> 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 mailing list
> Boost-users@lists.boost.org
> https://lists.boost.org/mailman/listinfo.cgi/boost-users
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
https://lists.boost.org/mailman/listinfo.cgi/boost-users

Reply via email to