Skip to content

Instantly share code, notes, and snippets.

@jstn
Created June 6, 2025 18:39
Show Gist options
  • Save jstn/7d0123cfc555ccd062dfee15d92b9f64 to your computer and use it in GitHub Desktop.
Save jstn/7d0123cfc555ccd062dfee15d92b9f64 to your computer and use it in GitHub Desktop.
import Foundation
actor HTTPSURLLoader {
enum Error: Swift.Error {
case unexpectedScheme(String?)
case unexpectedResponseType(URLResponse)
}
private(set) var tasks: [URLRequest: Task<(Data, HTTPURLResponse), any Swift.Error>] = [:]
func load(_ request: URLRequest, session: URLSession) async throws -> (Data, HTTPURLResponse) {
defer {
tasks[request] = nil
}
if let task = tasks[request] {
return try await task.value
}
let task = Task {
guard request.url?.scheme == "https" else {
throw Error.unexpectedScheme(request.url?.scheme)
}
let (data, response) = try await session.data(for: request)
guard let httpResponse = response as? HTTPURLResponse else {
throw Error.unexpectedResponseType(response)
}
return (data, httpResponse)
}
tasks[request] = task
return try await task.value
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment