diff --git a/include/boost/http_proto/serializer.hpp b/include/boost/http_proto/serializer.hpp index a289cf10..70a9d947 100644 --- a/include/boost/http_proto/serializer.hpp +++ b/include/boost/http_proto/serializer.hpp @@ -317,11 +317,15 @@ struct serializer::stream BOOST_HTTP_PROTO_DECL std::size_t - capacity() const; + capacity() const noexcept; BOOST_HTTP_PROTO_DECL std::size_t - size() const; + size() const noexcept; + + BOOST_HTTP_PROTO_DECL + bool + is_full() const noexcept; BOOST_HTTP_PROTO_DECL buffers_type diff --git a/src/serializer.cpp b/src/serializer.cpp index 5fb6633d..9c6c014a 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -540,7 +540,7 @@ start_stream( std::size_t serializer:: stream:: -capacity() const +capacity() const noexcept { return sr_->tmp0_.capacity(); } @@ -548,11 +548,22 @@ capacity() const std::size_t serializer:: stream:: -size() const +size() const noexcept { return sr_->tmp0_.size(); } +bool +serializer:: +stream:: +is_full() const noexcept +{ + if( sr_->is_chunked_ ) + return capacity() < chunked_overhead_ + 1; + + return capacity() == 0; +} + auto serializer:: stream:: diff --git a/test/unit/serializer.cpp b/test/unit/serializer.cpp index bfbfd304..425ae855 100644 --- a/test/unit/serializer.cpp +++ b/test/unit/serializer.cpp @@ -278,10 +278,18 @@ struct serializer_test BOOST_TEST_GT(stream.capacity(), 0); BOOST_TEST_LE(stream.capacity(), sr_capacity); + auto const N = stream.size() + stream.capacity(); + auto check_N = [&] + { + BOOST_TEST_EQ( + stream.capacity() + stream.size(), N); + }; + std::vector s; // stores complete output auto prepare_chunk = [&] { + BOOST_TEST(!stream.is_full()); auto mbs = stream.prepare(); auto bs = buffers::buffer_size(mbs); @@ -294,12 +302,19 @@ struct serializer_test mbs, buffers::const_buffer(body.data(), bs)); stream.commit(bs); + if( bs < body.size() ) + BOOST_TEST(stream.is_full()); + else + BOOST_TEST(!stream.is_full()); + body.remove_prefix(bs); if(! res.chunked() ) BOOST_TEST_EQ(stream.size(), bs); else // chunk overhead: header + \r\n BOOST_TEST_EQ(stream.size(), bs + 18 + 2); + + check_N(); }; auto consume_body_buffer = [&]( @@ -348,6 +363,7 @@ struct serializer_test for(auto pos = cbs.begin(); pos != end; ++pos) consume_body_buffer(*pos); BOOST_TEST_EQ(stream.size(), 0); + check_N(); } BOOST_TEST_THROWS(stream.close(), std::logic_error); @@ -695,6 +711,7 @@ struct serializer_test auto mbs = stream.prepare(); BOOST_TEST_GT( buffers::buffer_size(mbs), 0); + BOOST_TEST(!stream.is_full()); BOOST_TEST_THROWS( stream.commit(0), std::logic_error); @@ -752,7 +769,7 @@ struct serializer_test buffers::const_buffer( chunk.data(), chunk.size())); - + BOOST_TEST(!stream.is_full()); BOOST_TEST_GT(n, 0); stream.commit(n); num_written += n; @@ -760,6 +777,7 @@ struct serializer_test }; BOOST_TEST_THROWS(push(), std::length_error); + BOOST_TEST(stream.is_full()); } }