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