Skip to content

Commit 05e5ff6

Browse files
Fix session deinitialization, nil task, and Swift 6 sendable issues
Agent-Logs-Url: https://github.com/nativescript-community/https/sessions/4b252308-9e3b-4ecf-ba98-32f702b528f0 Co-authored-by: farfromrefug <655344+farfromrefug@users.noreply.github.com>
1 parent a3e0c48 commit 05e5ff6

File tree

2 files changed

+41
-31
lines changed

2 files changed

+41
-31
lines changed

packages/https/platforms/ios/src/AlamofireWrapper.swift

Lines changed: 40 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,27 @@ public class AlamofireWrapper: NSObject {
1515

1616
@objc public override init() {
1717
let configuration = URLSessionConfiguration.default
18-
self.session = Session(configuration: configuration)
18+
// Create session with ServerTrustManager that allows all hosts by default
19+
let serverTrustManager = ServerTrustManager(allHostsMustBeEvaluated: false, evaluators: [:])
20+
self.session = Session(configuration: configuration, serverTrustManager: serverTrustManager)
1921
self.requestSerializer = RequestSerializer()
2022
self.responseSerializer = ResponseSerializer()
2123
super.init()
2224
}
2325

2426
@objc public init(configuration: URLSessionConfiguration) {
25-
self.session = Session(configuration: configuration)
27+
// Create session with ServerTrustManager that allows all hosts by default
28+
let serverTrustManager = ServerTrustManager(allHostsMustBeEvaluated: false, evaluators: [:])
29+
self.session = Session(configuration: configuration, serverTrustManager: serverTrustManager)
2630
self.requestSerializer = RequestSerializer()
2731
self.responseSerializer = ResponseSerializer()
2832
super.init()
2933
}
3034

3135
@objc public init(configuration: URLSessionConfiguration, baseURL: URL?) {
32-
self.session = Session(configuration: configuration)
36+
// Create session with ServerTrustManager that allows all hosts by default
37+
let serverTrustManager = ServerTrustManager(allHostsMustBeEvaluated: false, evaluators: [:])
38+
self.session = Session(configuration: configuration, serverTrustManager: serverTrustManager)
3339
self.requestSerializer = RequestSerializer()
3440
self.responseSerializer = ResponseSerializer()
3541
super.init()
@@ -68,20 +74,16 @@ public class AlamofireWrapper: NSObject {
6874
private func recreateSession() {
6975
let configuration = session.sessionConfiguration
7076

71-
if let secPolicy = securityPolicy {
72-
// Create a server trust manager with our security policy
73-
let evaluators: [String: ServerTrustEvaluating] = [:] // Will be filled dynamically per request
74-
let serverTrustManager = ServerTrustManager(allHostsMustBeEvaluated: false, evaluators: evaluators)
75-
76-
// Create new session with server trust manager
77-
session = Session(
78-
configuration: configuration,
79-
serverTrustManager: serverTrustManager
80-
)
81-
} else {
82-
// Create session without server trust manager
83-
session = Session(configuration: configuration)
84-
}
77+
// Create a server trust manager with our security policy
78+
// Use allHostsMustBeEvaluated: false to allow default trust evaluation for non-pinned hosts
79+
let serverTrustManager = ServerTrustManager(allHostsMustBeEvaluated: false, evaluators: [:])
80+
81+
// Create new session with server trust manager
82+
// Keep the session alive by replacing it atomically
83+
session = Session(
84+
configuration: configuration,
85+
serverTrustManager: serverTrustManager
86+
)
8587
}
8688

8789
/// Get dispatch queue for responses
@@ -209,12 +211,14 @@ public class AlamofireWrapper: NSObject {
209211
}
210212
}
211213

212-
// Store reference to task before async callback
213-
let task = afRequest.task
214-
215214
// Response handling
216215
let respQueue = responseQueue(mainThread: respMainThread)
217-
afRequest.response(queue: respQueue) { response in
216+
afRequest.response(queue: respQueue) { [weak self] response in
217+
guard let self = self else { return }
218+
219+
// Get the actual task from the DataRequest (available after request started)
220+
let task = response.request?.task
221+
218222
if let error = response.error {
219223
let nsError = self.createNSError(from: error, response: response.response, data: response.data)
220224
failure(task, nsError)
@@ -230,7 +234,8 @@ public class AlamofireWrapper: NSObject {
230234
}
231235
}
232236

233-
return task
237+
// Return the task (it will be available after request starts)
238+
return afRequest.task
234239
}
235240

236241
// MARK: - Multipart Form Data
@@ -311,12 +316,14 @@ public class AlamofireWrapper: NSObject {
311316
}
312317
}
313318

314-
// Store reference to task before async callback
315-
let task = afRequest.task
316-
317319
// Response handling
318320
let respQueue = responseQueue(mainThread: respMainThread)
319-
afRequest.response(queue: respQueue) { response in
321+
afRequest.response(queue: respQueue) { [weak self] response in
322+
guard let self = self else { return }
323+
324+
// Get the actual task from the DataRequest (available after request started)
325+
let task = response.request?.task
326+
320327
if let error = response.error {
321328
let nsError = self.createNSError(from: error, response: response.response, data: response.data)
322329
failure(task, nsError)
@@ -332,7 +339,7 @@ public class AlamofireWrapper: NSObject {
332339
}
333340
}
334341

335-
return task
342+
return afRequest.task
336343
}
337344

338345
// MARK: - Upload Tasks
@@ -724,11 +731,13 @@ public class AlamofireWrapper: NSObject {
724731
}
725732
}
726733

727-
// Store reference to task before async callback
728-
let task = afRequest.task
729-
730734
// Response handling
731-
afRequest.response(queue: .main) { response in
735+
afRequest.response(queue: .main) { [weak self] response in
736+
guard let self = self else { return }
737+
738+
// Get the actual task from the DataRequest (available after request started)
739+
let task = response.request?.task
740+
732741
if let error = response.error {
733742
let nsError = self.createNSError(from: error, response: response.response, data: response.data)
734743
failure(task, nsError)

packages/https/platforms/ios/src/SecurityPolicyWrapper.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Alamofire
33

44
@objc(SecurityPolicyWrapper)
55
@objcMembers
6+
@unchecked Sendable
67
public class SecurityPolicyWrapper: NSObject {
78

89
private var pinnedCertificatesData: [Data] = []

0 commit comments

Comments
 (0)