|
|
@@ -30,7 +30,7 @@ extension Request {
|
|
|
fileprivate typealias ErrorReason = AFError.ResponseValidationFailureReason
|
|
|
|
|
|
/// Used to represent whether a validation succeeded or failed.
|
|
|
- public typealias ValidationResult = Result<Void, any Error>
|
|
|
+ public typealias ValidationResult = Result<Void, any(Error & Sendable)>
|
|
|
|
|
|
fileprivate struct MIMEType {
|
|
|
let type: String
|
|
|
@@ -146,7 +146,7 @@ extension Request {
|
|
|
extension DataRequest {
|
|
|
/// A closure used to validate a request that takes a URL request, a URL response and data, and returns whether the
|
|
|
/// request was valid.
|
|
|
- public typealias Validation = (URLRequest?, HTTPURLResponse, Data?) -> ValidationResult
|
|
|
+ public typealias Validation = @Sendable (URLRequest?, HTTPURLResponse, Data?) -> ValidationResult
|
|
|
|
|
|
/// Validates that the response has a status code in the specified sequence.
|
|
|
///
|
|
|
@@ -155,8 +155,9 @@ extension DataRequest {
|
|
|
/// - Parameter acceptableStatusCodes: `Sequence` of acceptable response status codes.
|
|
|
///
|
|
|
/// - Returns: The instance.
|
|
|
+ @preconcurrency
|
|
|
@discardableResult
|
|
|
- public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int {
|
|
|
+ public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int, S: Sendable {
|
|
|
validate { [unowned self] _, response, _ in
|
|
|
self.validate(statusCode: acceptableStatusCodes, response: response)
|
|
|
}
|
|
|
@@ -169,8 +170,9 @@ extension DataRequest {
|
|
|
/// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes.
|
|
|
///
|
|
|
/// - returns: The request.
|
|
|
+ @preconcurrency
|
|
|
@discardableResult
|
|
|
- public func validate<S: Sequence>(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String {
|
|
|
+ public func validate<S: Sequence>(contentType acceptableContentTypes: @escaping @Sendable @autoclosure () -> S) -> Self where S.Iterator.Element == String, S: Sendable {
|
|
|
validate { [unowned self] _, response, data in
|
|
|
self.validate(contentType: acceptableContentTypes(), response: response, isEmpty: (data == nil || data?.isEmpty == true))
|
|
|
}
|
|
|
@@ -184,7 +186,7 @@ extension DataRequest {
|
|
|
/// - returns: The request.
|
|
|
@discardableResult
|
|
|
public func validate() -> Self {
|
|
|
- let contentTypes: () -> [String] = { [unowned self] in
|
|
|
+ let contentTypes: @Sendable () -> [String] = { [unowned self] in
|
|
|
acceptableContentTypes
|
|
|
}
|
|
|
return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes())
|
|
|
@@ -194,7 +196,7 @@ extension DataRequest {
|
|
|
extension DataStreamRequest {
|
|
|
/// A closure used to validate a request that takes a `URLRequest` and `HTTPURLResponse` and returns whether the
|
|
|
/// request was valid.
|
|
|
- public typealias Validation = (_ request: URLRequest?, _ response: HTTPURLResponse) -> ValidationResult
|
|
|
+ public typealias Validation = @Sendable (_ request: URLRequest?, _ response: HTTPURLResponse) -> ValidationResult
|
|
|
|
|
|
/// Validates that the response has a status code in the specified sequence.
|
|
|
///
|
|
|
@@ -203,8 +205,9 @@ extension DataStreamRequest {
|
|
|
/// - Parameter acceptableStatusCodes: `Sequence` of acceptable response status codes.
|
|
|
///
|
|
|
/// - Returns: The instance.
|
|
|
+ @preconcurrency
|
|
|
@discardableResult
|
|
|
- public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int {
|
|
|
+ public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int, S: Sendable {
|
|
|
validate { [unowned self] _, response in
|
|
|
self.validate(statusCode: acceptableStatusCodes, response: response)
|
|
|
}
|
|
|
@@ -217,8 +220,9 @@ extension DataStreamRequest {
|
|
|
/// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes.
|
|
|
///
|
|
|
/// - returns: The request.
|
|
|
+ @preconcurrency
|
|
|
@discardableResult
|
|
|
- public func validate<S: Sequence>(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String {
|
|
|
+ public func validate<S: Sequence>(contentType acceptableContentTypes: @escaping @Sendable @autoclosure () -> S) -> Self where S.Iterator.Element == String, S: Sendable {
|
|
|
validate { [unowned self] _, response in
|
|
|
self.validate(contentType: acceptableContentTypes(), response: response)
|
|
|
}
|
|
|
@@ -232,7 +236,7 @@ extension DataStreamRequest {
|
|
|
/// - Returns: The instance.
|
|
|
@discardableResult
|
|
|
public func validate() -> Self {
|
|
|
- let contentTypes: () -> [String] = { [unowned self] in
|
|
|
+ let contentTypes: @Sendable () -> [String] = { [unowned self] in
|
|
|
acceptableContentTypes
|
|
|
}
|
|
|
return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes())
|
|
|
@@ -244,9 +248,9 @@ extension DataStreamRequest {
|
|
|
extension DownloadRequest {
|
|
|
/// A closure used to validate a request that takes a URL request, a URL response, a temporary URL and a
|
|
|
/// destination URL, and returns whether the request was valid.
|
|
|
- public typealias Validation = (_ request: URLRequest?,
|
|
|
- _ response: HTTPURLResponse,
|
|
|
- _ fileURL: URL?)
|
|
|
+ public typealias Validation = @Sendable (_ request: URLRequest?,
|
|
|
+ _ response: HTTPURLResponse,
|
|
|
+ _ fileURL: URL?)
|
|
|
-> ValidationResult
|
|
|
|
|
|
/// Validates that the response has a status code in the specified sequence.
|
|
|
@@ -256,8 +260,9 @@ extension DownloadRequest {
|
|
|
/// - Parameter acceptableStatusCodes: `Sequence` of acceptable response status codes.
|
|
|
///
|
|
|
/// - Returns: The instance.
|
|
|
+ @preconcurrency
|
|
|
@discardableResult
|
|
|
- public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int {
|
|
|
+ public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int, S: Sendable {
|
|
|
validate { [unowned self] _, response, _ in
|
|
|
self.validate(statusCode: acceptableStatusCodes, response: response)
|
|
|
}
|
|
|
@@ -270,8 +275,9 @@ extension DownloadRequest {
|
|
|
/// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes.
|
|
|
///
|
|
|
/// - returns: The request.
|
|
|
+ @preconcurrency
|
|
|
@discardableResult
|
|
|
- public func validate<S: Sequence>(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String {
|
|
|
+ public func validate<S: Sequence>(contentType acceptableContentTypes: @escaping @Sendable @autoclosure () -> S) -> Self where S.Iterator.Element == String, S: Sendable {
|
|
|
validate { [unowned self] _, response, fileURL in
|
|
|
guard let fileURL else {
|
|
|
return .failure(AFError.responseValidationFailed(reason: .dataFileNil))
|
|
|
@@ -294,7 +300,7 @@ extension DownloadRequest {
|
|
|
/// - returns: The request.
|
|
|
@discardableResult
|
|
|
public func validate() -> Self {
|
|
|
- let contentTypes = { [unowned self] in
|
|
|
+ let contentTypes: @Sendable () -> [String] = { [unowned self] in
|
|
|
acceptableContentTypes
|
|
|
}
|
|
|
return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes())
|