Call do_fail from read_some

This commit is contained in:
Vinnie Falco
2017-08-02 14:46:08 -07:00
parent 756de5d703
commit 56a9e6ba9a
2 changed files with 38 additions and 64 deletions

View File

@ -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
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View File

@ -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>