2024-10-16 16:00:46 +02:00
|
|
|
import tutasdk
|
|
|
|
|
|
|
|
public class SdkRestClient: RestClient {
|
2025-03-10 11:53:45 +01:00
|
|
|
private let urlSession: URLSession
|
2025-03-11 16:50:07 +01:00
|
|
|
public init(urlSession: URLSession) { self.urlSession = urlSession }
|
2024-10-16 16:00:46 +02:00
|
|
|
public func requestBinary(url: String, method: tutasdk.HttpMethod, options: tutasdk.RestClientOptions) async throws -> tutasdk.RestResponse {
|
2025-05-13 16:06:15 +02:00
|
|
|
do {
|
|
|
|
var request = URLRequest(url: URL(string: url)!)
|
|
|
|
request.httpMethod =
|
|
|
|
switch method {
|
|
|
|
case .get: "get"
|
|
|
|
case .post: "post"
|
|
|
|
case .delete: "delete"
|
|
|
|
case .put: "put"
|
|
|
|
}
|
|
|
|
for (key, value) in options.headers { request.setValue(value, forHTTPHeaderField: key) }
|
|
|
|
request.httpBody = options.body
|
|
|
|
let (data, urlResponse) = try await self.urlSession.data(for: request)
|
|
|
|
let httpUrlResponse = urlResponse as! HTTPURLResponse // We should only ever receive HTTP URLs
|
2025-09-30 15:32:08 +02:00
|
|
|
guard let rawHeaders = httpUrlResponse.allHeaderFields as? [String: String] else {
|
2025-05-13 16:06:15 +02:00
|
|
|
throw TUTErrorFactory.createError("Response headers were not a [String:String]")
|
2024-10-16 16:00:46 +02:00
|
|
|
}
|
2025-09-30 15:32:08 +02:00
|
|
|
let normalizedHeaders = Dictionary(uniqueKeysWithValues: rawHeaders.map { (key, value) in (key.lowercased(), value) })
|
|
|
|
return RestResponse(status: UInt32(httpUrlResponse.statusCode), headers: normalizedHeaders, body: data)
|
2025-05-27 15:29:21 +02:00
|
|
|
} catch { throw mapExceptionToError(e: error) }
|
2025-05-13 16:06:15 +02:00
|
|
|
}
|
|
|
|
// see: SdkFileClient::mapExceptionToError
|
|
|
|
private func mapExceptionToError(e: Error) -> RestClientError {
|
|
|
|
// why we don't match on e? see: sdkFileClient::mapExceptionToError
|
|
|
|
TUTSLog("Exception in SdkRestClient: \(e). Assuming .Unknown")
|
2025-10-06 12:19:04 +02:00
|
|
|
if let e = e as? URLError {
|
|
|
|
switch e.code {
|
|
|
|
case .notConnectedToInternet, .timedOut, .cannotFindHost, .networkConnectionLost, URLError.Code.notConnectedToInternet,
|
|
|
|
URLError.Code.dnsLookupFailed:
|
|
|
|
return .NetworkError
|
|
|
|
default: break
|
|
|
|
}
|
|
|
|
}
|
2025-05-13 16:06:15 +02:00
|
|
|
return RestClientError.Unknown
|
2024-10-16 16:00:46 +02:00
|
|
|
}
|
|
|
|
}
|