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 * Use automatically deduced return types for all async operations
* Support Concepts for completion token params * Support Concepts for completion token params
* https_get example sends the Host header * 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(); timer.cancel();
} }
void
time_out()
{
timed_out = true;
change_status(status::closed);
close_socket(get_lowest_layer(stream()));
}
// Called just before sending // Called just before sending
// the first frame of each message // the first frame of each message
void void
@@ -516,8 +524,7 @@ private:
switch(impl.status_) switch(impl.status_)
{ {
case status::handshake: case status::handshake:
impl.timed_out = true; impl.time_out();
close_socket(get_lowest_layer(impl.stream()));
return; return;
case status::open: case status::open:
@@ -537,14 +544,11 @@ private:
return; return;
} }
// timeout impl.time_out();
impl.timed_out = true;
close_socket(get_lowest_layer(impl.stream()));
return; return;
case status::closing: case status::closing:
impl.timed_out = true; impl.time_out();
close_socket(get_lowest_layer(impl.stream()));
return; return;
case status::closed: 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 void
run() override run() override
{ {
testIdlePing(); testIdlePing();
testIssue1729(); testIssue1729();
testCloseWhileRead();
} }
}; };