@@ -1776,6 +1776,7 @@ struct parser_test
17761776 BOOST_TEST (! ec);
17771777 BOOST_TEST (pr.is_complete ());
17781778 BOOST_TEST_EQ (pr.body (), body);
1779+ BOOST_TEST (pr.has_buffered_data ());
17791780 };
17801781
17811782 check (
@@ -1792,6 +1793,99 @@ struct parser_test
17921793 " okX" , " ok" );
17931794 }
17941795
1796+ void
1797+ testHasBufferedData ()
1798+ {
1799+ parser_config cfg{false };
1800+ cfg.headers .max_size = 100 ;
1801+ cfg.min_buffer = 100 ;
1802+ auto pcfg = make_parser_config (cfg);
1803+
1804+ auto const check = [&pcfg](
1805+ core::string_view octets,
1806+ core::string_view body,
1807+ bool buffered)
1808+ {
1809+ response_parser pr (pcfg);
1810+ pr.reset ();
1811+ pr.start ();
1812+ pr.commit (capy::buffer_copy (
1813+ pr.prepare (),
1814+ capy::const_buffer (
1815+ octets.data (), octets.size ())));
1816+
1817+ system::error_code ec;
1818+ pr.parse (ec);
1819+ BOOST_TEST (! ec);
1820+ BOOST_TEST (pr.got_header ());
1821+ pr.parse (ec);
1822+ BOOST_TEST (! ec);
1823+ BOOST_TEST (pr.is_complete ());
1824+
1825+ // the body is not counted as buffered data
1826+ BOOST_TEST_EQ (pr.body (), body);
1827+ BOOST_TEST_EQ (pr.has_buffered_data (), buffered);
1828+ };
1829+
1830+ check (
1831+ " HTTP/1.1 200 OK\r\n "
1832+ " Content-Length: 2\r\n "
1833+ " \r\n "
1834+ " ok" , " ok" , false );
1835+
1836+ check (
1837+ " HTTP/1.1 200 OK\r\n "
1838+ " Content-Length: 2\r\n "
1839+ " \r\n "
1840+ " ok"
1841+ " HTTP/1.1 200 OK\r\n " , " ok" , true );
1842+
1843+ check (
1844+ " HTTP/1.1 200 OK\r\n "
1845+ " Content-Length: 2\r\n "
1846+ " \r\n "
1847+ " okX" , " ok" , true );
1848+
1849+ check (
1850+ " HTTP/1.1 200 OK\r\n "
1851+ " Transfer-Encoding: chunked\r\n "
1852+ " \r\n "
1853+ " 2\r\n ok\r\n 0\r\n\r\n " , " ok" , false );
1854+
1855+ check (
1856+ " HTTP/1.1 200 OK\r\n "
1857+ " Transfer-Encoding: chunked\r\n "
1858+ " \r\n "
1859+ " 2\r\n ok\r\n 0\r\n\r\n "
1860+ " GARBAGE" , " ok" , true );
1861+
1862+ check (
1863+ " HTTP/1.1 204 No Content\r\n "
1864+ " \r\n "
1865+ " GARBAGE" , " " , true );
1866+
1867+ {
1868+ response_parser pr (pcfg);
1869+ pr.reset ();
1870+ pr.start ();
1871+ core::string_view octets =
1872+ " HTTP/1.1 200 OK\r\n "
1873+ " Content-Length: 10\r\n "
1874+ " \r\n "
1875+ " 123" ; // body incomplete
1876+ pr.commit (capy::buffer_copy (
1877+ pr.prepare (),
1878+ capy::const_buffer (
1879+ octets.data (), octets.size ())));
1880+ system::error_code ec;
1881+ pr.parse (ec);
1882+ BOOST_TEST (pr.got_header ());
1883+ pr.parse (ec);
1884+ BOOST_TEST (! pr.is_complete ());
1885+ BOOST_TEST (! pr.has_buffered_data ());
1886+ }
1887+ }
1888+
17951889 void
17961890 run ()
17971891 {
@@ -1809,6 +1903,7 @@ struct parser_test
18091903 testSetBodyLimit ();
18101904 testAccessHeaderAfterBodyError ();
18111905 testBodyWithTrailingData ();
1906+ testHasBufferedData ();
18121907#else
18131908 // For profiling
18141909 for(int i = 0; i < 10000; ++i )
0 commit comments