aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/session.rs23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/session.rs b/src/session.rs
index 4dfb2658..8abda3d1 100644
--- a/src/session.rs
+++ b/src/session.rs
@@ -325,7 +325,7 @@ fn send_stop_request(
return Ok(None);
};
if let Err(err) = stream.set_send_timeout(Some(write_timeout)) {
- if err.kind() != std::io::ErrorKind::InvalidInput {
+ if !stop_timeout_error_allows_wait(&err) {
return Err(err.to_string());
}
}
@@ -354,7 +354,7 @@ fn send_stop_request_inner(
return Ok(None);
};
if let Err(err) = stream.set_recv_timeout(Some(read_timeout)) {
- if err.kind() == std::io::ErrorKind::InvalidInput {
+ if stop_timeout_error_allows_wait(&err) {
return Ok(None);
}
return Err(err);
@@ -368,6 +368,11 @@ fn send_stop_request_inner(
Ok(Some(line))
}
+fn stop_timeout_error_allows_wait(err: &std::io::Error) -> bool {
+ err.kind() == std::io::ErrorKind::InvalidInput
+ || (cfg!(windows) && err.kind() == std::io::ErrorKind::Unsupported)
+}
+
fn stop_request_error_allows_wait(err: &std::io::Error) -> bool {
matches!(
err.kind(),
@@ -505,6 +510,20 @@ mod tests {
}
#[test]
+ fn stop_timeout_invalid_input_waits_for_socket_state() {
+ let err = std::io::Error::from(std::io::ErrorKind::InvalidInput);
+
+ assert!(stop_timeout_error_allows_wait(&err));
+ }
+
+ #[test]
+ fn stop_timeout_unsupported_waits_for_socket_state_only_on_windows() {
+ let err = std::io::Error::from(std::io::ErrorKind::Unsupported);
+
+ assert_eq!(stop_timeout_error_allows_wait(&err), cfg!(windows));
+ }
+
+ #[test]
fn socket_timeouts_are_never_zero_duration() {
assert_eq!(socket_timeout_from_remaining(Duration::ZERO), None);
assert_eq!(