Fix async_close error code when async_read times out

close #1754
This commit is contained in:
Cristian Morales Vega 2019-11-01 23:29:42 +00:00 committed by Vinnie Falco
parent dcc30bcc40
commit 26a156e300
3 changed files with 41 additions and 7 deletions

View File

@ -5,6 +5,7 @@ Version 275:
* Use automatically deduced return types for all async operations
* Support Concepts for completion token params
* https_get example sends the Host header
* Fix async_close error code when async_read times out
--------------------------------------------------------------------------------

View File

@ -210,6 +210,14 @@ struct stream<NextLayer, deflateSupported>::impl_type
timer.cancel();
}
void
time_out()
{
timed_out = true;
change_status(status::closed);
close_socket(get_lowest_layer(stream()));
}
// Called just before sending
// the first frame of each message
void
@ -516,8 +524,7 @@ private:
switch(impl.status_)
{
case status::handshake:
impl.timed_out = true;
close_socket(get_lowest_layer(impl.stream()));
impl.time_out();
return;
case status::open:
@ -537,14 +544,11 @@ private:
return;
}
// timeout
impl.timed_out = true;
close_socket(get_lowest_layer(impl.stream()));
impl.time_out();
return;
case status::closing:
impl.timed_out = true;
close_socket(get_lowest_layer(impl.stream()));
impl.time_out();
return;
case status::closed:

View File

@ -155,11 +155,40 @@ struct timer_test : unit_test::suite
}
}
// https://github.com/boostorg/beast/issues/1729#issuecomment-540481056
void
testCloseWhileRead()
{
net::io_context ioc;
stream<tcp::socket> ws1(ioc);
stream<tcp::socket> ws2(ioc);
test::connect(ws1.next_layer(), ws2.next_layer());
ws1.set_option(websocket::stream_base::timeout{
std::chrono::milliseconds(50),
websocket::stream_base::none(),
false});
ws1.async_accept(net::detached);
ws2.async_handshake(
"localhost", "/", net::detached);
ioc.run();
ioc.restart();
flat_buffer b;
ws1.async_read(b, test::fail_handler(
beast::error::timeout));
ws1.async_close({}, test::fail_handler(
net::error::operation_aborted));
ioc.run();
}
void
run() override
{
testIdlePing();
testIssue1729();
testCloseWhileRead();
}
};