-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathSafeRequestExecutor.swift
60 lines (48 loc) · 1.89 KB
/
SafeRequestExecutor.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import Foundation
#if canImport(WordPressAPIInternal)
import WordPressAPIInternal
#endif
#if os(Linux)
import FoundationNetworking
#endif
public protocol SafeRequestExecutor: RequestExecutor, Sendable {
func execute(_ request: WpNetworkRequest) async -> Result<WpNetworkResponse, RequestExecutionError>
}
extension SafeRequestExecutor {
public func execute(request: WpNetworkRequest) async throws -> WpNetworkResponse {
let result = await execute(request)
return try result.get()
}
}
extension URLSession: RequestExecutor {
public func uploadMedia(mediaUploadRequest: MediaUploadRequest) async throws -> WpNetworkResponse {
try WpNetworkResponse(body: Data(), statusCode: 500, headerMap: .fromMap(hashMap: [:]))
}
}
extension URLSession: SafeRequestExecutor {
public func execute(_ request: WpNetworkRequest) async -> Result<WpNetworkResponse, RequestExecutionError> {
let (data, response): (Data, URLResponse)
do {
(data, response) = try await self.data(for: request.asURLRequest())
} catch {
return .failure(.RequestExecutionFailed(statusCode: nil, reason: error.localizedDescription))
}
// swiftlint:disable:next force_cast
let urlResponse = response as! HTTPURLResponse
let headerMap: WpNetworkHeaderMap
do {
headerMap = try WpNetworkHeaderMap.fromMap(hashMap: urlResponse.httpHeaders)
} catch is WpNetworkHeaderMapError {
return .failure(.RequestExecutionFailed(statusCode: nil, reason: "Invalid header"))
} catch {
return .failure(.RequestExecutionFailed(statusCode: nil, reason: "Unknown error: \(error)"))
}
return .success(
WpNetworkResponse(
body: data,
statusCode: UInt16(urlResponse.statusCode),
headerMap: headerMap
)
)
}
}