mirror of
https://github.com/boostorg/beast.git
synced 2025-07-30 12:57:31 +02:00
Call do_fail from read_some
This commit is contained in:
@ -11,6 +11,7 @@ WebSocket:
|
|||||||
|
|
||||||
* Remove obsolete frame tests
|
* Remove obsolete frame tests
|
||||||
* Refactor fail/clode code
|
* Refactor fail/clode code
|
||||||
|
* Call do_fail from read_some
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -995,7 +995,10 @@ loop:
|
|||||||
while(! parse_fh(rd_.fh, rd_.buf, code))
|
while(! parse_fh(rd_.fh, rd_.buf, code))
|
||||||
{
|
{
|
||||||
if(code != close_code::none)
|
if(code != close_code::none)
|
||||||
goto do_close;
|
{
|
||||||
|
do_fail(code, error::failed, ec);
|
||||||
|
return bytes_written;
|
||||||
|
}
|
||||||
auto const bytes_transferred =
|
auto const bytes_transferred =
|
||||||
stream_.read_some(
|
stream_.read_some(
|
||||||
rd_.buf.prepare(read_size(
|
rd_.buf.prepare(read_size(
|
||||||
@ -1056,26 +1059,25 @@ loop:
|
|||||||
rd_close_ = true;
|
rd_close_ = true;
|
||||||
detail::read_close(cr_, cb, code);
|
detail::read_close(cr_, cb, code);
|
||||||
if(code != close_code::none)
|
if(code != close_code::none)
|
||||||
goto do_close;
|
{
|
||||||
|
do_fail(code, error::failed, ec);
|
||||||
|
return bytes_written;
|
||||||
|
}
|
||||||
rd_.buf.consume(len);
|
rd_.buf.consume(len);
|
||||||
if(ctrl_cb_)
|
if(ctrl_cb_)
|
||||||
ctrl_cb_(frame_type::close, cr_.reason);
|
ctrl_cb_(frame_type::close, cr_.reason);
|
||||||
if(! wr_close_)
|
if(! wr_close_)
|
||||||
{
|
{
|
||||||
auto cr = cr_;
|
do_fail(
|
||||||
if(cr.code == close_code::none)
|
cr_.code == close_code::none ?
|
||||||
cr.code = close_code::normal;
|
close_code::normal :
|
||||||
cr.reason = "";
|
static_cast<close_code>(cr_.code),
|
||||||
detail::frame_streambuf fb;
|
error::closed,
|
||||||
wr_close_ = true;
|
ec);
|
||||||
write_close<
|
return bytes_written;
|
||||||
flat_static_buffer_base>(fb, cr);
|
|
||||||
boost::asio::write(stream_, fb.data(), ec);
|
|
||||||
failed_ = !!ec;
|
|
||||||
if(failed_)
|
|
||||||
return bytes_written;
|
|
||||||
}
|
}
|
||||||
goto do_close;
|
do_fail(close_code::none, error::closed, ec);
|
||||||
|
return bytes_written;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(rd_.fh.len == 0 && ! rd_.fh.fin)
|
if(rd_.fh.len == 0 && ! rd_.fh.fin)
|
||||||
@ -1127,8 +1129,11 @@ loop:
|
|||||||
(rd_.remain == 0 && rd_.fh.fin &&
|
(rd_.remain == 0 && rd_.fh.fin &&
|
||||||
! rd_.utf8.finish()))
|
! rd_.utf8.finish()))
|
||||||
{
|
{
|
||||||
code = close_code::bad_payload;
|
do_fail(
|
||||||
goto do_close;
|
close_code::bad_payload,
|
||||||
|
error::failed,
|
||||||
|
ec);
|
||||||
|
return bytes_written;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bytes_written += bytes_transferred;
|
bytes_written += bytes_transferred;
|
||||||
@ -1158,8 +1163,11 @@ loop:
|
|||||||
(rd_.remain == 0 && rd_.fh.fin &&
|
(rd_.remain == 0 && rd_.fh.fin &&
|
||||||
! rd_.utf8.finish()))
|
! rd_.utf8.finish()))
|
||||||
{
|
{
|
||||||
code = close_code::bad_payload;
|
do_fail(
|
||||||
goto do_close;
|
close_code::bad_payload,
|
||||||
|
error::failed,
|
||||||
|
ec);
|
||||||
|
return bytes_written;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bytes_written += bytes_transferred;
|
bytes_written += bytes_transferred;
|
||||||
@ -1264,8 +1272,11 @@ loop:
|
|||||||
if(rd_msg_max_ && beast::detail::sum_exceeds(
|
if(rd_msg_max_ && beast::detail::sum_exceeds(
|
||||||
rd_.size, zs.total_out, rd_msg_max_))
|
rd_.size, zs.total_out, rd_msg_max_))
|
||||||
{
|
{
|
||||||
code = close_code::too_big;
|
do_fail(
|
||||||
goto do_close;
|
close_code::too_big,
|
||||||
|
error::failed,
|
||||||
|
ec);
|
||||||
|
return bytes_written;
|
||||||
}
|
}
|
||||||
cb.consume(zs.total_out);
|
cb.consume(zs.total_out);
|
||||||
rd_.size += zs.total_out;
|
rd_.size += zs.total_out;
|
||||||
@ -1281,54 +1292,16 @@ loop:
|
|||||||
rd_.remain == 0 && rd_.fh.fin &&
|
rd_.remain == 0 && rd_.fh.fin &&
|
||||||
! rd_.utf8.finish()))
|
! rd_.utf8.finish()))
|
||||||
{
|
{
|
||||||
code = close_code::bad_payload;
|
do_fail(
|
||||||
goto do_close;
|
close_code::bad_payload,
|
||||||
|
error::failed,
|
||||||
|
ec);
|
||||||
|
return bytes_written;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bytes_written;
|
return bytes_written;
|
||||||
do_close:
|
|
||||||
if(code != close_code::none)
|
|
||||||
{
|
|
||||||
// Fail the connection (per rfc6455)
|
|
||||||
if(! wr_close_)
|
|
||||||
{
|
|
||||||
wr_close_ = true;
|
|
||||||
detail::frame_streambuf fb;
|
|
||||||
write_close<flat_static_buffer_base>(fb, code);
|
|
||||||
boost::asio::write(stream_, fb.data(), ec);
|
|
||||||
failed_ = !!ec;
|
|
||||||
if(failed_)
|
|
||||||
return bytes_written;
|
|
||||||
}
|
|
||||||
websocket_helpers::call_teardown(next_layer(), ec);
|
|
||||||
if(ec == boost::asio::error::eof)
|
|
||||||
{
|
|
||||||
// Rationale:
|
|
||||||
// http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error
|
|
||||||
ec.assign(0, ec.category());
|
|
||||||
}
|
|
||||||
failed_ = !!ec;
|
|
||||||
if(failed_)
|
|
||||||
return bytes_written;
|
|
||||||
ec = error::failed;
|
|
||||||
failed_ = true;
|
|
||||||
return bytes_written;
|
|
||||||
}
|
|
||||||
if(! ec)
|
|
||||||
{
|
|
||||||
websocket_helpers::call_teardown(next_layer(), ec);
|
|
||||||
if(ec == boost::asio::error::eof)
|
|
||||||
{
|
|
||||||
// (See above)
|
|
||||||
ec.assign(0, ec.category());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(! ec)
|
|
||||||
ec = error::closed;
|
|
||||||
failed_ = !!ec;
|
|
||||||
return bytes_written;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class NextLayer>
|
template<class NextLayer>
|
||||||
|
Reference in New Issue
Block a user