mirror of
https://github.com/boostorg/beast.git
synced 2025-07-29 20:37:31 +02:00
http read_some, async_read_some don't return bytes (API Change):
fix #431, fix #430 The read_some and async_read_some HTTP operations no longer return the number of bytes that the caller should consume. Instead, the bytes are automatically removed from the dynamic buffer as indicated by the parser.
This commit is contained in:
@ -23,6 +23,7 @@ API Changes:
|
||||
* Remove message connection settings
|
||||
* Remove message free functions
|
||||
* Remove obsolete serializer allocator
|
||||
* http read_some, async_read_some don't return bytes
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
@ -35,7 +35,6 @@ template<class Stream, class DynamicBuffer,
|
||||
class read_some_op
|
||||
{
|
||||
int state_ = 0;
|
||||
std::size_t used_ = 0;
|
||||
Stream& s_;
|
||||
DynamicBuffer& b_;
|
||||
basic_parser<isRequest, Derived>& p_;
|
||||
@ -136,7 +135,7 @@ operator()(error_code ec, std::size_t bytes_transferred)
|
||||
b_.commit(bytes_transferred);
|
||||
|
||||
do_parse:
|
||||
used_ += p_.put(b_.data(), ec);
|
||||
b_.consume(p_.put(b_.data(), ec));
|
||||
if(! ec || ec != http::error::need_more)
|
||||
goto do_upcall;
|
||||
ec = {};
|
||||
@ -167,7 +166,7 @@ operator()(error_code ec, std::size_t bytes_transferred)
|
||||
break;
|
||||
}
|
||||
upcall:
|
||||
h_(ec, used_);
|
||||
h_(ec);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@ -221,7 +220,7 @@ public:
|
||||
}
|
||||
|
||||
void
|
||||
operator()(error_code ec, std::size_t bytes_used);
|
||||
operator()(error_code ec);
|
||||
|
||||
friend
|
||||
void* asio_handler_allocate(
|
||||
@ -266,7 +265,7 @@ template<class Stream, class DynamicBuffer,
|
||||
void
|
||||
read_op<Stream, DynamicBuffer,
|
||||
isRequest, Derived, Condition, Handler>::
|
||||
operator()(error_code ec, std::size_t bytes_used)
|
||||
operator()(error_code ec)
|
||||
{
|
||||
switch(state_)
|
||||
{
|
||||
@ -275,7 +274,7 @@ operator()(error_code ec, std::size_t bytes_used)
|
||||
{
|
||||
state_ = 1;
|
||||
return s_.get_io_service().post(
|
||||
bind_handler(std::move(*this), ec, 0));
|
||||
bind_handler(std::move(*this), ec));
|
||||
}
|
||||
state_ = 2;
|
||||
// [[fallthrough]]
|
||||
@ -289,7 +288,6 @@ operator()(error_code ec, std::size_t bytes_used)
|
||||
|
||||
case 2:
|
||||
case 3:
|
||||
b_.consume(bytes_used);
|
||||
if(ec)
|
||||
goto upcall;
|
||||
if(Condition{}(p_))
|
||||
@ -346,7 +344,7 @@ public:
|
||||
}
|
||||
|
||||
void
|
||||
operator()(error_code ec, std::size_t bytes_used);
|
||||
operator()(error_code ec);
|
||||
|
||||
friend
|
||||
void* asio_handler_allocate(
|
||||
@ -391,7 +389,7 @@ template<class Stream, class DynamicBuffer,
|
||||
void
|
||||
read_msg_op<Stream, DynamicBuffer,
|
||||
isRequest, Body, Fields, Handler>::
|
||||
operator()(error_code ec, std::size_t bytes_used)
|
||||
operator()(error_code ec)
|
||||
{
|
||||
auto& d = *d_;
|
||||
switch(d.state)
|
||||
@ -405,7 +403,6 @@ operator()(error_code ec, std::size_t bytes_used)
|
||||
|
||||
case 1:
|
||||
case 2:
|
||||
d.b.consume(bytes_used);
|
||||
if(ec)
|
||||
goto upcall;
|
||||
if(d.p.is_done())
|
||||
@ -428,7 +425,7 @@ template<
|
||||
class SyncReadStream,
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Derived>
|
||||
std::size_t
|
||||
void
|
||||
read_some(
|
||||
SyncReadStream& stream,
|
||||
DynamicBuffer& buffer,
|
||||
@ -440,18 +437,16 @@ read_some(
|
||||
"DynamicBuffer requirements not met");
|
||||
BOOST_ASSERT(! parser.is_done());
|
||||
error_code ec;
|
||||
auto const bytes_used =
|
||||
read_some(stream, buffer, parser, ec);
|
||||
read_some(stream, buffer, parser, ec);
|
||||
if(ec)
|
||||
BOOST_THROW_EXCEPTION(system_error{ec});
|
||||
return bytes_used;
|
||||
}
|
||||
|
||||
template<
|
||||
class SyncReadStream,
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Derived>
|
||||
std::size_t
|
||||
void
|
||||
read_some(
|
||||
SyncReadStream& stream,
|
||||
DynamicBuffer& buffer,
|
||||
@ -463,13 +458,12 @@ read_some(
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
BOOST_ASSERT(! parser.is_done());
|
||||
std::size_t bytes_used = 0;
|
||||
if(buffer.size() == 0)
|
||||
goto do_read;
|
||||
for(;;)
|
||||
{
|
||||
// invoke parser
|
||||
bytes_used += parser.put(buffer.data(), ec);
|
||||
buffer.consume(parser.put(buffer.data(), ec));
|
||||
if(! ec)
|
||||
break;
|
||||
if(ec != http::error::need_more)
|
||||
@ -511,7 +505,6 @@ read_some(
|
||||
break;
|
||||
buffer.commit(bytes_transferred);
|
||||
}
|
||||
return bytes_used;
|
||||
}
|
||||
|
||||
template<
|
||||
@ -520,7 +513,7 @@ template<
|
||||
bool isRequest, class Derived,
|
||||
class ReadHandler>
|
||||
async_return_type<
|
||||
ReadHandler, void(error_code, std::size_t)>
|
||||
ReadHandler, void(error_code)>
|
||||
async_read_some(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& buffer,
|
||||
@ -532,8 +525,7 @@ async_read_some(
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
BOOST_ASSERT(! parser.is_done());
|
||||
async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
async_completion<ReadHandler, void(error_code)> init{handler};
|
||||
detail::read_some_op<AsyncReadStream,
|
||||
DynamicBuffer, isRequest, Derived, handler_type<
|
||||
ReadHandler, void(error_code, std::size_t)>>{
|
||||
@ -582,9 +574,7 @@ read_header(
|
||||
parser.eager(false);
|
||||
while(! parser.is_header_done())
|
||||
{
|
||||
auto const bytes_used =
|
||||
read_some(stream, buffer, parser, ec);
|
||||
buffer.consume(bytes_used);
|
||||
read_some(stream, buffer, parser, ec);
|
||||
if(ec)
|
||||
return;
|
||||
}
|
||||
@ -595,8 +585,7 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Derived,
|
||||
class ReadHandler>
|
||||
async_return_type<
|
||||
ReadHandler, void(error_code)>
|
||||
async_return_type<ReadHandler, void(error_code)>
|
||||
async_read_header(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& buffer,
|
||||
@ -614,7 +603,7 @@ async_read_header(
|
||||
isRequest, Derived, detail::parser_is_header_done,
|
||||
handler_type<ReadHandler, void(error_code)>>{
|
||||
init.completion_handler, stream, buffer, parser}(
|
||||
error_code{}, 0);
|
||||
error_code{});
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
@ -658,9 +647,7 @@ read(
|
||||
parser.eager(true);
|
||||
while(! parser.is_done())
|
||||
{
|
||||
auto const bytes_used = read_some(
|
||||
stream, buffer, parser, ec);
|
||||
buffer.consume(bytes_used);
|
||||
read_some(stream, buffer, parser, ec);
|
||||
if(ec)
|
||||
return;
|
||||
}
|
||||
@ -671,8 +658,7 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Derived,
|
||||
class ReadHandler>
|
||||
async_return_type<
|
||||
ReadHandler, void(error_code)>
|
||||
async_return_type<ReadHandler, void(error_code)>
|
||||
async_read(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& buffer,
|
||||
@ -690,7 +676,7 @@ async_read(
|
||||
isRequest, Derived, detail::parser_is_done,
|
||||
handler_type<ReadHandler, void(error_code)>>{
|
||||
init.completion_handler, stream, buffer, parser}(
|
||||
error_code{}, 0);
|
||||
error_code{});
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
@ -752,8 +738,7 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Body, class Fields,
|
||||
class ReadHandler>
|
||||
async_return_type<
|
||||
ReadHandler, void(error_code)>
|
||||
async_return_type<ReadHandler, void(error_code)>
|
||||
async_read(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& buffer,
|
||||
@ -774,7 +759,7 @@ async_read(
|
||||
isRequest, Body, Fields, handler_type<
|
||||
ReadHandler, void(error_code)>>{
|
||||
init.completion_handler, stream, buffer, msg}(
|
||||
error_code{}, 0);
|
||||
error_code{});
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
|
@ -52,17 +52,13 @@ namespace http {
|
||||
|
||||
@param parser The parser to use.
|
||||
|
||||
@return The number of octets processed from the dynamic buffer.
|
||||
The octets should be removed by calling `consume` on the dynamic
|
||||
buffer after the read completes, regardless of any error.
|
||||
|
||||
@throws system_error Thrown on failure.
|
||||
*/
|
||||
template<
|
||||
class SyncReadStream,
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Derived>
|
||||
std::size_t
|
||||
void
|
||||
read_some(
|
||||
SyncReadStream& stream,
|
||||
DynamicBuffer& buffer,
|
||||
@ -108,16 +104,12 @@ read_some(
|
||||
@param parser The parser to use.
|
||||
|
||||
@param ec Set to the error, if any occurred.
|
||||
|
||||
@return The number of octets processed from the dynamic buffer.
|
||||
The octets should be removed by calling `consume` on the dynamic
|
||||
buffer after the read completes, regardless of any error.
|
||||
*/
|
||||
template<
|
||||
class SyncReadStream,
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Derived>
|
||||
std::size_t
|
||||
void
|
||||
read_some(
|
||||
SyncReadStream& stream,
|
||||
DynamicBuffer& buffer,
|
||||
@ -168,8 +160,7 @@ read_some(
|
||||
completes. Copies will be made of the handler as required.
|
||||
The equivalent function signature of the handler must be:
|
||||
@code void handler(
|
||||
error_code const& error, // result of operation
|
||||
std::size_t bytes_used // the number of bytes to consume
|
||||
error_code const& error // result of operation
|
||||
); @endcode
|
||||
Regardless of whether the asynchronous operation completes
|
||||
immediately or not, the handler will not be invoked from within
|
||||
@ -190,7 +181,7 @@ template<
|
||||
void_or_deduced
|
||||
#else
|
||||
async_return_type<
|
||||
ReadHandler, void(error_code, std::size_t)>
|
||||
ReadHandler, void(error_code)>
|
||||
#endif
|
||||
async_read_some(
|
||||
AsyncReadStream& stream,
|
||||
|
Reference in New Issue
Block a user