Skip to content

Commit a1edabd

Browse files
authored
backend/nsurlsession: fix double suspended task not being waken up, fix default timeout (#20)
* nsurlsession fix double suspended task not being waken up * nsurlsession fix default timeout
1 parent b493c14 commit a1edabd

3 files changed

Lines changed: 17 additions & 6 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: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use nyquest_interface::blocking::{BlockingBackend, BlockingClient, BlockingRespo
22
use nyquest_interface::client::ClientOptions;
33
use nyquest_interface::{Error as NyquestError, Result as NyquestResult};
44
use objc2::runtime::ProtocolObject;
5+
use objc2_foundation::NSURLSessionTaskState;
56
use waker::BlockingWaker;
67

78
pub(crate) mod waker;
@@ -29,7 +30,11 @@ impl std::io::Read for NSUrlSessionBlockingResponse {
2930
let read_len = inner.shared.with_response_buffer_for_stream_mut(|data| {
3031
let read_len = if data.len() > buf.len() {
3132
unsafe {
32-
inner.task.suspend();
33+
// Triggering a suspend when the task is already suspended can cause it to
34+
// not wake up.
35+
if inner.task.state() == NSURLSessionTaskState::Running {
36+
inner.task.suspend();
37+
}
3338
}
3439
buf.len()
3540
} else {

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)