@@ -1748,6 +1748,50 @@ struct parser_test
17481748 pr.get ().payload (), payload::chunked);
17491749 }
17501750
1751+ void
1752+ testBodyWithTrailingData ()
1753+ {
1754+ parser_config cfg{false };
1755+ cfg.headers .max_size = 100 ;
1756+ cfg.min_buffer = 100 ;
1757+ auto pcfg = make_parser_config (cfg);
1758+
1759+ auto const check = [&pcfg](
1760+ core::string_view octets,
1761+ core::string_view body)
1762+ {
1763+ response_parser pr (pcfg);
1764+ pr.reset ();
1765+ pr.start ();
1766+ pr.commit (capy::buffer_copy (
1767+ pr.prepare (),
1768+ capy::const_buffer (
1769+ octets.data (), octets.size ())));
1770+
1771+ system::error_code ec;
1772+ pr.parse (ec);
1773+ BOOST_TEST (! ec);
1774+ BOOST_TEST (pr.got_header ());
1775+ pr.parse (ec);
1776+ BOOST_TEST (! ec);
1777+ BOOST_TEST (pr.is_complete ());
1778+ BOOST_TEST_EQ (pr.body (), body);
1779+ };
1780+
1781+ check (
1782+ " HTTP/1.1 200 OK\r\n "
1783+ " Content-Length: 2\r\n "
1784+ " \r\n "
1785+ " ok"
1786+ " HTTP/1.1 200 OK\r\n " , " ok" );
1787+
1788+ check (
1789+ " HTTP/1.1 200 OK\r\n "
1790+ " Content-Length: 2\r\n "
1791+ " \r\n "
1792+ " okX" , " ok" );
1793+ }
1794+
17511795 void
17521796 run ()
17531797 {
@@ -1764,6 +1808,7 @@ struct parser_test
17641808 testMultipleMessageInPlaceChunked ();
17651809 testSetBodyLimit ();
17661810 testAccessHeaderAfterBodyError ();
1811+ testBodyWithTrailingData ();
17671812#else
17681813 // For profiling
17691814 for(int i = 0; i < 10000; ++i )
0 commit comments