Skip to content

Commit ef93a9e

Browse files
committed
nsurlsession fix default timeout
1 parent b6f0bc1 commit ef93a9e

3 files changed

Lines changed: 13 additions & 5 deletions

File tree

backends/nsurlsession/src/async.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use nyquest_interface::client::ClientOptions;
77
use nyquest_interface::r#async::{futures_io, AsyncBackend, AsyncClient, AsyncResponse};
88
use nyquest_interface::{Error as NyquestError, Result as NyquestResult};
99
use objc2::runtime::ProtocolObject;
10+
use objc2_foundation::NSURLSessionTaskState;
1011
use waker::AsyncWaker;
1112

1213
pub(crate) mod waker;
@@ -81,7 +82,11 @@ impl futures_io::AsyncRead for NSUrlSessionAsyncResponse {
8182
let read_len = inner.shared.with_response_buffer_for_stream_mut(|data| {
8283
let read_len = if data.len() > buf.len() {
8384
unsafe {
84-
inner.task.suspend();
85+
// Triggering a suspend when the task is already suspended can cause it to not
86+
// wake up.
87+
if inner.task.state() == NSURLSessionTaskState::Running {
88+
inner.task.suspend();
89+
}
8590
}
8691
buf.len()
8792
} else {

backends/nsurlsession/src/blocking.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ impl std::io::Read for NSUrlSessionBlockingResponse {
3030
let read_len = inner.shared.with_response_buffer_for_stream_mut(|data| {
3131
let read_len = if data.len() > buf.len() {
3232
unsafe {
33+
// Triggering a suspend when the task is already suspended can cause it to
34+
// not wake up.
3335
if inner.task.state() == NSURLSessionTaskState::Running {
3436
inner.task.suspend();
3537
}

backends/nsurlsession/src/client.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use objc2::runtime::ProtocolObject;
88
use objc2::AllocAnyThread;
99
use objc2_foundation::{
1010
ns_string, NSCharacterSet, NSData, NSDictionary, NSMutableCharacterSet, NSMutableURLRequest,
11-
NSString, NSURLRequestCachePolicy, NSUTF8StringEncoding, NSURL,
11+
NSString, NSTimeInterval, NSURLRequestCachePolicy, NSUTF8StringEncoding, NSURL,
1212
};
1313

1414
use crate::challenge::BypassServerVerifyDelegate;
@@ -34,9 +34,10 @@ impl NSUrlSessionClient {
3434
if !options.use_cookies {
3535
config.setHTTPShouldSetCookies(false);
3636
}
37-
if let Some(request_timeout) = options.request_timeout {
38-
config.setTimeoutIntervalForRequest(request_timeout.as_secs_f64());
39-
}
37+
let timeout = options
38+
.request_timeout
39+
.map_or(NSTimeInterval::MAX, |t| t.as_secs_f64());
40+
config.setTimeoutIntervalForRequest(timeout);
4041
if !options.default_headers.is_empty() || options.user_agent.is_some() {
4142
let headers = options
4243
.default_headers

0 commit comments

Comments
 (0)