| | |
| | | import Foundation |
| | | |
| | | #if canImport(Security) |
| | | import Security |
| | | @preconcurrency import Security |
| | | #endif |
| | | |
| | | /// `AFError` is the error type returned by Alamofire. It encompasses a few different types of errors, each with |
| | | /// their own associated reasons. |
| | | public enum AFError: Error { |
| | | public enum AFError: Error, Sendable { |
| | | /// The underlying reason the `.multipartEncodingFailed` error occurred. |
| | | public enum MultipartEncodingFailureReason { |
| | | public enum MultipartEncodingFailureReason: Sendable { |
| | | /// The `fileURL` provided for reading an encodable body part isn't a file `URL`. |
| | | case bodyPartURLInvalid(url: URL) |
| | | /// The filename of the `fileURL` provided has either an empty `lastPathComponent` or `pathExtension`. |
| | |
| | | /// The file at the `fileURL` provided was not reachable. |
| | | case bodyPartFileNotReachable(at: URL) |
| | | /// Attempting to check the reachability of the `fileURL` provided threw an error. |
| | | case bodyPartFileNotReachableWithError(atURL: URL, error: Error) |
| | | case bodyPartFileNotReachableWithError(atURL: URL, error: any Error) |
| | | /// The file at the `fileURL` provided is actually a directory. |
| | | case bodyPartFileIsDirectory(at: URL) |
| | | /// The size of the file at the `fileURL` provided was not returned by the system. |
| | | case bodyPartFileSizeNotAvailable(at: URL) |
| | | /// The attempt to find the size of the file at the `fileURL` provided threw an error. |
| | | case bodyPartFileSizeQueryFailedWithError(forURL: URL, error: Error) |
| | | case bodyPartFileSizeQueryFailedWithError(forURL: URL, error: any Error) |
| | | /// An `InputStream` could not be created for the provided `fileURL`. |
| | | case bodyPartInputStreamCreationFailed(for: URL) |
| | | /// An `OutputStream` could not be created when attempting to write the encoded data to disk. |
| | |
| | | /// The `fileURL` provided for writing the encoded body data to disk is not a file `URL`. |
| | | case outputStreamURLInvalid(url: URL) |
| | | /// The attempt to write the encoded body data to disk failed with an underlying error. |
| | | case outputStreamWriteFailed(error: Error) |
| | | case outputStreamWriteFailed(error: any Error) |
| | | /// The attempt to read an encoded body part `InputStream` failed with underlying system error. |
| | | case inputStreamReadFailed(error: Error) |
| | | case inputStreamReadFailed(error: any Error) |
| | | } |
| | | |
| | | /// Represents unexpected input stream length that occur when encoding the `MultipartFormData`. Instances will be |
| | |
| | | } |
| | | |
| | | /// The underlying reason the `.parameterEncodingFailed` error occurred. |
| | | public enum ParameterEncodingFailureReason { |
| | | public enum ParameterEncodingFailureReason: Sendable { |
| | | /// The `URLRequest` did not have a `URL` to encode. |
| | | case missingURL |
| | | /// JSON serialization failed with an underlying system error during the encoding process. |
| | | case jsonEncodingFailed(error: Error) |
| | | case jsonEncodingFailed(error: any Error) |
| | | /// Custom parameter encoding failed due to the associated `Error`. |
| | | case customEncodingFailed(error: Error) |
| | | case customEncodingFailed(error: any Error) |
| | | } |
| | | |
| | | /// The underlying reason the `.parameterEncoderFailed` error occurred. |
| | | public enum ParameterEncoderFailureReason { |
| | | public enum ParameterEncoderFailureReason: Sendable { |
| | | /// Possible missing components. |
| | | public enum RequiredComponent { |
| | | public enum RequiredComponent: Sendable { |
| | | /// The `URL` was missing or unable to be extracted from the passed `URLRequest` or during encoding. |
| | | case url |
| | | /// The `HTTPMethod` could not be extracted from the passed `URLRequest`. |
| | |
| | | /// A `RequiredComponent` was missing during encoding. |
| | | case missingRequiredComponent(RequiredComponent) |
| | | /// The underlying encoder failed with the associated error. |
| | | case encoderFailed(error: Error) |
| | | case encoderFailed(error: any Error) |
| | | } |
| | | |
| | | /// The underlying reason the `.responseValidationFailed` error occurred. |
| | | public enum ResponseValidationFailureReason { |
| | | public enum ResponseValidationFailureReason: Sendable { |
| | | /// The data file containing the server response did not exist. |
| | | case dataFileNil |
| | | /// The data file containing the server response at the associated `URL` could not be read. |
| | |
| | | /// The response status code was not acceptable. |
| | | case unacceptableStatusCode(code: Int) |
| | | /// Custom response validation failed due to the associated `Error`. |
| | | case customValidationFailed(error: Error) |
| | | case customValidationFailed(error: any Error) |
| | | } |
| | | |
| | | /// The underlying reason the response serialization error occurred. |
| | | public enum ResponseSerializationFailureReason { |
| | | public enum ResponseSerializationFailureReason: Sendable { |
| | | /// The server response contained no data or the data was zero length. |
| | | case inputDataNilOrZeroLength |
| | | /// The file containing the server response did not exist. |
| | |
| | | /// String serialization failed using the provided `String.Encoding`. |
| | | case stringSerializationFailed(encoding: String.Encoding) |
| | | /// JSON serialization failed with an underlying system error. |
| | | case jsonSerializationFailed(error: Error) |
| | | case jsonSerializationFailed(error: any Error) |
| | | /// A `DataDecoder` failed to decode the response due to the associated `Error`. |
| | | case decodingFailed(error: Error) |
| | | case decodingFailed(error: any Error) |
| | | /// A custom response serializer failed due to the associated `Error`. |
| | | case customSerializationFailed(error: Error) |
| | | case customSerializationFailed(error: any Error) |
| | | /// Generic serialization failed for an empty response that wasn't type `Empty` but instead the associated type. |
| | | case invalidEmptyResponse(type: String) |
| | | } |
| | | |
| | | #if canImport(Security) |
| | | /// Underlying reason a server trust evaluation error occurred. |
| | | public enum ServerTrustFailureReason { |
| | | public enum ServerTrustFailureReason: Sendable { |
| | | /// The output of a server trust evaluation. |
| | | public struct Output { |
| | | public struct Output: Sendable { |
| | | /// The host for which the evaluation was performed. |
| | | public let host: String |
| | | /// The `SecTrust` value which was evaluated. |
| | |
| | | /// During evaluation, creation of the revocation policy failed. |
| | | case revocationPolicyCreationFailed |
| | | /// `SecTrust` evaluation failed with the associated `Error`, if one was produced. |
| | | case trustEvaluationFailed(error: Error?) |
| | | case trustEvaluationFailed(error: (any Error)?) |
| | | /// Default evaluation failed with the associated `Output`. |
| | | case defaultEvaluationFailed(output: Output) |
| | | /// Host validation failed with the associated `Output`. |
| | |
| | | /// Public key pinning failed. |
| | | case publicKeyPinningFailed(host: String, trust: SecTrust, pinnedKeys: [SecKey], serverKeys: [SecKey]) |
| | | /// Custom server trust evaluation failed due to the associated `Error`. |
| | | case customEvaluationFailed(error: Error) |
| | | case customEvaluationFailed(error: any Error) |
| | | } |
| | | #endif |
| | | |
| | | /// The underlying reason the `.urlRequestValidationFailed` error occurred. |
| | | public enum URLRequestValidationFailureReason { |
| | | public enum URLRequestValidationFailureReason: Sendable { |
| | | /// URLRequest with GET method had body data. |
| | | case bodyDataInGETRequest(Data) |
| | | } |
| | | |
| | | /// `UploadableConvertible` threw an error in `createUploadable()`. |
| | | case createUploadableFailed(error: Error) |
| | | case createUploadableFailed(error: any Error) |
| | | /// `URLRequestConvertible` threw an error in `asURLRequest()`. |
| | | case createURLRequestFailed(error: Error) |
| | | case createURLRequestFailed(error: any Error) |
| | | /// `SessionDelegate` threw an error while attempting to move downloaded file to destination URL. |
| | | case downloadedFileMoveFailed(error: Error, source: URL, destination: URL) |
| | | case downloadedFileMoveFailed(error: any Error, source: URL, destination: URL) |
| | | /// `Request` was explicitly cancelled. |
| | | case explicitlyCancelled |
| | | /// `URLConvertible` type failed to create a valid `URL`. |
| | | case invalidURL(url: URLConvertible) |
| | | case invalidURL(url: any URLConvertible) |
| | | /// Multipart form encoding failed. |
| | | case multipartEncodingFailed(reason: MultipartEncodingFailureReason) |
| | | /// `ParameterEncoding` threw an error during the encoding process. |
| | |
| | | /// `ParameterEncoder` threw an error while running the encoder. |
| | | case parameterEncoderFailed(reason: ParameterEncoderFailureReason) |
| | | /// `RequestAdapter` threw an error during adaptation. |
| | | case requestAdaptationFailed(error: Error) |
| | | case requestAdaptationFailed(error: any Error) |
| | | /// `RequestRetrier` threw an error during the request retry process. |
| | | case requestRetryFailed(retryError: Error, originalError: Error) |
| | | case requestRetryFailed(retryError: any Error, originalError: any Error) |
| | | /// Response validation failed. |
| | | case responseValidationFailed(reason: ResponseValidationFailureReason) |
| | | /// Response serialization failed. |
| | |
| | | /// `Session` which issued the `Request` was deinitialized, most likely because its reference went out of scope. |
| | | case sessionDeinitialized |
| | | /// `Session` was explicitly invalidated, possibly with the `Error` produced by the underlying `URLSession`. |
| | | case sessionInvalidated(error: Error?) |
| | | case sessionInvalidated(error: (any Error)?) |
| | | /// `URLSessionTask` completed with error. |
| | | case sessionTaskFailed(error: Error) |
| | | case sessionTaskFailed(error: any Error) |
| | | /// `URLRequest` failed validation. |
| | | case urlRequestValidationFailed(reason: URLRequestValidationFailureReason) |
| | | } |
| | |
| | | |
| | | extension AFError { |
| | | /// The `URLConvertible` associated with the error. |
| | | public var urlConvertible: URLConvertible? { |
| | | public var urlConvertible: (any URLConvertible)? { |
| | | guard case let .invalidURL(url) = self else { return nil } |
| | | return url |
| | | } |
| | |
| | | /// The underlying `Error` responsible for generating the failure associated with `.sessionInvalidated`, |
| | | /// `.parameterEncodingFailed`, `.parameterEncoderFailed`, `.multipartEncodingFailed`, `.requestAdaptationFailed`, |
| | | /// `.responseSerializationFailed`, `.requestRetryFailed` errors. |
| | | public var underlyingError: Error? { |
| | | public var underlyingError: (any Error)? { |
| | | switch self { |
| | | case let .multipartEncodingFailed(reason): |
| | | return reason.underlyingError |
| | |
| | | } |
| | | |
| | | extension AFError.ParameterEncodingFailureReason { |
| | | var underlyingError: Error? { |
| | | var underlyingError: (any Error)? { |
| | | switch self { |
| | | case let .jsonEncodingFailed(error), |
| | | let .customEncodingFailed(error): |
| | | return error |
| | | error |
| | | case .missingURL: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | } |
| | | |
| | | extension AFError.ParameterEncoderFailureReason { |
| | | var underlyingError: Error? { |
| | | var underlyingError: (any Error)? { |
| | | switch self { |
| | | case let .encoderFailed(error): |
| | | return error |
| | | error |
| | | case .missingRequiredComponent: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | } |
| | |
| | | let .outputStreamURLInvalid(url), |
| | | let .bodyPartFileNotReachableWithError(url, _), |
| | | let .bodyPartFileSizeQueryFailedWithError(url, _): |
| | | return url |
| | | url |
| | | case .outputStreamWriteFailed, |
| | | .inputStreamReadFailed: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | |
| | | var underlyingError: Error? { |
| | | var underlyingError: (any Error)? { |
| | | switch self { |
| | | case let .bodyPartFileNotReachableWithError(_, error), |
| | | let .bodyPartFileSizeQueryFailedWithError(_, error), |
| | | let .outputStreamWriteFailed(error), |
| | | let .inputStreamReadFailed(error): |
| | | return error |
| | | error |
| | | case .bodyPartURLInvalid, |
| | | .bodyPartFilenameInvalid, |
| | | .bodyPartFileNotReachable, |
| | |
| | | .outputStreamCreationFailed, |
| | | .outputStreamFileAlreadyExists, |
| | | .outputStreamURLInvalid: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | } |
| | |
| | | switch self { |
| | | case let .missingContentType(types), |
| | | let .unacceptableContentType(types, _): |
| | | return types |
| | | types |
| | | case .dataFileNil, |
| | | .dataFileReadFailed, |
| | | .unacceptableStatusCode, |
| | | .customValidationFailed: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | |
| | | var responseContentType: String? { |
| | | switch self { |
| | | case let .unacceptableContentType(_, responseType): |
| | | return responseType |
| | | responseType |
| | | case .dataFileNil, |
| | | .dataFileReadFailed, |
| | | .missingContentType, |
| | | .unacceptableStatusCode, |
| | | .customValidationFailed: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | |
| | | var responseCode: Int? { |
| | | switch self { |
| | | case let .unacceptableStatusCode(code): |
| | | return code |
| | | code |
| | | case .dataFileNil, |
| | | .dataFileReadFailed, |
| | | .missingContentType, |
| | | .unacceptableContentType, |
| | | .customValidationFailed: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | |
| | | var underlyingError: Error? { |
| | | var underlyingError: (any Error)? { |
| | | switch self { |
| | | case let .customValidationFailed(error): |
| | | return error |
| | | error |
| | | case .dataFileNil, |
| | | .dataFileReadFailed, |
| | | .missingContentType, |
| | | .unacceptableContentType, |
| | | .unacceptableStatusCode: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | } |
| | |
| | | var failedStringEncoding: String.Encoding? { |
| | | switch self { |
| | | case let .stringSerializationFailed(encoding): |
| | | return encoding |
| | | encoding |
| | | case .inputDataNilOrZeroLength, |
| | | .inputFileNil, |
| | | .inputFileReadFailed(_), |
| | |
| | | .decodingFailed(_), |
| | | .customSerializationFailed(_), |
| | | .invalidEmptyResponse: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | |
| | | var underlyingError: Error? { |
| | | var underlyingError: (any Error)? { |
| | | switch self { |
| | | case let .jsonSerializationFailed(error), |
| | | let .decodingFailed(error), |
| | | let .customSerializationFailed(error): |
| | | return error |
| | | error |
| | | case .inputDataNilOrZeroLength, |
| | | .inputFileNil, |
| | | .inputFileReadFailed, |
| | | .stringSerializationFailed, |
| | | .invalidEmptyResponse: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | } |
| | |
| | | case let .defaultEvaluationFailed(output), |
| | | let .hostValidationFailed(output), |
| | | let .revocationCheckFailed(output, _): |
| | | return output |
| | | output |
| | | case .noRequiredEvaluator, |
| | | .noCertificatesFound, |
| | | .noPublicKeysFound, |
| | |
| | | .certificatePinningFailed, |
| | | .publicKeyPinningFailed, |
| | | .customEvaluationFailed: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | |
| | | var underlyingError: Error? { |
| | | var underlyingError: (any Error)? { |
| | | switch self { |
| | | case let .customEvaluationFailed(error): |
| | | return error |
| | | error |
| | | case let .trustEvaluationFailed(error): |
| | | return error |
| | | error |
| | | case .noRequiredEvaluator, |
| | | .noCertificatesFound, |
| | | .noPublicKeysFound, |
| | |
| | | .revocationCheckFailed, |
| | | .certificatePinningFailed, |
| | | .publicKeyPinningFailed: |
| | | return nil |
| | | nil |
| | | } |
| | | } |
| | | } |
| | |
| | | var localizedDescription: String { |
| | | switch self { |
| | | case .missingURL: |
| | | return "URL request to encode was missing a URL" |
| | | "URL request to encode was missing a URL" |
| | | case let .jsonEncodingFailed(error): |
| | | return "JSON could not be encoded because of error:\n\(error.localizedDescription)" |
| | | "JSON could not be encoded because of error:\n\(error.localizedDescription)" |
| | | case let .customEncodingFailed(error): |
| | | return "Custom parameter encoder failed with error: \(error.localizedDescription)" |
| | | "Custom parameter encoder failed with error: \(error.localizedDescription)" |
| | | } |
| | | } |
| | | } |
| | |
| | | var localizedDescription: String { |
| | | switch self { |
| | | case let .missingRequiredComponent(component): |
| | | return "Encoding failed due to a missing request component: \(component)" |
| | | "Encoding failed due to a missing request component: \(component)" |
| | | case let .encoderFailed(error): |
| | | return "The underlying encoder failed with the error: \(error)" |
| | | "The underlying encoder failed with the error: \(error)" |
| | | } |
| | | } |
| | | } |
| | |
| | | var localizedDescription: String { |
| | | switch self { |
| | | case let .bodyPartURLInvalid(url): |
| | | return "The URL provided is not a file URL: \(url)" |
| | | "The URL provided is not a file URL: \(url)" |
| | | case let .bodyPartFilenameInvalid(url): |
| | | return "The URL provided does not have a valid filename: \(url)" |
| | | "The URL provided does not have a valid filename: \(url)" |
| | | case let .bodyPartFileNotReachable(url): |
| | | return "The URL provided is not reachable: \(url)" |
| | | "The URL provided is not reachable: \(url)" |
| | | case let .bodyPartFileNotReachableWithError(url, error): |
| | | return """ |
| | | """ |
| | | The system returned an error while checking the provided URL for reachability. |
| | | URL: \(url) |
| | | Error: \(error) |
| | | """ |
| | | case let .bodyPartFileIsDirectory(url): |
| | | return "The URL provided is a directory: \(url)" |
| | | "The URL provided is a directory: \(url)" |
| | | case let .bodyPartFileSizeNotAvailable(url): |
| | | return "Could not fetch the file size from the provided URL: \(url)" |
| | | "Could not fetch the file size from the provided URL: \(url)" |
| | | case let .bodyPartFileSizeQueryFailedWithError(url, error): |
| | | return """ |
| | | """ |
| | | The system returned an error while attempting to fetch the file size from the provided URL. |
| | | URL: \(url) |
| | | Error: \(error) |
| | | """ |
| | | case let .bodyPartInputStreamCreationFailed(url): |
| | | return "Failed to create an InputStream for the provided URL: \(url)" |
| | | "Failed to create an InputStream for the provided URL: \(url)" |
| | | case let .outputStreamCreationFailed(url): |
| | | return "Failed to create an OutputStream for URL: \(url)" |
| | | "Failed to create an OutputStream for URL: \(url)" |
| | | case let .outputStreamFileAlreadyExists(url): |
| | | return "A file already exists at the provided URL: \(url)" |
| | | "A file already exists at the provided URL: \(url)" |
| | | case let .outputStreamURLInvalid(url): |
| | | return "The provided OutputStream URL is invalid: \(url)" |
| | | "The provided OutputStream URL is invalid: \(url)" |
| | | case let .outputStreamWriteFailed(error): |
| | | return "OutputStream write failed with error: \(error)" |
| | | "OutputStream write failed with error: \(error)" |
| | | case let .inputStreamReadFailed(error): |
| | | return "InputStream read failed with error: \(error)" |
| | | "InputStream read failed with error: \(error)" |
| | | } |
| | | } |
| | | } |
| | |
| | | var localizedDescription: String { |
| | | switch self { |
| | | case .inputDataNilOrZeroLength: |
| | | return "Response could not be serialized, input data was nil or zero length." |
| | | "Response could not be serialized, input data was nil or zero length." |
| | | case .inputFileNil: |
| | | return "Response could not be serialized, input file was nil." |
| | | "Response could not be serialized, input file was nil." |
| | | case let .inputFileReadFailed(url): |
| | | return "Response could not be serialized, input file could not be read: \(url)." |
| | | "Response could not be serialized, input file could not be read: \(url)." |
| | | case let .stringSerializationFailed(encoding): |
| | | return "String could not be serialized with encoding: \(encoding)." |
| | | "String could not be serialized with encoding: \(encoding)." |
| | | case let .jsonSerializationFailed(error): |
| | | return "JSON could not be serialized because of error:\n\(error.localizedDescription)" |
| | | "JSON could not be serialized because of error:\n\(error.localizedDescription)" |
| | | case let .invalidEmptyResponse(type): |
| | | return """ |
| | | """ |
| | | Empty response could not be serialized to type: \(type). \ |
| | | Use Empty as the expected type for such responses. |
| | | """ |
| | | case let .decodingFailed(error): |
| | | return "Response could not be decoded because of error:\n\(error.localizedDescription)" |
| | | "Response could not be decoded because of error:\n\(error.localizedDescription)" |
| | | case let .customSerializationFailed(error): |
| | | return "Custom response serializer failed with error:\n\(error.localizedDescription)" |
| | | "Custom response serializer failed with error:\n\(error.localizedDescription)" |
| | | } |
| | | } |
| | | } |
| | |
| | | var localizedDescription: String { |
| | | switch self { |
| | | case .dataFileNil: |
| | | return "Response could not be validated, data file was nil." |
| | | "Response could not be validated, data file was nil." |
| | | case let .dataFileReadFailed(url): |
| | | return "Response could not be validated, data file could not be read: \(url)." |
| | | "Response could not be validated, data file could not be read: \(url)." |
| | | case let .missingContentType(types): |
| | | return """ |
| | | """ |
| | | Response Content-Type was missing and acceptable content types \ |
| | | (\(types.joined(separator: ","))) do not match "*/*". |
| | | """ |
| | | case let .unacceptableContentType(acceptableTypes, responseType): |
| | | return """ |
| | | """ |
| | | Response Content-Type "\(responseType)" does not match any acceptable types: \ |
| | | \(acceptableTypes.joined(separator: ",")). |
| | | """ |
| | | case let .unacceptableStatusCode(code): |
| | | return "Response status code was unacceptable: \(code)." |
| | | "Response status code was unacceptable: \(code)." |
| | | case let .customValidationFailed(error): |
| | | return "Custom response validation failed with error: \(error.localizedDescription)" |
| | | "Custom response validation failed with error: \(error.localizedDescription)" |
| | | } |
| | | } |
| | | } |
| | |
| | | var localizedDescription: String { |
| | | switch self { |
| | | case let .noRequiredEvaluator(host): |
| | | return "A ServerTrustEvaluating value is required for host \(host) but none was found." |
| | | "A ServerTrustEvaluating value is required for host \(host) but none was found." |
| | | case .noCertificatesFound: |
| | | return "No certificates were found or provided for evaluation." |
| | | "No certificates were found or provided for evaluation." |
| | | case .noPublicKeysFound: |
| | | return "No public keys were found or provided for evaluation." |
| | | "No public keys were found or provided for evaluation." |
| | | case .policyApplicationFailed: |
| | | return "Attempting to set a SecPolicy failed." |
| | | "Attempting to set a SecPolicy failed." |
| | | case .settingAnchorCertificatesFailed: |
| | | return "Attempting to set the provided certificates as anchor certificates failed." |
| | | "Attempting to set the provided certificates as anchor certificates failed." |
| | | case .revocationPolicyCreationFailed: |
| | | return "Attempting to create a revocation policy failed." |
| | | "Attempting to create a revocation policy failed." |
| | | case let .trustEvaluationFailed(error): |
| | | return "SecTrust evaluation failed with error: \(error?.localizedDescription ?? "None")" |
| | | "SecTrust evaluation failed with error: \(error?.localizedDescription ?? "None")" |
| | | case let .defaultEvaluationFailed(output): |
| | | return "Default evaluation failed for host \(output.host)." |
| | | "Default evaluation failed for host \(output.host)." |
| | | case let .hostValidationFailed(output): |
| | | return "Host validation failed for host \(output.host)." |
| | | "Host validation failed for host \(output.host)." |
| | | case let .revocationCheckFailed(output, _): |
| | | return "Revocation check failed for host \(output.host)." |
| | | "Revocation check failed for host \(output.host)." |
| | | case let .certificatePinningFailed(host, _, _, _): |
| | | return "Certificate pinning failed for host \(host)." |
| | | "Certificate pinning failed for host \(host)." |
| | | case let .publicKeyPinningFailed(host, _, _, _): |
| | | return "Public key pinning failed for host \(host)." |
| | | "Public key pinning failed for host \(host)." |
| | | case let .customEvaluationFailed(error): |
| | | return "Custom trust evaluation failed with error: \(error.localizedDescription)" |
| | | "Custom trust evaluation failed with error: \(error.localizedDescription)" |
| | | } |
| | | } |
| | | } |
| | |
| | | var localizedDescription: String { |
| | | switch self { |
| | | case let .bodyDataInGETRequest(data): |
| | | return """ |
| | | """ |
| | | Invalid URLRequest: Requests with GET method cannot have body data: |
| | | \(String(decoding: data, as: UTF8.self)) |
| | | """ |