From c7e7672bf3cbd38690a2d8a849c2c6edac4e496b Mon Sep 17 00:00:00 2001 From: Francesco <100066266+cranci1@users.noreply.github.com> Date: Sun, 25 May 2025 11:26:08 +0200 Subject: [PATCH] fixed fetchV2 crash --- .../JavaScriptCore+Extensions.swift | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Sora/Utils/Extensions/JavaScriptCore+Extensions.swift b/Sora/Utils/Extensions/JavaScriptCore+Extensions.swift index de71bb5..ab1a40d 100644 --- a/Sora/Utils/Extensions/JavaScriptCore+Extensions.swift +++ b/Sora/Utils/Extensions/JavaScriptCore+Extensions.swift @@ -111,19 +111,33 @@ extension JSContext { let task = URLSession.fetchData(allowRedirects: redirect.boolValue).downloadTask(with: request) { tempFileURL, response, error in if let error = error { Logger.shared.log("Network error in fetchV2NativeFunction: \(error.localizedDescription)", type: "Error") - reject.call(withArguments: [error.localizedDescription]) + DispatchQueue.main.async { + reject.call(withArguments: [error.localizedDescription]) + } return } guard let tempFileURL = tempFileURL else { Logger.shared.log("No data in response", type: "Error") - reject.call(withArguments: ["No data"]) + DispatchQueue.main.async { + reject.call(withArguments: ["No data"]) + } return } - // initialise return Object + + var safeHeaders: [String: String] = [:] + if let httpResponse = response as? HTTPURLResponse { + for (key, value) in httpResponse.allHeaderFields { + if let keyString = key as? String, + let valueString = value as? String { + safeHeaders[keyString] = valueString + } + } + } + var responseDict: [String: Any] = [ "status": (response as? HTTPURLResponse)?.statusCode ?? 0, - "headers": (response as? HTTPURLResponse)?.allHeaderFields ?? [:], + "headers": safeHeaders, "body": "" ] @@ -132,23 +146,29 @@ extension JSContext { if data.count > 10_000_000 { Logger.shared.log("Response exceeds maximum size", type: "Error") - reject.call(withArguments: ["Response exceeds maximum size"]) + DispatchQueue.main.async { + reject.call(withArguments: ["Response exceeds maximum size"]) + } return } if let text = String(data: data, encoding: .utf8) { - responseDict["body"] = text - resolve.call(withArguments: [responseDict]) + DispatchQueue.main.async { + resolve.call(withArguments: [responseDict]) + } } else { - // rather than reject -> resolve with empty body as user can utilise reponse headers. Logger.shared.log("Unable to decode data to text", type: "Error") - resolve.call(withArguments: [responseDict]) + DispatchQueue.main.async { + resolve.call(withArguments: [responseDict]) + } } } catch { Logger.shared.log("Error reading downloaded file: \(error.localizedDescription)", type: "Error") - reject.call(withArguments: ["Error reading downloaded file"]) + DispatchQueue.main.async { + reject.call(withArguments: ["Error reading downloaded file"]) + } } } task.resume()