Make sure all accesses to URLSessionTask.currentRequest are crash safe (#172)

This commit is contained in:
Matthias
2025-07-16 03:46:52 +02:00
committed by GitHub
parent 1e354f06f7
commit 1c371d137d
3 changed files with 23 additions and 16 deletions
+1 -1
View File
@@ -253,7 +253,7 @@ extension Atlantis {
// If not found, just generate and cache
switch taskOrConnection {
case let task as URLSessionTask:
guard let request = task.currentRequest,
guard let request = task.currentRequestSafe,
let package = TrafficPackage.buildRequest(sessionTask: task, id: id) else {
print("[Atlantis] ❌ Error: Should build package from URLSessionTask")
return nil
+2 -15
View File
@@ -6,10 +6,6 @@
// Copyright © 2020 Proxyman. All rights reserved.
//
#if os(iOS) || os(macOS)
import class AVFoundation.AVAggregateAssetDownloadTask
#endif
import Foundation
#if os(OSX)
@@ -105,17 +101,8 @@ public final class TrafficPackage: Codable, CustomDebugStringConvertible, Serial
// MARK: - Builder
static func buildRequest(sessionTask: URLSessionTask, id: String) -> TrafficPackage? {
// If sessionTask is AVAggregateAssetDownloadTask,
// accessing currentRequest crashes with not supported error,
// so we need to check for it in advance.
#if os(iOS) || os(macOS)
if sessionTask is AVAggregateAssetDownloadTask {
return nil
}
#endif
guard let currentRequest = sessionTask.currentRequest,
let request = Request(currentRequest) else { return nil }
guard let currentRequest = sessionTask.currentRequestSafe,
let request = Request(currentRequest) else { return nil }
// Check if it's a websocket
if let websocketClass = NSClassFromString("__NSURLSessionWebSocketTask"),
@@ -0,0 +1,20 @@
import Foundation
#if os(iOS) || os(macOS)
import class AVFoundation.AVAggregateAssetDownloadTask
#endif
extension URLSessionTask {
var currentRequestSafe: URLRequest? {
// If sessionTask is AVAggregateAssetDownloadTask,
// accessing currentRequest crashes with not supported error,
// so we need to check for it in advance.
#if os(iOS) || os(macOS)
if self is AVAggregateAssetDownloadTask {
return nil
}
#endif
return currentRequest
}
}