Skip to content

Commit 028715b

Browse files
committed
add URLSession++
1 parent c583270 commit 028715b

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

Sources/Helpers/URLSession+AsyncAwait.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,53 @@
1+
#if compiler(<6)
2+
import HTTPTypes
3+
import HTTPTypesFoundation
4+
5+
#if canImport(FoundationNetworking)
6+
import FoundationNetworking
7+
#endif
8+
9+
private enum HTTPTypeConversionError: Error {
10+
case failedToConvertHTTPRequestToURLRequest
11+
case failedToConvertURLResponseToHTTPResponse
12+
}
13+
14+
extension URLSession {
15+
/// Convenience method to load data using an `HTTPRequest`; creates and resumes a `URLSessionDataTask` internally.
16+
///
17+
/// - Parameter request: The `HTTPRequest` for which to load data.
18+
/// - Returns: Data and response.
19+
public func data(for request: HTTPRequest) async throws -> (Data, HTTPResponse) {
20+
guard let urlRequest = URLRequest(httpRequest: request) else {
21+
throw HTTPTypeConversionError.failedToConvertHTTPRequestToURLRequest
22+
}
23+
let (data, urlResponse) = try await self.data(for: urlRequest)
24+
guard let response = (urlResponse as? HTTPURLResponse)?.httpResponse else {
25+
throw HTTPTypeConversionError.failedToConvertURLResponseToHTTPResponse
26+
}
27+
return (data, response)
28+
}
29+
30+
/// Convenience method to upload data using an `HTTPRequest`, creates and resumes a `URLSessionUploadTask` internally.
31+
///
32+
/// - Parameter request: The `HTTPRequest` for which to upload data.
33+
/// - Parameter bodyData: Data to upload.
34+
/// - Returns: Data and response.
35+
public func upload(
36+
for request: HTTPRequest,
37+
from bodyData: Data
38+
) async throws -> (Data, HTTPResponse) {
39+
guard let urlRequest = URLRequest(httpRequest: request) else {
40+
throw HTTPTypeConversionError.failedToConvertHTTPRequestToURLRequest
41+
}
42+
let (data, urlResponse) = try await self.upload(for: urlRequest, from: bodyData)
43+
guard let response = (urlResponse as? HTTPURLResponse)?.httpResponse else {
44+
throw HTTPTypeConversionError.failedToConvertURLResponseToHTTPResponse
45+
}
46+
return (data, response)
47+
}
48+
}
49+
#endif
50+
151
#if canImport(FoundationNetworking) && compiler(<6)
252
import Foundation
353
import FoundationNetworking

0 commit comments

Comments
 (0)