Commit 0461360c3047d8815269ef4d561188e4b43cf58c

Authored by niudaojian
1 parent 78dc198e

ignore something

Too many changes to show.

To preserve performance only 14 of 95 files are displayed.

Podfile.lock deleted 100644 → 0
1   -PODS:
2   - - Alamofire (5.7.1)
3   - - Moya (15.0.0):
4   - - Moya/Core (= 15.0.0)
5   - - Moya/Core (15.0.0):
6   - - Alamofire (~> 5.0)
7   -
8   -DEPENDENCIES:
9   - - Alamofire
10   - - Moya
11   -
12   -SPEC REPOS:
13   - trunk:
14   - - Alamofire
15   - - Moya
16   -
17   -SPEC CHECKSUMS:
18   - Alamofire: 0123a34370cb170936ae79a8df46cc62b2edeb88
19   - Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee
20   -
21   -PODFILE CHECKSUM: 442c78584a02fcf1354da6ef1b93ca3e5ce4fae6
22   -
23   -COCOAPODS: 1.11.2
Pods/Alamofire/LICENSE deleted 100644 → 0
1   -Copyright (c) 2014-2022 Alamofire Software Foundation (http://alamofire.org/)
2   -
3   -Permission is hereby granted, free of charge, to any person obtaining a copy
4   -of this software and associated documentation files (the "Software"), to deal
5   -in the Software without restriction, including without limitation the rights
6   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7   -copies of the Software, and to permit persons to whom the Software is
8   -furnished to do so, subject to the following conditions:
9   -
10   -The above copyright notice and this permission notice shall be included in
11   -all copies or substantial portions of the Software.
12   -
13   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19   -THE SOFTWARE.
Pods/Alamofire/README.md deleted 100644 → 0
1   -![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/master/Resources/AlamofireLogo.png)
2   -
3   -[![Swift](https://img.shields.io/badge/Swift-5.5_5.6_5.7_5.8-orange?style=flat-square)](https://img.shields.io/badge/Swift-5.5_5.6_5.7_5.8-Orange?style=flat-square)
4   -[![Platforms](https://img.shields.io/badge/Platforms-macOS_iOS_tvOS_watchOS_Linux_Windows-yellowgreen?style=flat-square)](https://img.shields.io/badge/Platforms-macOS_iOS_tvOS_watchOS_Linux_Windows-Green?style=flat-square)
5   -[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg?style=flat-square)](https://img.shields.io/cocoapods/v/Alamofire.svg)
6   -[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat-square)](https://github.com/Carthage/Carthage)
7   -[![Swift Package Manager](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat-square)](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat-square)
8   -[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat-square)](https://twitter.com/AlamofireSF)
9   -[![Swift Forums](https://img.shields.io/badge/Swift_Forums-Alamofire-orange?style=flat-square)](https://forums.swift.org/c/related-projects/alamofire/37)
10   -
11   -Alamofire is an HTTP networking library written in Swift.
12   -
13   -- [Features](#features)
14   -- [Component Libraries](#component-libraries)
15   -- [Requirements](#requirements)
16   -- [Migration Guides](#migration-guides)
17   -- [Communication](#communication)
18   -- [Installation](#installation)
19   -- [Contributing](#contributing)
20   -- [Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#using-alamofire)
21   - - [**Introduction -**](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#introduction) [Making Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#making-requests), [Response Handling](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-handling), [Response Validation](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-validation), [Response Caching](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-caching)
22   - - **HTTP -** [HTTP Methods](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-methods), [Parameters and Parameter Encoder](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md##request-parameters-and-parameter-encoders), [HTTP Headers](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-headers), [Authentication](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#authentication)
23   - - **Large Data -** [Downloading Data to a File](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#downloading-data-to-a-file), [Uploading Data to a Server](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#uploading-data-to-a-server)
24   - - **Tools -** [Statistical Metrics](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#statistical-metrics), [cURL Command Output](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#curl-command-output)
25   -- [Advanced Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md)
26   - - **URL Session -** [Session Manager](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#session), [Session Delegate](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#sessiondelegate), [Request](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#request)
27   - - **Routing -** [Routing Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#routing-requests), [Adapting and Retrying Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#adapting-and-retrying-requests-with-requestinterceptor)
28   - - **Model Objects -** [Custom Response Handlers](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#customizing-response-handlers)
29   - - **Advanced Concurrency -** [Swift Concurrency](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#using-alamofire-with-swift-concurrency) and [Combine](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#using-alamofire-with-combine)
30   - - **Connection -** [Security](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#security), [Network Reachability](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#network-reachability)
31   -- [Open Radars](#open-radars)
32   -- [FAQ](#faq)
33   -- [Credits](#credits)
34   -- [Donations](#donations)
35   -- [License](#license)
36   -
37   -## Features
38   -
39   -- [x] Chainable Request / Response Methods
40   -- [x] Swift Concurrency Support Back to iOS 13, macOS 10.15, tvOS 13, and watchOS 6.
41   -- [x] Combine Support
42   -- [x] URL / JSON Parameter Encoding
43   -- [x] Upload File / Data / Stream / MultipartFormData
44   -- [x] Download File using Request or Resume Data
45   -- [x] Authentication with `URLCredential`
46   -- [x] HTTP Response Validation
47   -- [x] Upload and Download Progress Closures with Progress
48   -- [x] cURL Command Output
49   -- [x] Dynamically Adapt and Retry Requests
50   -- [x] TLS Certificate and Public Key Pinning
51   -- [x] Network Reachability
52   -- [x] Comprehensive Unit and Integration Test Coverage
53   -- [x] [Complete Documentation](https://alamofire.github.io/Alamofire)
54   -
55   -## Component Libraries
56   -
57   -In order to keep Alamofire focused specifically on core networking implementations, additional component libraries have been created by the [Alamofire Software Foundation](https://github.com/Alamofire/Foundation) to bring additional functionality to the Alamofire ecosystem.
58   -
59   -- [AlamofireImage](https://github.com/Alamofire/AlamofireImage) - An image library including image response serializers, `UIImage` and `UIImageView` extensions, custom image filters, an auto-purging in-memory cache, and a priority-based image downloading system.
60   -- [AlamofireNetworkActivityIndicator](https://github.com/Alamofire/AlamofireNetworkActivityIndicator) - Controls the visibility of the network activity indicator on iOS using Alamofire. It contains configurable delay timers to help mitigate flicker and can support `URLSession` instances not managed by Alamofire.
61   -
62   -## Requirements
63   -
64   -| Platform | Minimum Swift Version | Installation | Status |
65   -| --- | --- | --- | --- |
66   -| iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+ | 5.5 | [CocoaPods](#cocoapods), [Carthage](#carthage), [Swift Package Manager](#swift-package-manager), [Manual](#manually) | Fully Tested |
67   -| Linux | Latest Only | [Swift Package Manager](#swift-package-manager) | Building But Unsupported |
68   -| Windows | Latest Only | [Swift Package Manager](#swift-package-manager) | Building But Unsupported |
69   -
70   -#### Known Issues on Linux and Windows
71   -
72   -Alamofire builds on Linux and Windows but there are missing features and many issues in the underlying `swift-corelibs-foundation` that prevent full functionality and may cause crashes. These include:
73   -- `ServerTrustManager` and associated certificate functionality is unavailable, so there is no certificate pinning and no client certificate support.
74   -- Various methods of HTTP authentication may crash, including HTTP Basic and HTTP Digest. Crashes may occur if responses contain server challenges.
75   -- Cache control through `CachedResponseHandler` and associated APIs is unavailable, as the underlying delegate methods aren't called.
76   -- `URLSessionTaskMetrics` are never gathered.
77   -
78   -Due to these issues, Alamofire is unsupported on Linux and Windows. Please report any crashes to the [Swift bug reporter](https://bugs.swift.org).
79   -
80   -## Migration Guides
81   -
82   -- [Alamofire 5.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%205.0%20Migration%20Guide.md)
83   -- [Alamofire 4.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md)
84   -- [Alamofire 3.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%203.0%20Migration%20Guide.md)
85   -- [Alamofire 2.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%202.0%20Migration%20Guide.md)
86   -
87   -## Communication
88   -- If you **need help with making network requests** using Alamofire, use [Stack Overflow](https://stackoverflow.com/questions/tagged/alamofire) and tag `alamofire`.
89   -- If you need to **find or understand an API**, check [our documentation](http://alamofire.github.io/Alamofire/) or [Apple's documentation for `URLSession`](https://developer.apple.com/documentation/foundation/url_loading_system), on top of which Alamofire is built.
90   -- If you need **help with an Alamofire feature**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire).
91   -- If you'd like to **discuss Alamofire best practices**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire).
92   -- If you'd like to **discuss a feature request**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire).
93   -- If you **found a bug**, open an issue here on GitHub and follow the guide. The more detail the better!
94   -
95   -## Installation
96   -
97   -### CocoaPods
98   -
99   -[CocoaPods](https://cocoapods.org) is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`:
100   -
101   -```ruby
102   -pod 'Alamofire'
103   -```
104   -
105   -### Carthage
106   -
107   -[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`:
108   -
109   -```ogdl
110   -github "Alamofire/Alamofire"
111   -```
112   -
113   -### Swift Package Manager
114   -
115   -The [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler.
116   -
117   -Once you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`.
118   -
119   -```swift
120   -dependencies: [
121   - .package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.6.4"))
122   -]
123   -```
124   -
125   -### Manually
126   -
127   -If you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually.
128   -
129   -#### Embedded Framework
130   -
131   -- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository:
132   -
133   - ```bash
134   - $ git init
135   - ```
136   -
137   -- Add Alamofire as a git [submodule](https://git-scm.com/docs/git-submodule) by running the following command:
138   -
139   - ```bash
140   - $ git submodule add https://github.com/Alamofire/Alamofire.git
141   - ```
142   -
143   -- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project.
144   -
145   - > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.
146   -
147   -- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.
148   -- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar.
149   -- In the tab bar at the top of that window, open the "General" panel.
150   -- Click on the `+` button under the "Embedded Binaries" section.
151   -- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder.
152   -
153   - > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`.
154   -
155   -- Select the top `Alamofire.framework` for iOS and the bottom one for macOS.
156   -
157   - > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS`, or `Alamofire watchOS`.
158   -
159   -- And that's it!
160   -
161   - > The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.
162   -
163   -## Contributing
164   -
165   -Before contributing to Alamofire, please read the instructions detailed in our [contribution guide](https://github.com/Alamofire/Alamofire/blob/master/CONTRIBUTING.md).
166   -
167   -## Open Radars
168   -
169   -The following radars have some effect on the current implementation of Alamofire.
170   -
171   -- [`rdar://21349340`](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in the test case
172   -- `rdar://26870455` - Background URL Session Configurations do not work in the simulator
173   -- `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest`
174   -
175   -## Resolved Radars
176   -
177   -The following radars have been resolved over time after being filed against the Alamofire project.
178   -
179   -- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage.
180   - - (Resolved): 9/1/17 in Xcode 9 beta 6.
181   -- [`rdar://36082113`](http://openradar.appspot.com/radar?id=4942308441063424) - `URLSessionTaskMetrics` failing to link on watchOS 3.0+
182   - - (Resolved): Just add `CFNetwork` to your linked frameworks.
183   -- `FB7624529` - `urlSession(_:task:didFinishCollecting:)` never called on watchOS
184   - - (Resolved): Metrics now collected on watchOS 7+.
185   -
186   -## FAQ
187   -
188   -### What's the origin of the name Alamofire?
189   -
190   -Alamofire is named after the [Alamo Fire flower](https://aggie-horticulture.tamu.edu/wildseed/alamofire.html), a hybrid variant of the Bluebonnet, the official state flower of Texas.
191   -
192   -## Credits
193   -
194   -Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases.
195   -
196   -### Security Disclosure
197   -
198   -If you believe you have identified a security vulnerability with Alamofire, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker.
199   -
200   -## Sponsorship
201   -
202   -The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially stay registered as a federal non-profit organization.
203   -Registering will allow Foundation members to gain some legal protections and also allow us to put donations to use, tax-free.
204   -Sponsoring the ASF will enable us to:
205   -
206   -- Pay our yearly legal fees to keep the non-profit in good status
207   -- Pay for our mail servers to help us stay on top of all questions and security issues
208   -- Potentially fund test servers to make it easier for us to test the edge cases
209   -- Potentially fund developers to work on one of our projects full-time
210   -
211   -The community adoption of the ASF libraries has been amazing.
212   -We are greatly humbled by your enthusiasm around the projects and want to continue to do everything we can to move the needle forward.
213   -With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members.
214   -If you use any of our libraries for work, see if your employers would be interested in donating.
215   -Any amount you can donate, whether once or monthly, to help us reach our goal would be greatly appreciated.
216   -
217   -[Sponsor Alamofire](https://github.com/sponsors/Alamofire)
218   -
219   -## Supporters
220   -
221   -[MacStadium](https://macstadium.com) provides Alamofire with a free, hosted Mac mini.
222   -
223   -![Powered by MacStadium](https://raw.githubusercontent.com/Alamofire/Alamofire/master/Resources/MacStadiumLogo.png)
224   -
225   -## License
226   -
227   -Alamofire is released under the MIT license. [See LICENSE](https://github.com/Alamofire/Alamofire/blob/master/LICENSE) for details.
Pods/Alamofire/Source/AFError.swift deleted 100644 → 0
1   -//
2   -// AFError.swift
3   -//
4   -// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -import Foundation
26   -
27   -/// `AFError` is the error type returned by Alamofire. It encompasses a few different types of errors, each with
28   -/// their own associated reasons.
29   -public enum AFError: Error {
30   - /// The underlying reason the `.multipartEncodingFailed` error occurred.
31   - public enum MultipartEncodingFailureReason {
32   - /// The `fileURL` provided for reading an encodable body part isn't a file `URL`.
33   - case bodyPartURLInvalid(url: URL)
34   - /// The filename of the `fileURL` provided has either an empty `lastPathComponent` or `pathExtension.
35   - case bodyPartFilenameInvalid(in: URL)
36   - /// The file at the `fileURL` provided was not reachable.
37   - case bodyPartFileNotReachable(at: URL)
38   - /// Attempting to check the reachability of the `fileURL` provided threw an error.
39   - case bodyPartFileNotReachableWithError(atURL: URL, error: Error)
40   - /// The file at the `fileURL` provided is actually a directory.
41   - case bodyPartFileIsDirectory(at: URL)
42   - /// The size of the file at the `fileURL` provided was not returned by the system.
43   - case bodyPartFileSizeNotAvailable(at: URL)
44   - /// The attempt to find the size of the file at the `fileURL` provided threw an error.
45   - case bodyPartFileSizeQueryFailedWithError(forURL: URL, error: Error)
46   - /// An `InputStream` could not be created for the provided `fileURL`.
47   - case bodyPartInputStreamCreationFailed(for: URL)
48   - /// An `OutputStream` could not be created when attempting to write the encoded data to disk.
49   - case outputStreamCreationFailed(for: URL)
50   - /// The encoded body data could not be written to disk because a file already exists at the provided `fileURL`.
51   - case outputStreamFileAlreadyExists(at: URL)
52   - /// The `fileURL` provided for writing the encoded body data to disk is not a file `URL`.
53   - case outputStreamURLInvalid(url: URL)
54   - /// The attempt to write the encoded body data to disk failed with an underlying error.
55   - case outputStreamWriteFailed(error: Error)
56   - /// The attempt to read an encoded body part `InputStream` failed with underlying system error.
57   - case inputStreamReadFailed(error: Error)
58   - }
59   -
60   - /// Represents unexpected input stream length that occur when encoding the `MultipartFormData`. Instances will be
61   - /// embedded within an `AFError.multipartEncodingFailed` `.inputStreamReadFailed` case.
62   - public struct UnexpectedInputStreamLength: Error {
63   - /// The expected byte count to read.
64   - public var bytesExpected: UInt64
65   - /// The actual byte count read.
66   - public var bytesRead: UInt64
67   - }
68   -
69   - /// The underlying reason the `.parameterEncodingFailed` error occurred.
70   - public enum ParameterEncodingFailureReason {
71   - /// The `URLRequest` did not have a `URL` to encode.
72   - case missingURL
73   - /// JSON serialization failed with an underlying system error during the encoding process.
74   - case jsonEncodingFailed(error: Error)
75   - /// Custom parameter encoding failed due to the associated `Error`.
76   - case customEncodingFailed(error: Error)
77   - }
78   -
79   - /// The underlying reason the `.parameterEncoderFailed` error occurred.
80   - public enum ParameterEncoderFailureReason {
81   - /// Possible missing components.
82   - public enum RequiredComponent {
83   - /// The `URL` was missing or unable to be extracted from the passed `URLRequest` or during encoding.
84   - case url
85   - /// The `HTTPMethod` could not be extracted from the passed `URLRequest`.
86   - case httpMethod(rawValue: String)
87   - }
88   -
89   - /// A `RequiredComponent` was missing during encoding.
90   - case missingRequiredComponent(RequiredComponent)
91   - /// The underlying encoder failed with the associated error.
92   - case encoderFailed(error: Error)
93   - }
94   -
95   - /// The underlying reason the `.responseValidationFailed` error occurred.
96   - public enum ResponseValidationFailureReason {
97   - /// The data file containing the server response did not exist.
98   - case dataFileNil
99   - /// The data file containing the server response at the associated `URL` could not be read.
100   - case dataFileReadFailed(at: URL)
101   - /// The response did not contain a `Content-Type` and the `acceptableContentTypes` provided did not contain a
102   - /// wildcard type.
103   - case missingContentType(acceptableContentTypes: [String])
104   - /// The response `Content-Type` did not match any type in the provided `acceptableContentTypes`.
105   - case unacceptableContentType(acceptableContentTypes: [String], responseContentType: String)
106   - /// The response status code was not acceptable.
107   - case unacceptableStatusCode(code: Int)
108   - /// Custom response validation failed due to the associated `Error`.
109   - case customValidationFailed(error: Error)
110   - }
111   -
112   - /// The underlying reason the response serialization error occurred.
113   - public enum ResponseSerializationFailureReason {
114   - /// The server response contained no data or the data was zero length.
115   - case inputDataNilOrZeroLength
116   - /// The file containing the server response did not exist.
117   - case inputFileNil
118   - /// The file containing the server response could not be read from the associated `URL`.
119   - case inputFileReadFailed(at: URL)
120   - /// String serialization failed using the provided `String.Encoding`.
121   - case stringSerializationFailed(encoding: String.Encoding)
122   - /// JSON serialization failed with an underlying system error.
123   - case jsonSerializationFailed(error: Error)
124   - /// A `DataDecoder` failed to decode the response due to the associated `Error`.
125   - case decodingFailed(error: Error)
126   - /// A custom response serializer failed due to the associated `Error`.
127   - case customSerializationFailed(error: Error)
128   - /// Generic serialization failed for an empty response that wasn't type `Empty` but instead the associated type.
129   - case invalidEmptyResponse(type: String)
130   - }
131   -
132   - #if !(os(Linux) || os(Windows))
133   - /// Underlying reason a server trust evaluation error occurred.
134   - public enum ServerTrustFailureReason {
135   - /// The output of a server trust evaluation.
136   - public struct Output {
137   - /// The host for which the evaluation was performed.
138   - public let host: String
139   - /// The `SecTrust` value which was evaluated.
140   - public let trust: SecTrust
141   - /// The `OSStatus` of evaluation operation.
142   - public let status: OSStatus
143   - /// The result of the evaluation operation.
144   - public let result: SecTrustResultType
145   -
146   - /// Creates an `Output` value from the provided values.
147   - init(_ host: String, _ trust: SecTrust, _ status: OSStatus, _ result: SecTrustResultType) {
148   - self.host = host
149   - self.trust = trust
150   - self.status = status
151   - self.result = result
152   - }
153   - }
154   -
155   - /// No `ServerTrustEvaluator` was found for the associated host.
156   - case noRequiredEvaluator(host: String)
157   - /// No certificates were found with which to perform the trust evaluation.
158   - case noCertificatesFound
159   - /// No public keys were found with which to perform the trust evaluation.
160   - case noPublicKeysFound
161   - /// During evaluation, application of the associated `SecPolicy` failed.
162   - case policyApplicationFailed(trust: SecTrust, policy: SecPolicy, status: OSStatus)
163   - /// During evaluation, setting the associated anchor certificates failed.
164   - case settingAnchorCertificatesFailed(status: OSStatus, certificates: [SecCertificate])
165   - /// During evaluation, creation of the revocation policy failed.
166   - case revocationPolicyCreationFailed
167   - /// `SecTrust` evaluation failed with the associated `Error`, if one was produced.
168   - case trustEvaluationFailed(error: Error?)
169   - /// Default evaluation failed with the associated `Output`.
170   - case defaultEvaluationFailed(output: Output)
171   - /// Host validation failed with the associated `Output`.
172   - case hostValidationFailed(output: Output)
173   - /// Revocation check failed with the associated `Output` and options.
174   - case revocationCheckFailed(output: Output, options: RevocationTrustEvaluator.Options)
175   - /// Certificate pinning failed.
176   - case certificatePinningFailed(host: String, trust: SecTrust, pinnedCertificates: [SecCertificate], serverCertificates: [SecCertificate])
177   - /// Public key pinning failed.
178   - case publicKeyPinningFailed(host: String, trust: SecTrust, pinnedKeys: [SecKey], serverKeys: [SecKey])
179   - /// Custom server trust evaluation failed due to the associated `Error`.
180   - case customEvaluationFailed(error: Error)
181   - }
182   - #endif
183   -
184   - /// The underlying reason the `.urlRequestValidationFailed`
185   - public enum URLRequestValidationFailureReason {
186   - /// URLRequest with GET method had body data.
187   - case bodyDataInGETRequest(Data)
188   - }
189   -
190   - /// `UploadableConvertible` threw an error in `createUploadable()`.
191   - case createUploadableFailed(error: Error)
192   - /// `URLRequestConvertible` threw an error in `asURLRequest()`.
193   - case createURLRequestFailed(error: Error)
194   - /// `SessionDelegate` threw an error while attempting to move downloaded file to destination URL.
195   - case downloadedFileMoveFailed(error: Error, source: URL, destination: URL)
196   - /// `Request` was explicitly cancelled.
197   - case explicitlyCancelled
198   - /// `URLConvertible` type failed to create a valid `URL`.
199   - case invalidURL(url: URLConvertible)
200   - /// Multipart form encoding failed.
201   - case multipartEncodingFailed(reason: MultipartEncodingFailureReason)
202   - /// `ParameterEncoding` threw an error during the encoding process.
203   - case parameterEncodingFailed(reason: ParameterEncodingFailureReason)
204   - /// `ParameterEncoder` threw an error while running the encoder.
205   - case parameterEncoderFailed(reason: ParameterEncoderFailureReason)
206   - /// `RequestAdapter` threw an error during adaptation.
207   - case requestAdaptationFailed(error: Error)
208   - /// `RequestRetrier` threw an error during the request retry process.
209   - case requestRetryFailed(retryError: Error, originalError: Error)
210   - /// Response validation failed.
211   - case responseValidationFailed(reason: ResponseValidationFailureReason)
212   - /// Response serialization failed.
213   - case responseSerializationFailed(reason: ResponseSerializationFailureReason)
214   - #if !(os(Linux) || os(Windows))
215   - /// `ServerTrustEvaluating` instance threw an error during trust evaluation.
216   - case serverTrustEvaluationFailed(reason: ServerTrustFailureReason)
217   - #endif
218   - /// `Session` which issued the `Request` was deinitialized, most likely because its reference went out of scope.
219   - case sessionDeinitialized
220   - /// `Session` was explicitly invalidated, possibly with the `Error` produced by the underlying `URLSession`.
221   - case sessionInvalidated(error: Error?)
222   - /// `URLSessionTask` completed with error.
223   - case sessionTaskFailed(error: Error)
224   - /// `URLRequest` failed validation.
225   - case urlRequestValidationFailed(reason: URLRequestValidationFailureReason)
226   -}
227   -
228   -extension Error {
229   - /// Returns the instance cast as an `AFError`.
230   - public var asAFError: AFError? {
231   - self as? AFError
232   - }
233   -
234   - /// Returns the instance cast as an `AFError`. If casting fails, a `fatalError` with the specified `message` is thrown.
235   - public func asAFError(orFailWith message: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) -> AFError {
236   - guard let afError = self as? AFError else {
237   - fatalError(message(), file: file, line: line)
238   - }
239   - return afError
240   - }
241   -
242   - /// Casts the instance as `AFError` or returns `defaultAFError`
243   - func asAFError(or defaultAFError: @autoclosure () -> AFError) -> AFError {
244   - self as? AFError ?? defaultAFError()
245   - }
246   -}
247   -
248   -// MARK: - Error Booleans
249   -
250   -extension AFError {
251   - /// Returns whether the instance is `.sessionDeinitialized`.
252   - public var isSessionDeinitializedError: Bool {
253   - if case .sessionDeinitialized = self { return true }
254   - return false
255   - }
256   -
257   - /// Returns whether the instance is `.sessionInvalidated`.
258   - public var isSessionInvalidatedError: Bool {
259   - if case .sessionInvalidated = self { return true }
260   - return false
261   - }
262   -
263   - /// Returns whether the instance is `.explicitlyCancelled`.
264   - public var isExplicitlyCancelledError: Bool {
265   - if case .explicitlyCancelled = self { return true }
266   - return false
267   - }
268   -
269   - /// Returns whether the instance is `.invalidURL`.
270   - public var isInvalidURLError: Bool {
271   - if case .invalidURL = self { return true }
272   - return false
273   - }
274   -
275   - /// Returns whether the instance is `.parameterEncodingFailed`. When `true`, the `underlyingError` property will
276   - /// contain the associated value.
277   - public var isParameterEncodingError: Bool {
278   - if case .parameterEncodingFailed = self { return true }
279   - return false
280   - }
281   -
282   - /// Returns whether the instance is `.parameterEncoderFailed`. When `true`, the `underlyingError` property will
283   - /// contain the associated value.
284   - public var isParameterEncoderError: Bool {
285   - if case .parameterEncoderFailed = self { return true }
286   - return false
287   - }
288   -
289   - /// Returns whether the instance is `.multipartEncodingFailed`. When `true`, the `url` and `underlyingError`
290   - /// properties will contain the associated values.
291   - public var isMultipartEncodingError: Bool {
292   - if case .multipartEncodingFailed = self { return true }
293   - return false
294   - }
295   -
296   - /// Returns whether the instance is `.requestAdaptationFailed`. When `true`, the `underlyingError` property will
297   - /// contain the associated value.
298   - public var isRequestAdaptationError: Bool {
299   - if case .requestAdaptationFailed = self { return true }
300   - return false
301   - }
302   -
303   - /// Returns whether the instance is `.responseValidationFailed`. When `true`, the `acceptableContentTypes`,
304   - /// `responseContentType`, `responseCode`, and `underlyingError` properties will contain the associated values.
305   - public var isResponseValidationError: Bool {
306   - if case .responseValidationFailed = self { return true }
307   - return false
308   - }
309   -
310   - /// Returns whether the instance is `.responseSerializationFailed`. When `true`, the `failedStringEncoding` and
311   - /// `underlyingError` properties will contain the associated values.
312   - public var isResponseSerializationError: Bool {
313   - if case .responseSerializationFailed = self { return true }
314   - return false
315   - }
316   -
317   - #if !(os(Linux) || os(Windows))
318   - /// Returns whether the instance is `.serverTrustEvaluationFailed`. When `true`, the `underlyingError` property will
319   - /// contain the associated value.
320   - public var isServerTrustEvaluationError: Bool {
321   - if case .serverTrustEvaluationFailed = self { return true }
322   - return false
323   - }
324   - #endif
325   -
326   - /// Returns whether the instance is `requestRetryFailed`. When `true`, the `underlyingError` property will
327   - /// contain the associated value.
328   - public var isRequestRetryError: Bool {
329   - if case .requestRetryFailed = self { return true }
330   - return false
331   - }
332   -
333   - /// Returns whether the instance is `createUploadableFailed`. When `true`, the `underlyingError` property will
334   - /// contain the associated value.
335   - public var isCreateUploadableError: Bool {
336   - if case .createUploadableFailed = self { return true }
337   - return false
338   - }
339   -
340   - /// Returns whether the instance is `createURLRequestFailed`. When `true`, the `underlyingError` property will
341   - /// contain the associated value.
342   - public var isCreateURLRequestError: Bool {
343   - if case .createURLRequestFailed = self { return true }
344   - return false
345   - }
346   -
347   - /// Returns whether the instance is `downloadedFileMoveFailed`. When `true`, the `destination` and `underlyingError` properties will
348   - /// contain the associated values.
349   - public var isDownloadedFileMoveError: Bool {
350   - if case .downloadedFileMoveFailed = self { return true }
351   - return false
352   - }
353   -
354   - /// Returns whether the instance is `createURLRequestFailed`. When `true`, the `underlyingError` property will
355   - /// contain the associated value.
356   - public var isSessionTaskError: Bool {
357   - if case .sessionTaskFailed = self { return true }
358   - return false
359   - }
360   -}
361   -
362   -// MARK: - Convenience Properties
363   -
364   -extension AFError {
365   - /// The `URLConvertible` associated with the error.
366   - public var urlConvertible: URLConvertible? {
367   - guard case let .invalidURL(url) = self else { return nil }
368   - return url
369   - }
370   -
371   - /// The `URL` associated with the error.
372   - public var url: URL? {
373   - guard case let .multipartEncodingFailed(reason) = self else { return nil }
374   - return reason.url
375   - }
376   -
377   - /// The underlying `Error` responsible for generating the failure associated with `.sessionInvalidated`,
378   - /// `.parameterEncodingFailed`, `.parameterEncoderFailed`, `.multipartEncodingFailed`, `.requestAdaptationFailed`,
379   - /// `.responseSerializationFailed`, `.requestRetryFailed` errors.
380   - public var underlyingError: Error? {
381   - switch self {
382   - case let .multipartEncodingFailed(reason):
383   - return reason.underlyingError
384   - case let .parameterEncodingFailed(reason):
385   - return reason.underlyingError
386   - case let .parameterEncoderFailed(reason):
387   - return reason.underlyingError
388   - case let .requestAdaptationFailed(error):
389   - return error
390   - case let .requestRetryFailed(retryError, _):
391   - return retryError
392   - case let .responseValidationFailed(reason):
393   - return reason.underlyingError
394   - case let .responseSerializationFailed(reason):
395   - return reason.underlyingError
396   - #if !(os(Linux) || os(Windows))
397   - case let .serverTrustEvaluationFailed(reason):
398   - return reason.underlyingError
399   - #endif
400   - case let .sessionInvalidated(error):
401   - return error
402   - case let .createUploadableFailed(error):
403   - return error
404   - case let .createURLRequestFailed(error):
405   - return error
406   - case let .downloadedFileMoveFailed(error, _, _):
407   - return error
408   - case let .sessionTaskFailed(error):
409   - return error
410   - case .explicitlyCancelled,
411   - .invalidURL,
412   - .sessionDeinitialized,
413   - .urlRequestValidationFailed:
414   - return nil
415   - }
416   - }
417   -
418   - /// The acceptable `Content-Type`s of a `.responseValidationFailed` error.
419   - public var acceptableContentTypes: [String]? {
420   - guard case let .responseValidationFailed(reason) = self else { return nil }
421   - return reason.acceptableContentTypes
422   - }
423   -
424   - /// The response `Content-Type` of a `.responseValidationFailed` error.
425   - public var responseContentType: String? {
426   - guard case let .responseValidationFailed(reason) = self else { return nil }
427   - return reason.responseContentType
428   - }
429   -
430   - /// The response code of a `.responseValidationFailed` error.
431   - public var responseCode: Int? {
432   - guard case let .responseValidationFailed(reason) = self else { return nil }
433   - return reason.responseCode
434   - }
435   -
436   - /// The `String.Encoding` associated with a failed `.stringResponse()` call.
437   - public var failedStringEncoding: String.Encoding? {
438   - guard case let .responseSerializationFailed(reason) = self else { return nil }
439   - return reason.failedStringEncoding
440   - }
441   -
442   - /// The `source` URL of a `.downloadedFileMoveFailed` error.
443   - public var sourceURL: URL? {
444   - guard case let .downloadedFileMoveFailed(_, source, _) = self else { return nil }
445   - return source
446   - }
447   -
448   - /// The `destination` URL of a `.downloadedFileMoveFailed` error.
449   - public var destinationURL: URL? {
450   - guard case let .downloadedFileMoveFailed(_, _, destination) = self else { return nil }
451   - return destination
452   - }
453   -
454   - #if !(os(Linux) || os(Windows))
455   - /// The download resume data of any underlying network error. Only produced by `DownloadRequest`s.
456   - public var downloadResumeData: Data? {
457   - (underlyingError as? URLError)?.userInfo[NSURLSessionDownloadTaskResumeData] as? Data
458   - }
459   - #endif
460   -}
461   -
462   -extension AFError.ParameterEncodingFailureReason {
463   - var underlyingError: Error? {
464   - switch self {
465   - case let .jsonEncodingFailed(error),
466   - let .customEncodingFailed(error):
467   - return error
468   - case .missingURL:
469   - return nil
470   - }
471   - }
472   -}
473   -
474   -extension AFError.ParameterEncoderFailureReason {
475   - var underlyingError: Error? {
476   - switch self {
477   - case let .encoderFailed(error):
478   - return error
479   - case .missingRequiredComponent:
480   - return nil
481   - }
482   - }
483   -}
484   -
485   -extension AFError.MultipartEncodingFailureReason {
486   - var url: URL? {
487   - switch self {
488   - case let .bodyPartURLInvalid(url),
489   - let .bodyPartFilenameInvalid(url),
490   - let .bodyPartFileNotReachable(url),
491   - let .bodyPartFileIsDirectory(url),
492   - let .bodyPartFileSizeNotAvailable(url),
493   - let .bodyPartInputStreamCreationFailed(url),
494   - let .outputStreamCreationFailed(url),
495   - let .outputStreamFileAlreadyExists(url),
496   - let .outputStreamURLInvalid(url),
497   - let .bodyPartFileNotReachableWithError(url, _),
498   - let .bodyPartFileSizeQueryFailedWithError(url, _):
499   - return url
500   - case .outputStreamWriteFailed,
501   - .inputStreamReadFailed:
502   - return nil
503   - }
504   - }
505   -
506   - var underlyingError: Error? {
507   - switch self {
508   - case let .bodyPartFileNotReachableWithError(_, error),
509   - let .bodyPartFileSizeQueryFailedWithError(_, error),
510   - let .outputStreamWriteFailed(error),
511   - let .inputStreamReadFailed(error):
512   - return error
513   - case .bodyPartURLInvalid,
514   - .bodyPartFilenameInvalid,
515   - .bodyPartFileNotReachable,
516   - .bodyPartFileIsDirectory,
517   - .bodyPartFileSizeNotAvailable,
518   - .bodyPartInputStreamCreationFailed,
519   - .outputStreamCreationFailed,
520   - .outputStreamFileAlreadyExists,
521   - .outputStreamURLInvalid:
522   - return nil
523   - }
524   - }
525   -}
526   -
527   -extension AFError.ResponseValidationFailureReason {
528   - var acceptableContentTypes: [String]? {
529   - switch self {
530   - case let .missingContentType(types),
531   - let .unacceptableContentType(types, _):
532   - return types
533   - case .dataFileNil,
534   - .dataFileReadFailed,
535   - .unacceptableStatusCode,
536   - .customValidationFailed:
537   - return nil
538   - }
539   - }
540   -
541   - var responseContentType: String? {
542   - switch self {
543   - case let .unacceptableContentType(_, responseType):
544   - return responseType
545   - case .dataFileNil,
546   - .dataFileReadFailed,
547   - .missingContentType,
548   - .unacceptableStatusCode,
549   - .customValidationFailed:
550   - return nil
551   - }
552   - }
553   -
554   - var responseCode: Int? {
555   - switch self {
556   - case let .unacceptableStatusCode(code):
557   - return code
558   - case .dataFileNil,
559   - .dataFileReadFailed,
560   - .missingContentType,
561   - .unacceptableContentType,
562   - .customValidationFailed:
563   - return nil
564   - }
565   - }
566   -
567   - var underlyingError: Error? {
568   - switch self {
569   - case let .customValidationFailed(error):
570   - return error
571   - case .dataFileNil,
572   - .dataFileReadFailed,
573   - .missingContentType,
574   - .unacceptableContentType,
575   - .unacceptableStatusCode:
576   - return nil
577   - }
578   - }
579   -}
580   -
581   -extension AFError.ResponseSerializationFailureReason {
582   - var failedStringEncoding: String.Encoding? {
583   - switch self {
584   - case let .stringSerializationFailed(encoding):
585   - return encoding
586   - case .inputDataNilOrZeroLength,
587   - .inputFileNil,
588   - .inputFileReadFailed(_),
589   - .jsonSerializationFailed(_),
590   - .decodingFailed(_),
591   - .customSerializationFailed(_),
592   - .invalidEmptyResponse:
593   - return nil
594   - }
595   - }
596   -
597   - var underlyingError: Error? {
598   - switch self {
599   - case let .jsonSerializationFailed(error),
600   - let .decodingFailed(error),
601   - let .customSerializationFailed(error):
602   - return error
603   - case .inputDataNilOrZeroLength,
604   - .inputFileNil,
605   - .inputFileReadFailed,
606   - .stringSerializationFailed,
607   - .invalidEmptyResponse:
608   - return nil
609   - }
610   - }
611   -}
612   -
613   -#if !(os(Linux) || os(Windows))
614   -extension AFError.ServerTrustFailureReason {
615   - var output: AFError.ServerTrustFailureReason.Output? {
616   - switch self {
617   - case let .defaultEvaluationFailed(output),
618   - let .hostValidationFailed(output),
619   - let .revocationCheckFailed(output, _):
620   - return output
621   - case .noRequiredEvaluator,
622   - .noCertificatesFound,
623   - .noPublicKeysFound,
624   - .policyApplicationFailed,
625   - .settingAnchorCertificatesFailed,
626   - .revocationPolicyCreationFailed,
627   - .trustEvaluationFailed,
628   - .certificatePinningFailed,
629   - .publicKeyPinningFailed,
630   - .customEvaluationFailed:
631   - return nil
632   - }
633   - }
634   -
635   - var underlyingError: Error? {
636   - switch self {
637   - case let .customEvaluationFailed(error):
638   - return error
639   - case let .trustEvaluationFailed(error):
640   - return error
641   - case .noRequiredEvaluator,
642   - .noCertificatesFound,
643   - .noPublicKeysFound,
644   - .policyApplicationFailed,
645   - .settingAnchorCertificatesFailed,
646   - .revocationPolicyCreationFailed,
647   - .defaultEvaluationFailed,
648   - .hostValidationFailed,
649   - .revocationCheckFailed,
650   - .certificatePinningFailed,
651   - .publicKeyPinningFailed:
652   - return nil
653   - }
654   - }
655   -}
656   -#endif
657   -
658   -// MARK: - Error Descriptions
659   -
660   -extension AFError: LocalizedError {
661   - public var errorDescription: String? {
662   - switch self {
663   - case .explicitlyCancelled:
664   - return "Request explicitly cancelled."
665   - case let .invalidURL(url):
666   - return "URL is not valid: \(url)"
667   - case let .parameterEncodingFailed(reason):
668   - return reason.localizedDescription
669   - case let .parameterEncoderFailed(reason):
670   - return reason.localizedDescription
671   - case let .multipartEncodingFailed(reason):
672   - return reason.localizedDescription
673   - case let .requestAdaptationFailed(error):
674   - return "Request adaption failed with error: \(error.localizedDescription)"
675   - case let .responseValidationFailed(reason):
676   - return reason.localizedDescription
677   - case let .responseSerializationFailed(reason):
678   - return reason.localizedDescription
679   - case let .requestRetryFailed(retryError, originalError):
680   - return """
681   - Request retry failed with retry error: \(retryError.localizedDescription), \
682   - original error: \(originalError.localizedDescription)
683   - """
684   - case .sessionDeinitialized:
685   - return """
686   - Session was invalidated without error, so it was likely deinitialized unexpectedly. \
687   - Be sure to retain a reference to your Session for the duration of your requests.
688   - """
689   - case let .sessionInvalidated(error):
690   - return "Session was invalidated with error: \(error?.localizedDescription ?? "No description.")"
691   - #if !(os(Linux) || os(Windows))
692   - case let .serverTrustEvaluationFailed(reason):
693   - return "Server trust evaluation failed due to reason: \(reason.localizedDescription)"
694   - #endif
695   - case let .urlRequestValidationFailed(reason):
696   - return "URLRequest validation failed due to reason: \(reason.localizedDescription)"
697   - case let .createUploadableFailed(error):
698   - return "Uploadable creation failed with error: \(error.localizedDescription)"
699   - case let .createURLRequestFailed(error):
700   - return "URLRequest creation failed with error: \(error.localizedDescription)"
701   - case let .downloadedFileMoveFailed(error, source, destination):
702   - return "Moving downloaded file from: \(source) to: \(destination) failed with error: \(error.localizedDescription)"
703   - case let .sessionTaskFailed(error):
704   - return "URLSessionTask failed with error: \(error.localizedDescription)"
705   - }
706   - }
707   -}
708   -
709   -extension AFError.ParameterEncodingFailureReason {
710   - var localizedDescription: String {
711   - switch self {
712   - case .missingURL:
713   - return "URL request to encode was missing a URL"
714   - case let .jsonEncodingFailed(error):
715   - return "JSON could not be encoded because of error:\n\(error.localizedDescription)"
716   - case let .customEncodingFailed(error):
717   - return "Custom parameter encoder failed with error: \(error.localizedDescription)"
718   - }
719   - }
720   -}
721   -
722   -extension AFError.ParameterEncoderFailureReason {
723   - var localizedDescription: String {
724   - switch self {
725   - case let .missingRequiredComponent(component):
726   - return "Encoding failed due to a missing request component: \(component)"
727   - case let .encoderFailed(error):
728   - return "The underlying encoder failed with the error: \(error)"
729   - }
730   - }
731   -}
732   -
733   -extension AFError.MultipartEncodingFailureReason {
734   - var localizedDescription: String {
735   - switch self {
736   - case let .bodyPartURLInvalid(url):
737   - return "The URL provided is not a file URL: \(url)"
738   - case let .bodyPartFilenameInvalid(url):
739   - return "The URL provided does not have a valid filename: \(url)"
740   - case let .bodyPartFileNotReachable(url):
741   - return "The URL provided is not reachable: \(url)"
742   - case let .bodyPartFileNotReachableWithError(url, error):
743   - return """
744   - The system returned an error while checking the provided URL for reachability.
745   - URL: \(url)
746   - Error: \(error)
747   - """
748   - case let .bodyPartFileIsDirectory(url):
749   - return "The URL provided is a directory: \(url)"
750   - case let .bodyPartFileSizeNotAvailable(url):
751   - return "Could not fetch the file size from the provided URL: \(url)"
752   - case let .bodyPartFileSizeQueryFailedWithError(url, error):
753   - return """
754   - The system returned an error while attempting to fetch the file size from the provided URL.
755   - URL: \(url)
756   - Error: \(error)
757   - """
758   - case let .bodyPartInputStreamCreationFailed(url):
759   - return "Failed to create an InputStream for the provided URL: \(url)"
760   - case let .outputStreamCreationFailed(url):
761   - return "Failed to create an OutputStream for URL: \(url)"
762   - case let .outputStreamFileAlreadyExists(url):
763   - return "A file already exists at the provided URL: \(url)"
764   - case let .outputStreamURLInvalid(url):
765   - return "The provided OutputStream URL is invalid: \(url)"
766   - case let .outputStreamWriteFailed(error):
767   - return "OutputStream write failed with error: \(error)"
768   - case let .inputStreamReadFailed(error):
769   - return "InputStream read failed with error: \(error)"
770   - }
771   - }
772   -}
773   -
774   -extension AFError.ResponseSerializationFailureReason {
775   - var localizedDescription: String {
776   - switch self {
777   - case .inputDataNilOrZeroLength:
778   - return "Response could not be serialized, input data was nil or zero length."
779   - case .inputFileNil:
780   - return "Response could not be serialized, input file was nil."
781   - case let .inputFileReadFailed(url):
782   - return "Response could not be serialized, input file could not be read: \(url)."
783   - case let .stringSerializationFailed(encoding):
784   - return "String could not be serialized with encoding: \(encoding)."
785   - case let .jsonSerializationFailed(error):
786   - return "JSON could not be serialized because of error:\n\(error.localizedDescription)"
787   - case let .invalidEmptyResponse(type):
788   - return """
789   - Empty response could not be serialized to type: \(type). \
790   - Use Empty as the expected type for such responses.
791   - """
792   - case let .decodingFailed(error):
793   - return "Response could not be decoded because of error:\n\(error.localizedDescription)"
794   - case let .customSerializationFailed(error):
795   - return "Custom response serializer failed with error:\n\(error.localizedDescription)"
796   - }
797   - }
798   -}
799   -
800   -extension AFError.ResponseValidationFailureReason {
801   - var localizedDescription: String {
802   - switch self {
803   - case .dataFileNil:
804   - return "Response could not be validated, data file was nil."
805   - case let .dataFileReadFailed(url):
806   - return "Response could not be validated, data file could not be read: \(url)."
807   - case let .missingContentType(types):
808   - return """
809   - Response Content-Type was missing and acceptable content types \
810   - (\(types.joined(separator: ","))) do not match "*/*".
811   - """
812   - case let .unacceptableContentType(acceptableTypes, responseType):
813   - return """
814   - Response Content-Type "\(responseType)" does not match any acceptable types: \
815   - \(acceptableTypes.joined(separator: ",")).
816   - """
817   - case let .unacceptableStatusCode(code):
818   - return "Response status code was unacceptable: \(code)."
819   - case let .customValidationFailed(error):
820   - return "Custom response validation failed with error: \(error.localizedDescription)"
821   - }
822   - }
823   -}
824   -
825   -#if !(os(Linux) || os(Windows))
826   -extension AFError.ServerTrustFailureReason {
827   - var localizedDescription: String {
828   - switch self {
829   - case let .noRequiredEvaluator(host):
830   - return "A ServerTrustEvaluating value is required for host \(host) but none was found."
831   - case .noCertificatesFound:
832   - return "No certificates were found or provided for evaluation."
833   - case .noPublicKeysFound:
834   - return "No public keys were found or provided for evaluation."
835   - case .policyApplicationFailed:
836   - return "Attempting to set a SecPolicy failed."
837   - case .settingAnchorCertificatesFailed:
838   - return "Attempting to set the provided certificates as anchor certificates failed."
839   - case .revocationPolicyCreationFailed:
840   - return "Attempting to create a revocation policy failed."
841   - case let .trustEvaluationFailed(error):
842   - return "SecTrust evaluation failed with error: \(error?.localizedDescription ?? "None")"
843   - case let .defaultEvaluationFailed(output):
844   - return "Default evaluation failed for host \(output.host)."
845   - case let .hostValidationFailed(output):
846   - return "Host validation failed for host \(output.host)."
847   - case let .revocationCheckFailed(output, _):
848   - return "Revocation check failed for host \(output.host)."
849   - case let .certificatePinningFailed(host, _, _, _):
850   - return "Certificate pinning failed for host \(host)."
851   - case let .publicKeyPinningFailed(host, _, _, _):
852   - return "Public key pinning failed for host \(host)."
853   - case let .customEvaluationFailed(error):
854   - return "Custom trust evaluation failed with error: \(error.localizedDescription)"
855   - }
856   - }
857   -}
858   -#endif
859   -
860   -extension AFError.URLRequestValidationFailureReason {
861   - var localizedDescription: String {
862   - switch self {
863   - case let .bodyDataInGETRequest(data):
864   - return """
865   - Invalid URLRequest: Requests with GET method cannot have body data:
866   - \(String(decoding: data, as: UTF8.self))
867   - """
868   - }
869   - }
870   -}
Pods/Alamofire/Source/Alamofire.swift deleted 100644 → 0
1   -//
2   -// Alamofire.swift
3   -//
4   -// Copyright (c) 2014-2021 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -import Dispatch
26   -import Foundation
27   -#if canImport(FoundationNetworking)
28   -@_exported import FoundationNetworking
29   -#endif
30   -
31   -// Enforce minimum Swift version for all platforms and build systems.
32   -#if swift(<5.5)
33   -#error("Alamofire doesn't support Swift versions below 5.5.")
34   -#endif
35   -
36   -/// Reference to `Session.default` for quick bootstrapping and examples.
37   -public let AF = Session.default
38   -
39   -/// Current Alamofire version. Necessary since SPM doesn't use dynamic libraries. Plus this will be more accurate.
40   -let version = "5.7.1"
Pods/Alamofire/Source/AlamofireExtended.swift deleted 100644 → 0
1   -//
2   -// AlamofireExtended.swift
3   -//
4   -// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -/// Type that acts as a generic extension point for all `AlamofireExtended` types.
26   -public struct AlamofireExtension<ExtendedType> {
27   - /// Stores the type or meta-type of any extended type.
28   - public private(set) var type: ExtendedType
29   -
30   - /// Create an instance from the provided value.
31   - ///
32   - /// - Parameter type: Instance being extended.
33   - public init(_ type: ExtendedType) {
34   - self.type = type
35   - }
36   -}
37   -
38   -/// Protocol describing the `af` extension points for Alamofire extended types.
39   -public protocol AlamofireExtended {
40   - /// Type being extended.
41   - associatedtype ExtendedType
42   -
43   - /// Static Alamofire extension point.
44   - static var af: AlamofireExtension<ExtendedType>.Type { get set }
45   - /// Instance Alamofire extension point.
46   - var af: AlamofireExtension<ExtendedType> { get set }
47   -}
48   -
49   -extension AlamofireExtended {
50   - /// Static Alamofire extension point.
51   - public static var af: AlamofireExtension<Self>.Type {
52   - get { AlamofireExtension<Self>.self }
53   - set {}
54   - }
55   -
56   - /// Instance Alamofire extension point.
57   - public var af: AlamofireExtension<Self> {
58   - get { AlamofireExtension(self) }
59   - set {}
60   - }
61   -}
Pods/Alamofire/Source/AuthenticationInterceptor.swift deleted 100644 → 0
1   -//
2   -// AuthenticationInterceptor.swift
3   -//
4   -// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -import Foundation
26   -
27   -/// Types adopting the `AuthenticationCredential` protocol can be used to authenticate `URLRequest`s.
28   -///
29   -/// One common example of an `AuthenticationCredential` is an OAuth2 credential containing an access token used to
30   -/// authenticate all requests on behalf of a user. The access token generally has an expiration window of 60 minutes
31   -/// which will then require a refresh of the credential using the refresh token to generate a new access token.
32   -public protocol AuthenticationCredential {
33   - /// Whether the credential requires a refresh. This property should always return `true` when the credential is
34   - /// expired. It is also wise to consider returning `true` when the credential will expire in several seconds or
35   - /// minutes depending on the expiration window of the credential.
36   - ///
37   - /// For example, if the credential is valid for 60 minutes, then it would be wise to return `true` when the
38   - /// credential is only valid for 5 minutes or less. That ensures the credential will not expire as it is passed
39   - /// around backend services.
40   - var requiresRefresh: Bool { get }
41   -}
42   -
43   -// MARK: -
44   -
45   -/// Types adopting the `Authenticator` protocol can be used to authenticate `URLRequest`s with an
46   -/// `AuthenticationCredential` as well as refresh the `AuthenticationCredential` when required.
47   -public protocol Authenticator: AnyObject {
48   - /// The type of credential associated with the `Authenticator` instance.
49   - associatedtype Credential: AuthenticationCredential
50   -
51   - /// Applies the `Credential` to the `URLRequest`.
52   - ///
53   - /// In the case of OAuth2, the access token of the `Credential` would be added to the `URLRequest` as a Bearer
54   - /// token to the `Authorization` header.
55   - ///
56   - /// - Parameters:
57   - /// - credential: The `Credential`.
58   - /// - urlRequest: The `URLRequest`.
59   - func apply(_ credential: Credential, to urlRequest: inout URLRequest)
60   -
61   - /// Refreshes the `Credential` and executes the `completion` closure with the `Result` once complete.
62   - ///
63   - /// Refresh can be called in one of two ways. It can be called before the `Request` is actually executed due to
64   - /// a `requiresRefresh` returning `true` during the adapt portion of the `Request` creation process. It can also
65   - /// be triggered by a failed `Request` where the authentication server denied access due to an expired or
66   - /// invalidated access token.
67   - ///
68   - /// In the case of OAuth2, this method would use the refresh token of the `Credential` to generate a new
69   - /// `Credential` using the authentication service. Once complete, the `completion` closure should be called with
70   - /// the new `Credential`, or the error that occurred.
71   - ///
72   - /// In general, if the refresh call fails with certain status codes from the authentication server (commonly a 401),
73   - /// the refresh token in the `Credential` can no longer be used to generate a valid `Credential`. In these cases,
74   - /// you will need to reauthenticate the user with their username / password.
75   - ///
76   - /// Please note, these are just general examples of common use cases. They are not meant to solve your specific
77   - /// authentication server challenges. Please work with your authentication server team to ensure your
78   - /// `Authenticator` logic matches their expectations.
79   - ///
80   - /// - Parameters:
81   - /// - credential: The `Credential` to refresh.
82   - /// - session: The `Session` requiring the refresh.
83   - /// - completion: The closure to be executed once the refresh is complete.
84   - func refresh(_ credential: Credential, for session: Session, completion: @escaping (Result<Credential, Error>) -> Void)
85   -
86   - /// Determines whether the `URLRequest` failed due to an authentication error based on the `HTTPURLResponse`.
87   - ///
88   - /// If the authentication server **CANNOT** invalidate credentials after they are issued, then simply return `false`
89   - /// for this method. If the authentication server **CAN** invalidate credentials due to security breaches, then you
90   - /// will need to work with your authentication server team to understand how to identify when this occurs.
91   - ///
92   - /// In the case of OAuth2, where an authentication server can invalidate credentials, you will need to inspect the
93   - /// `HTTPURLResponse` or possibly the `Error` for when this occurs. This is commonly handled by the authentication
94   - /// server returning a 401 status code and some additional header to indicate an OAuth2 failure occurred.
95   - ///
96   - /// It is very important to understand how your authentication server works to be able to implement this correctly.
97   - /// For example, if your authentication server returns a 401 when an OAuth2 error occurs, and your downstream
98   - /// service also returns a 401 when you are not authorized to perform that operation, how do you know which layer
99   - /// of the backend returned you a 401? You do not want to trigger a refresh unless you know your authentication
100   - /// server is actually the layer rejecting the request. Again, work with your authentication server team to understand
101   - /// how to identify an OAuth2 401 error vs. a downstream 401 error to avoid endless refresh loops.
102   - ///
103   - /// - Parameters:
104   - /// - urlRequest: The `URLRequest`.
105   - /// - response: The `HTTPURLResponse`.
106   - /// - error: The `Error`.
107   - ///
108   - /// - Returns: `true` if the `URLRequest` failed due to an authentication error, `false` otherwise.
109   - func didRequest(_ urlRequest: URLRequest, with response: HTTPURLResponse, failDueToAuthenticationError error: Error) -> Bool
110   -
111   - /// Determines whether the `URLRequest` is authenticated with the `Credential`.
112   - ///
113   - /// If the authentication server **CANNOT** invalidate credentials after they are issued, then simply return `true`
114   - /// for this method. If the authentication server **CAN** invalidate credentials due to security breaches, then
115   - /// read on.
116   - ///
117   - /// When an authentication server can invalidate credentials, it means that you may have a non-expired credential
118   - /// that appears to be valid, but will be rejected by the authentication server when used. Generally when this
119   - /// happens, a number of requests are all sent when the application is foregrounded, and all of them will be
120   - /// rejected by the authentication server in the order they are received. The first failed request will trigger a
121   - /// refresh internally, which will update the credential, and then retry all the queued requests with the new
122   - /// credential. However, it is possible that some of the original requests will not return from the authentication
123   - /// server until the refresh has completed. This is where this method comes in.
124   - ///
125   - /// When the authentication server rejects a credential, we need to check to make sure we haven't refreshed the
126   - /// credential while the request was in flight. If it has already refreshed, then we don't need to trigger an
127   - /// additional refresh. If it hasn't refreshed, then we need to refresh.
128   - ///
129   - /// Now that it is understood how the result of this method is used in the refresh lifecyle, let's walk through how
130   - /// to implement it. You should return `true` in this method if the `URLRequest` is authenticated in a way that
131   - /// matches the values in the `Credential`. In the case of OAuth2, this would mean that the Bearer token in the
132   - /// `Authorization` header of the `URLRequest` matches the access token in the `Credential`. If it matches, then we
133   - /// know the `Credential` was used to authenticate the `URLRequest` and should return `true`. If the Bearer token
134   - /// did not match the access token, then you should return `false`.
135   - ///
136   - /// - Parameters:
137   - /// - urlRequest: The `URLRequest`.
138   - /// - credential: The `Credential`.
139   - ///
140   - /// - Returns: `true` if the `URLRequest` is authenticated with the `Credential`, `false` otherwise.
141   - func isRequest(_ urlRequest: URLRequest, authenticatedWith credential: Credential) -> Bool
142   -}
143   -
144   -// MARK: -
145   -
146   -/// Represents various authentication failures that occur when using the `AuthenticationInterceptor`. All errors are
147   -/// still vended from Alamofire as `AFError` types. The `AuthenticationError` instances will be embedded within
148   -/// `AFError` `.requestAdaptationFailed` or `.requestRetryFailed` cases.
149   -public enum AuthenticationError: Error {
150   - /// The credential was missing so the request could not be authenticated.
151   - case missingCredential
152   - /// The credential was refreshed too many times within the `RefreshWindow`.
153   - case excessiveRefresh
154   -}
155   -
156   -// MARK: -
157   -
158   -/// The `AuthenticationInterceptor` class manages the queuing and threading complexity of authenticating requests.
159   -/// It relies on an `Authenticator` type to handle the actual `URLRequest` authentication and `Credential` refresh.
160   -public class AuthenticationInterceptor<AuthenticatorType>: RequestInterceptor where AuthenticatorType: Authenticator {
161   - // MARK: Typealiases
162   -
163   - /// Type of credential used to authenticate requests.
164   - public typealias Credential = AuthenticatorType.Credential
165   -
166   - // MARK: Helper Types
167   -
168   - /// Type that defines a time window used to identify excessive refresh calls. When enabled, prior to executing a
169   - /// refresh, the `AuthenticationInterceptor` compares the timestamp history of previous refresh calls against the
170   - /// `RefreshWindow`. If more refreshes have occurred within the refresh window than allowed, the refresh is
171   - /// cancelled and an `AuthorizationError.excessiveRefresh` error is thrown.
172   - public struct RefreshWindow {
173   - /// `TimeInterval` defining the duration of the time window before the current time in which the number of
174   - /// refresh attempts is compared against `maximumAttempts`. For example, if `interval` is 30 seconds, then the
175   - /// `RefreshWindow` represents the past 30 seconds. If more attempts occurred in the past 30 seconds than
176   - /// `maximumAttempts`, an `.excessiveRefresh` error will be thrown.
177   - public let interval: TimeInterval
178   -
179   - /// Total refresh attempts allowed within `interval` before throwing an `.excessiveRefresh` error.
180   - public let maximumAttempts: Int
181   -
182   - /// Creates a `RefreshWindow` instance from the specified `interval` and `maximumAttempts`.
183   - ///
184   - /// - Parameters:
185   - /// - interval: `TimeInterval` defining the duration of the time window before the current time.
186   - /// - maximumAttempts: The maximum attempts allowed within the `TimeInterval`.
187   - public init(interval: TimeInterval = 30.0, maximumAttempts: Int = 5) {
188   - self.interval = interval
189   - self.maximumAttempts = maximumAttempts
190   - }
191   - }
192   -
193   - private struct AdaptOperation {
194   - let urlRequest: URLRequest
195   - let session: Session
196   - let completion: (Result<URLRequest, Error>) -> Void
197   - }
198   -
199   - private enum AdaptResult {
200   - case adapt(Credential)
201   - case doNotAdapt(AuthenticationError)
202   - case adaptDeferred
203   - }
204   -
205   - private struct MutableState {
206   - var credential: Credential?
207   -
208   - var isRefreshing = false
209   - var refreshTimestamps: [TimeInterval] = []
210   - var refreshWindow: RefreshWindow?
211   -
212   - var adaptOperations: [AdaptOperation] = []
213   - var requestsToRetry: [(RetryResult) -> Void] = []
214   - }
215   -
216   - // MARK: Properties
217   -
218   - /// The `Credential` used to authenticate requests.
219   - public var credential: Credential? {
220   - get { $mutableState.credential }
221   - set { $mutableState.credential = newValue }
222   - }
223   -
224   - let authenticator: AuthenticatorType
225   - let queue = DispatchQueue(label: "org.alamofire.authentication.inspector")
226   -
227   - @Protected
228   - private var mutableState: MutableState
229   -
230   - // MARK: Initialization
231   -
232   - /// Creates an `AuthenticationInterceptor` instance from the specified parameters.
233   - ///
234   - /// A `nil` `RefreshWindow` will result in the `AuthenticationInterceptor` not checking for excessive refresh calls.
235   - /// It is recommended to always use a `RefreshWindow` to avoid endless refresh cycles.
236   - ///
237   - /// - Parameters:
238   - /// - authenticator: The `Authenticator` type.
239   - /// - credential: The `Credential` if it exists. `nil` by default.
240   - /// - refreshWindow: The `RefreshWindow` used to identify excessive refresh calls. `RefreshWindow()` by default.
241   - public init(authenticator: AuthenticatorType,
242   - credential: Credential? = nil,
243   - refreshWindow: RefreshWindow? = RefreshWindow()) {
244   - self.authenticator = authenticator
245   - mutableState = MutableState(credential: credential, refreshWindow: refreshWindow)
246   - }
247   -
248   - // MARK: Adapt
249   -
250   - public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
251   - let adaptResult: AdaptResult = $mutableState.write { mutableState in
252   - // Queue the adapt operation if a refresh is already in place.
253   - guard !mutableState.isRefreshing else {
254   - let operation = AdaptOperation(urlRequest: urlRequest, session: session, completion: completion)
255   - mutableState.adaptOperations.append(operation)
256   - return .adaptDeferred
257   - }
258   -
259   - // Throw missing credential error is the credential is missing.
260   - guard let credential = mutableState.credential else {
261   - let error = AuthenticationError.missingCredential
262   - return .doNotAdapt(error)
263   - }
264   -
265   - // Queue the adapt operation and trigger refresh operation if credential requires refresh.
266   - guard !credential.requiresRefresh else {
267   - let operation = AdaptOperation(urlRequest: urlRequest, session: session, completion: completion)
268   - mutableState.adaptOperations.append(operation)
269   - refresh(credential, for: session, insideLock: &mutableState)
270   - return .adaptDeferred
271   - }
272   -
273   - return .adapt(credential)
274   - }
275   -
276   - switch adaptResult {
277   - case let .adapt(credential):
278   - var authenticatedRequest = urlRequest
279   - authenticator.apply(credential, to: &authenticatedRequest)
280   - completion(.success(authenticatedRequest))
281   -
282   - case let .doNotAdapt(adaptError):
283   - completion(.failure(adaptError))
284   -
285   - case .adaptDeferred:
286   - // No-op: adapt operation captured during refresh.
287   - break
288   - }
289   - }
290   -
291   - // MARK: Retry
292   -
293   - public func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
294   - // Do not attempt retry if there was not an original request and response from the server.
295   - guard let urlRequest = request.request, let response = request.response else {
296   - completion(.doNotRetry)
297   - return
298   - }
299   -
300   - // Do not attempt retry unless the `Authenticator` verifies failure was due to authentication error (i.e. 401 status code).
301   - guard authenticator.didRequest(urlRequest, with: response, failDueToAuthenticationError: error) else {
302   - completion(.doNotRetry)
303   - return
304   - }
305   -
306   - // Do not attempt retry if there is no credential.
307   - guard let credential = credential else {
308   - let error = AuthenticationError.missingCredential
309   - completion(.doNotRetryWithError(error))
310   - return
311   - }
312   -
313   - // Retry the request if the `Authenticator` verifies it was authenticated with a previous credential.
314   - guard authenticator.isRequest(urlRequest, authenticatedWith: credential) else {
315   - completion(.retry)
316   - return
317   - }
318   -
319   - $mutableState.write { mutableState in
320   - mutableState.requestsToRetry.append(completion)
321   -
322   - guard !mutableState.isRefreshing else { return }
323   -
324   - refresh(credential, for: session, insideLock: &mutableState)
325   - }
326   - }
327   -
328   - // MARK: Refresh
329   -
330   - private func refresh(_ credential: Credential, for session: Session, insideLock mutableState: inout MutableState) {
331   - guard !isRefreshExcessive(insideLock: &mutableState) else {
332   - let error = AuthenticationError.excessiveRefresh
333   - handleRefreshFailure(error, insideLock: &mutableState)
334   - return
335   - }
336   -
337   - mutableState.refreshTimestamps.append(ProcessInfo.processInfo.systemUptime)
338   - mutableState.isRefreshing = true
339   -
340   - // Dispatch to queue to hop out of the lock in case authenticator.refresh is implemented synchronously.
341   - queue.async {
342   - self.authenticator.refresh(credential, for: session) { result in
343   - self.$mutableState.write { mutableState in
344   - switch result {
345   - case let .success(credential):
346   - self.handleRefreshSuccess(credential, insideLock: &mutableState)
347   - case let .failure(error):
348   - self.handleRefreshFailure(error, insideLock: &mutableState)
349   - }
350   - }
351   - }
352   - }
353   - }
354   -
355   - private func isRefreshExcessive(insideLock mutableState: inout MutableState) -> Bool {
356   - guard let refreshWindow = mutableState.refreshWindow else { return false }
357   -
358   - let refreshWindowMin = ProcessInfo.processInfo.systemUptime - refreshWindow.interval
359   -
360   - let refreshAttemptsWithinWindow = mutableState.refreshTimestamps.reduce(into: 0) { attempts, refreshTimestamp in
361   - guard refreshWindowMin <= refreshTimestamp else { return }
362   - attempts += 1
363   - }
364   -
365   - let isRefreshExcessive = refreshAttemptsWithinWindow >= refreshWindow.maximumAttempts
366   -
367   - return isRefreshExcessive
368   - }
369   -
370   - private func handleRefreshSuccess(_ credential: Credential, insideLock mutableState: inout MutableState) {
371   - mutableState.credential = credential
372   -
373   - let adaptOperations = mutableState.adaptOperations
374   - let requestsToRetry = mutableState.requestsToRetry
375   -
376   - mutableState.adaptOperations.removeAll()
377   - mutableState.requestsToRetry.removeAll()
378   -
379   - mutableState.isRefreshing = false
380   -
381   - // Dispatch to queue to hop out of the mutable state lock
382   - queue.async {
383   - adaptOperations.forEach { self.adapt($0.urlRequest, for: $0.session, completion: $0.completion) }
384   - requestsToRetry.forEach { $0(.retry) }
385   - }
386   - }
387   -
388   - private func handleRefreshFailure(_ error: Error, insideLock mutableState: inout MutableState) {
389   - let adaptOperations = mutableState.adaptOperations
390   - let requestsToRetry = mutableState.requestsToRetry
391   -
392   - mutableState.adaptOperations.removeAll()
393   - mutableState.requestsToRetry.removeAll()
394   -
395   - mutableState.isRefreshing = false
396   -
397   - // Dispatch to queue to hop out of the mutable state lock
398   - queue.async {
399   - adaptOperations.forEach { $0.completion(.failure(error)) }
400   - requestsToRetry.forEach { $0(.doNotRetryWithError(error)) }
401   - }
402   - }
403   -}
Pods/Alamofire/Source/CachedResponseHandler.swift deleted 100644 → 0
1   -//
2   -// CachedResponseHandler.swift
3   -//
4   -// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -import Foundation
26   -
27   -/// A type that handles whether the data task should store the HTTP response in the cache.
28   -public protocol CachedResponseHandler {
29   - /// Determines whether the HTTP response should be stored in the cache.
30   - ///
31   - /// The `completion` closure should be passed one of three possible options:
32   - ///
33   - /// 1. The cached response provided by the server (this is the most common use case).
34   - /// 2. A modified version of the cached response (you may want to modify it in some way before caching).
35   - /// 3. A `nil` value to prevent the cached response from being stored in the cache.
36   - ///
37   - /// - Parameters:
38   - /// - task: The data task whose request resulted in the cached response.
39   - /// - response: The cached response to potentially store in the cache.
40   - /// - completion: The closure to execute containing cached response, a modified response, or `nil`.
41   - func dataTask(_ task: URLSessionDataTask,
42   - willCacheResponse response: CachedURLResponse,
43   - completion: @escaping (CachedURLResponse?) -> Void)
44   -}
45   -
46   -// MARK: -
47   -
48   -/// `ResponseCacher` is a convenience `CachedResponseHandler` making it easy to cache, not cache, or modify a cached
49   -/// response.
50   -public struct ResponseCacher {
51   - /// Defines the behavior of the `ResponseCacher` type.
52   - public enum Behavior {
53   - /// Stores the cached response in the cache.
54   - case cache
55   - /// Prevents the cached response from being stored in the cache.
56   - case doNotCache
57   - /// Modifies the cached response before storing it in the cache.
58   - case modify((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)
59   - }
60   -
61   - /// Returns a `ResponseCacher` with a `.cache` `Behavior`.
62   - public static let cache = ResponseCacher(behavior: .cache)
63   - /// Returns a `ResponseCacher` with a `.doNotCache` `Behavior`.
64   - public static let doNotCache = ResponseCacher(behavior: .doNotCache)
65   -
66   - /// The `Behavior` of the `ResponseCacher`.
67   - public let behavior: Behavior
68   -
69   - /// Creates a `ResponseCacher` instance from the `Behavior`.
70   - ///
71   - /// - Parameter behavior: The `Behavior`.
72   - public init(behavior: Behavior) {
73   - self.behavior = behavior
74   - }
75   -}
76   -
77   -extension ResponseCacher: CachedResponseHandler {
78   - public func dataTask(_ task: URLSessionDataTask,
79   - willCacheResponse response: CachedURLResponse,
80   - completion: @escaping (CachedURLResponse?) -> Void) {
81   - switch behavior {
82   - case .cache:
83   - completion(response)
84   - case .doNotCache:
85   - completion(nil)
86   - case let .modify(closure):
87   - let response = closure(task, response)
88   - completion(response)
89   - }
90   - }
91   -}
92   -
93   -extension CachedResponseHandler where Self == ResponseCacher {
94   - /// Provides a `ResponseCacher` which caches the response, if allowed. Equivalent to `ResponseCacher.cache`.
95   - public static var cache: ResponseCacher { .cache }
96   -
97   - /// Provides a `ResponseCacher` which does not cache the response. Equivalent to `ResponseCacher.doNotCache`.
98   - public static var doNotCache: ResponseCacher { .doNotCache }
99   -
100   - /// Creates a `ResponseCacher` which modifies the proposed `CachedURLResponse` using the provided closure.
101   - ///
102   - /// - Parameter closure: Closure used to modify the `CachedURLResponse`.
103   - /// - Returns: The `ResponseCacher`.
104   - public static func modify(using closure: @escaping ((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)) -> ResponseCacher {
105   - ResponseCacher(behavior: .modify(closure))
106   - }
107   -}
Pods/Alamofire/Source/Combine.swift deleted 100644 → 0
1   -//
2   -// Combine.swift
3   -//
4   -// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -#if !((os(iOS) && (arch(i386) || arch(arm))) || os(Windows) || os(Linux))
26   -
27   -import Combine
28   -import Dispatch
29   -import Foundation
30   -
31   -// MARK: - DataRequest / UploadRequest
32   -
33   -/// A Combine `Publisher` that publishes the `DataResponse<Value, AFError>` of the provided `DataRequest`.
34   -@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
35   -public struct DataResponsePublisher<Value>: Publisher {
36   - public typealias Output = DataResponse<Value, AFError>
37   - public typealias Failure = Never
38   -
39   - private typealias Handler = (@escaping (_ response: DataResponse<Value, AFError>) -> Void) -> DataRequest
40   -
41   - private let request: DataRequest
42   - private let responseHandler: Handler
43   -
44   - /// Creates an instance which will serialize responses using the provided `ResponseSerializer`.
45   - ///
46   - /// - Parameters:
47   - /// - request: `DataRequest` for which to publish the response.
48   - /// - queue: `DispatchQueue` on which the `DataResponse` value will be published. `.main` by default.
49   - /// - serializer: `ResponseSerializer` used to produce the published `DataResponse`.
50   - public init<Serializer: ResponseSerializer>(_ request: DataRequest, queue: DispatchQueue, serializer: Serializer)
51   - where Value == Serializer.SerializedObject {
52   - self.request = request
53   - responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) }
54   - }
55   -
56   - /// Creates an instance which will serialize responses using the provided `DataResponseSerializerProtocol`.
57   - ///
58   - /// - Parameters:
59   - /// - request: `DataRequest` for which to publish the response.
60   - /// - queue: `DispatchQueue` on which the `DataResponse` value will be published. `.main` by default.
61   - /// - serializer: `DataResponseSerializerProtocol` used to produce the published `DataResponse`.
62   - public init<Serializer: DataResponseSerializerProtocol>(_ request: DataRequest,
63   - queue: DispatchQueue,
64   - serializer: Serializer)
65   - where Value == Serializer.SerializedObject {
66   - self.request = request
67   - responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) }
68   - }
69   -
70   - /// Publishes only the `Result` of the `DataResponse` value.
71   - ///
72   - /// - Returns: The `AnyPublisher` publishing the `Result<Value, AFError>` value.
73   - public func result() -> AnyPublisher<Result<Value, AFError>, Never> {
74   - map(\.result).eraseToAnyPublisher()
75   - }
76   -
77   - /// Publishes the `Result` of the `DataResponse` as a single `Value` or fail with the `AFError` instance.
78   - ///
79   - /// - Returns: The `AnyPublisher<Value, AFError>` publishing the stream.
80   - public func value() -> AnyPublisher<Value, AFError> {
81   - setFailureType(to: AFError.self).flatMap(\.result.publisher).eraseToAnyPublisher()
82   - }
83   -
84   - public func receive<S>(subscriber: S) where S: Subscriber, DataResponsePublisher.Failure == S.Failure, DataResponsePublisher.Output == S.Input {
85   - subscriber.receive(subscription: Inner(request: request,
86   - responseHandler: responseHandler,
87   - downstream: subscriber))
88   - }
89   -
90   - private final class Inner<Downstream: Subscriber>: Subscription
91   - where Downstream.Input == Output {
92   - typealias Failure = Downstream.Failure
93   -
94   - @Protected
95   - private var downstream: Downstream?
96   - private let request: DataRequest
97   - private let responseHandler: Handler
98   -
99   - init(request: DataRequest, responseHandler: @escaping Handler, downstream: Downstream) {
100   - self.request = request
101   - self.responseHandler = responseHandler
102   - self.downstream = downstream
103   - }
104   -
105   - func request(_ demand: Subscribers.Demand) {
106   - assert(demand > 0)
107   -
108   - guard let downstream = downstream else { return }
109   -
110   - self.downstream = nil
111   - responseHandler { response in
112   - _ = downstream.receive(response)
113   - downstream.receive(completion: .finished)
114   - }.resume()
115   - }
116   -
117   - func cancel() {
118   - request.cancel()
119   - downstream = nil
120   - }
121   - }
122   -}
123   -
124   -@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
125   -extension DataResponsePublisher where Value == Data? {
126   - /// Creates an instance which publishes a `DataResponse<Data?, AFError>` value without serialization.
127   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
128   - public init(_ request: DataRequest, queue: DispatchQueue) {
129   - self.request = request
130   - responseHandler = { request.response(queue: queue, completionHandler: $0) }
131   - }
132   -}
133   -
134   -extension DataRequest {
135   - /// Creates a `DataResponsePublisher` for this instance using the given `ResponseSerializer` and `DispatchQueue`.
136   - ///
137   - /// - Parameters:
138   - /// - serializer: `ResponseSerializer` used to serialize response `Data`.
139   - /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.
140   - ///
141   - /// - Returns: The `DataResponsePublisher`.
142   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
143   - public func publishResponse<Serializer: ResponseSerializer, T>(using serializer: Serializer, on queue: DispatchQueue = .main) -> DataResponsePublisher<T>
144   - where Serializer.SerializedObject == T {
145   - DataResponsePublisher(self, queue: queue, serializer: serializer)
146   - }
147   -
148   - /// Creates a `DataResponsePublisher` for this instance and uses a `DataResponseSerializer` to serialize the
149   - /// response.
150   - ///
151   - /// - Parameters:
152   - /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.
153   - /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`
154   - /// by default.
155   - /// - emptyResponseCodes: `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by
156   - /// default.
157   - /// - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of
158   - /// status code. `[.head]` by default.
159   - /// - Returns: The `DataResponsePublisher`.
160   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
161   - public func publishData(queue: DispatchQueue = .main,
162   - preprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
163   - emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
164   - emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DataResponsePublisher<Data> {
165   - publishResponse(using: DataResponseSerializer(dataPreprocessor: preprocessor,
166   - emptyResponseCodes: emptyResponseCodes,
167   - emptyRequestMethods: emptyRequestMethods),
168   - on: queue)
169   - }
170   -
171   - /// Creates a `DataResponsePublisher` for this instance and uses a `StringResponseSerializer` to serialize the
172   - /// response.
173   - ///
174   - /// - Parameters:
175   - /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.
176   - /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`
177   - /// by default.
178   - /// - encoding: `String.Encoding` to parse the response. `nil` by default, in which case the encoding
179   - /// will be determined by the server response, falling back to the default HTTP character
180   - /// set, `ISO-8859-1`.
181   - /// - emptyResponseCodes: `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by
182   - /// default.
183   - /// - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of
184   - /// status code. `[.head]` by default.
185   - ///
186   - /// - Returns: The `DataResponsePublisher`.
187   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
188   - public func publishString(queue: DispatchQueue = .main,
189   - preprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
190   - encoding: String.Encoding? = nil,
191   - emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
192   - emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DataResponsePublisher<String> {
193   - publishResponse(using: StringResponseSerializer(dataPreprocessor: preprocessor,
194   - encoding: encoding,
195   - emptyResponseCodes: emptyResponseCodes,
196   - emptyRequestMethods: emptyRequestMethods),
197   - on: queue)
198   - }
199   -
200   - @_disfavoredOverload
201   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
202   - @available(*, deprecated, message: "Renamed publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyRequestMethods).")
203   - public func publishDecodable<T: Decodable>(type: T.Type = T.self,
204   - queue: DispatchQueue = .main,
205   - preprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,
206   - decoder: DataDecoder = JSONDecoder(),
207   - emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,
208   - emptyResponseMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods) -> DataResponsePublisher<T> {
209   - publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor,
210   - decoder: decoder,
211   - emptyResponseCodes: emptyResponseCodes,
212   - emptyRequestMethods: emptyResponseMethods),
213   - on: queue)
214   - }
215   -
216   - /// Creates a `DataResponsePublisher` for this instance and uses a `DecodableResponseSerializer` to serialize the
217   - /// response.
218   - ///
219   - /// - Parameters:
220   - /// - type: `Decodable` type to which to decode response `Data`. Inferred from the context by
221   - /// default.
222   - /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.
223   - /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization.
224   - /// `PassthroughPreprocessor()` by default.
225   - /// - decoder: `DataDecoder` instance used to decode response `Data`. `JSONDecoder()` by default.
226   - /// - emptyResponseCodes: `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by
227   - /// default.
228   - /// - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of
229   - /// status code. `[.head]` by default.
230   - ///
231   - /// - Returns: The `DataResponsePublisher`.
232   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
233   - public func publishDecodable<T: Decodable>(type: T.Type = T.self,
234   - queue: DispatchQueue = .main,
235   - preprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,
236   - decoder: DataDecoder = JSONDecoder(),
237   - emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,
238   - emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods) -> DataResponsePublisher<T> {
239   - publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor,
240   - decoder: decoder,
241   - emptyResponseCodes: emptyResponseCodes,
242   - emptyRequestMethods: emptyRequestMethods),
243   - on: queue)
244   - }
245   -
246   - /// Creates a `DataResponsePublisher` for this instance which does not serialize the response before publishing.
247   - ///
248   - /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.
249   - ///
250   - /// - Returns: The `DataResponsePublisher`.
251   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
252   - public func publishUnserialized(queue: DispatchQueue = .main) -> DataResponsePublisher<Data?> {
253   - DataResponsePublisher(self, queue: queue)
254   - }
255   -}
256   -
257   -// A Combine `Publisher` that publishes a sequence of `Stream<Value, AFError>` values received by the provided `DataStreamRequest`.
258   -@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
259   -public struct DataStreamPublisher<Value>: Publisher {
260   - public typealias Output = DataStreamRequest.Stream<Value, AFError>
261   - public typealias Failure = Never
262   -
263   - private typealias Handler = (@escaping DataStreamRequest.Handler<Value, AFError>) -> DataStreamRequest
264   -
265   - private let request: DataStreamRequest
266   - private let streamHandler: Handler
267   -
268   - /// Creates an instance which will serialize responses using the provided `DataStreamSerializer`.
269   - ///
270   - /// - Parameters:
271   - /// - request: `DataStreamRequest` for which to publish the response.
272   - /// - queue: `DispatchQueue` on which the `Stream<Value, AFError>` values will be published. `.main` by
273   - /// default.
274   - /// - serializer: `DataStreamSerializer` used to produce the published `Stream<Value, AFError>` values.
275   - public init<Serializer: DataStreamSerializer>(_ request: DataStreamRequest, queue: DispatchQueue, serializer: Serializer)
276   - where Value == Serializer.SerializedObject {
277   - self.request = request
278   - streamHandler = { request.responseStream(using: serializer, on: queue, stream: $0) }
279   - }
280   -
281   - /// Publishes only the `Result` of the `DataStreamRequest.Stream`'s `Event`s.
282   - ///
283   - /// - Returns: The `AnyPublisher` publishing the `Result<Value, AFError>` value.
284   - public func result() -> AnyPublisher<Result<Value, AFError>, Never> {
285   - compactMap { stream in
286   - switch stream.event {
287   - case let .stream(result):
288   - return result
289   - // If the stream has completed with an error, send the error value downstream as a `.failure`.
290   - case let .complete(completion):
291   - return completion.error.map(Result.failure)
292   - }
293   - }
294   - .eraseToAnyPublisher()
295   - }
296   -
297   - /// Publishes the streamed values of the `DataStreamRequest.Stream` as a sequence of `Value` or fail with the
298   - /// `AFError` instance.
299   - ///
300   - /// - Returns: The `AnyPublisher<Value, AFError>` publishing the stream.
301   - public func value() -> AnyPublisher<Value, AFError> {
302   - result().setFailureType(to: AFError.self).flatMap(\.publisher).eraseToAnyPublisher()
303   - }
304   -
305   - public func receive<S>(subscriber: S) where S: Subscriber, DataStreamPublisher.Failure == S.Failure, DataStreamPublisher.Output == S.Input {
306   - subscriber.receive(subscription: Inner(request: request,
307   - streamHandler: streamHandler,
308   - downstream: subscriber))
309   - }
310   -
311   - private final class Inner<Downstream: Subscriber>: Subscription
312   - where Downstream.Input == Output {
313   - typealias Failure = Downstream.Failure
314   -
315   - @Protected
316   - private var downstream: Downstream?
317   - private let request: DataStreamRequest
318   - private let streamHandler: Handler
319   -
320   - init(request: DataStreamRequest, streamHandler: @escaping Handler, downstream: Downstream) {
321   - self.request = request
322   - self.streamHandler = streamHandler
323   - self.downstream = downstream
324   - }
325   -
326   - func request(_ demand: Subscribers.Demand) {
327   - assert(demand > 0)
328   -
329   - guard let downstream = downstream else { return }
330   -
331   - self.downstream = nil
332   - streamHandler { stream in
333   - _ = downstream.receive(stream)
334   - if case .complete = stream.event {
335   - downstream.receive(completion: .finished)
336   - }
337   - }.resume()
338   - }
339   -
340   - func cancel() {
341   - request.cancel()
342   - downstream = nil
343   - }
344   - }
345   -}
346   -
347   -extension DataStreamRequest {
348   - /// Creates a `DataStreamPublisher` for this instance using the given `DataStreamSerializer` and `DispatchQueue`.
349   - ///
350   - /// - Parameters:
351   - /// - serializer: `DataStreamSerializer` used to serialize the streamed `Data`.
352   - /// - queue: `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default.
353   - /// - Returns: The `DataStreamPublisher`.
354   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
355   - public func publishStream<Serializer: DataStreamSerializer>(using serializer: Serializer,
356   - on queue: DispatchQueue = .main) -> DataStreamPublisher<Serializer.SerializedObject> {
357   - DataStreamPublisher(self, queue: queue, serializer: serializer)
358   - }
359   -
360   - /// Creates a `DataStreamPublisher` for this instance which uses a `PassthroughStreamSerializer` to stream `Data`
361   - /// unserialized.
362   - ///
363   - /// - Parameters:
364   - /// - queue: `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default.
365   - /// - Returns: The `DataStreamPublisher`.
366   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
367   - public func publishData(queue: DispatchQueue = .main) -> DataStreamPublisher<Data> {
368   - publishStream(using: PassthroughStreamSerializer(), on: queue)
369   - }
370   -
371   - /// Creates a `DataStreamPublisher` for this instance which uses a `StringStreamSerializer` to serialize stream
372   - /// `Data` values into `String` values.
373   - ///
374   - /// - Parameters:
375   - /// - queue: `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default.
376   - /// - Returns: The `DataStreamPublisher`.
377   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
378   - public func publishString(queue: DispatchQueue = .main) -> DataStreamPublisher<String> {
379   - publishStream(using: StringStreamSerializer(), on: queue)
380   - }
381   -
382   - /// Creates a `DataStreamPublisher` for this instance which uses a `DecodableStreamSerializer` with the provided
383   - /// parameters to serialize stream `Data` values into the provided type.
384   - ///
385   - /// - Parameters:
386   - /// - type: `Decodable` type to which to decode stream `Data`. Inferred from the context by default.
387   - /// - queue: `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default.
388   - /// - decoder: `DataDecoder` instance used to decode stream `Data`. `JSONDecoder()` by default.
389   - /// - preprocessor: `DataPreprocessor` which filters incoming stream `Data` before serialization.
390   - /// `PassthroughPreprocessor()` by default.
391   - /// - Returns: The `DataStreamPublisher`.
392   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
393   - public func publishDecodable<T: Decodable>(type: T.Type = T.self,
394   - queue: DispatchQueue = .main,
395   - decoder: DataDecoder = JSONDecoder(),
396   - preprocessor: DataPreprocessor = PassthroughPreprocessor()) -> DataStreamPublisher<T> {
397   - publishStream(using: DecodableStreamSerializer(decoder: decoder,
398   - dataPreprocessor: preprocessor),
399   - on: queue)
400   - }
401   -}
402   -
403   -/// A Combine `Publisher` that publishes the `DownloadResponse<Value, AFError>` of the provided `DownloadRequest`.
404   -@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
405   -public struct DownloadResponsePublisher<Value>: Publisher {
406   - public typealias Output = DownloadResponse<Value, AFError>
407   - public typealias Failure = Never
408   -
409   - private typealias Handler = (@escaping (_ response: DownloadResponse<Value, AFError>) -> Void) -> DownloadRequest
410   -
411   - private let request: DownloadRequest
412   - private let responseHandler: Handler
413   -
414   - /// Creates an instance which will serialize responses using the provided `ResponseSerializer`.
415   - ///
416   - /// - Parameters:
417   - /// - request: `DownloadRequest` for which to publish the response.
418   - /// - queue: `DispatchQueue` on which the `DownloadResponse` value will be published. `.main` by default.
419   - /// - serializer: `ResponseSerializer` used to produce the published `DownloadResponse`.
420   - public init<Serializer: ResponseSerializer>(_ request: DownloadRequest, queue: DispatchQueue, serializer: Serializer)
421   - where Value == Serializer.SerializedObject {
422   - self.request = request
423   - responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) }
424   - }
425   -
426   - /// Creates an instance which will serialize responses using the provided `DownloadResponseSerializerProtocol` value.
427   - ///
428   - /// - Parameters:
429   - /// - request: `DownloadRequest` for which to publish the response.
430   - /// - queue: `DispatchQueue` on which the `DataResponse` value will be published. `.main` by default.
431   - /// - serializer: `DownloadResponseSerializerProtocol` used to produce the published `DownloadResponse`.
432   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
433   - public init<Serializer: DownloadResponseSerializerProtocol>(_ request: DownloadRequest,
434   - queue: DispatchQueue,
435   - serializer: Serializer)
436   - where Value == Serializer.SerializedObject {
437   - self.request = request
438   - responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) }
439   - }
440   -
441   - /// Publishes only the `Result` of the `DownloadResponse` value.
442   - ///
443   - /// - Returns: The `AnyPublisher` publishing the `Result<Value, AFError>` value.
444   - public func result() -> AnyPublisher<Result<Value, AFError>, Never> {
445   - map(\.result).eraseToAnyPublisher()
446   - }
447   -
448   - /// Publishes the `Result` of the `DownloadResponse` as a single `Value` or fail with the `AFError` instance.
449   - ///
450   - /// - Returns: The `AnyPublisher<Value, AFError>` publishing the stream.
451   - public func value() -> AnyPublisher<Value, AFError> {
452   - setFailureType(to: AFError.self).flatMap(\.result.publisher).eraseToAnyPublisher()
453   - }
454   -
455   - public func receive<S>(subscriber: S) where S: Subscriber, DownloadResponsePublisher.Failure == S.Failure, DownloadResponsePublisher.Output == S.Input {
456   - subscriber.receive(subscription: Inner(request: request,
457   - responseHandler: responseHandler,
458   - downstream: subscriber))
459   - }
460   -
461   - private final class Inner<Downstream: Subscriber>: Subscription
462   - where Downstream.Input == Output {
463   - typealias Failure = Downstream.Failure
464   -
465   - @Protected
466   - private var downstream: Downstream?
467   - private let request: DownloadRequest
468   - private let responseHandler: Handler
469   -
470   - init(request: DownloadRequest, responseHandler: @escaping Handler, downstream: Downstream) {
471   - self.request = request
472   - self.responseHandler = responseHandler
473   - self.downstream = downstream
474   - }
475   -
476   - func request(_ demand: Subscribers.Demand) {
477   - assert(demand > 0)
478   -
479   - guard let downstream = downstream else { return }
480   -
481   - self.downstream = nil
482   - responseHandler { response in
483   - _ = downstream.receive(response)
484   - downstream.receive(completion: .finished)
485   - }.resume()
486   - }
487   -
488   - func cancel() {
489   - request.cancel()
490   - downstream = nil
491   - }
492   - }
493   -}
494   -
495   -extension DownloadRequest {
496   - /// Creates a `DownloadResponsePublisher` for this instance using the given `ResponseSerializer` and `DispatchQueue`.
497   - ///
498   - /// - Parameters:
499   - /// - serializer: `ResponseSerializer` used to serialize the response `Data` from disk.
500   - /// - queue: `DispatchQueue` on which the `DownloadResponse` will be published.`.main` by default.
501   - ///
502   - /// - Returns: The `DownloadResponsePublisher`.
503   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
504   - public func publishResponse<Serializer: ResponseSerializer, T>(using serializer: Serializer, on queue: DispatchQueue = .main) -> DownloadResponsePublisher<T>
505   - where Serializer.SerializedObject == T {
506   - DownloadResponsePublisher(self, queue: queue, serializer: serializer)
507   - }
508   -
509   - /// Creates a `DownloadResponsePublisher` for this instance using the given `DownloadResponseSerializerProtocol` and
510   - /// `DispatchQueue`.
511   - ///
512   - /// - Parameters:
513   - /// - serializer: `DownloadResponseSerializer` used to serialize the response `Data` from disk.
514   - /// - queue: `DispatchQueue` on which the `DownloadResponse` will be published.`.main` by default.
515   - ///
516   - /// - Returns: The `DownloadResponsePublisher`.
517   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
518   - public func publishResponse<Serializer: DownloadResponseSerializerProtocol, T>(using serializer: Serializer, on queue: DispatchQueue = .main) -> DownloadResponsePublisher<T>
519   - where Serializer.SerializedObject == T {
520   - DownloadResponsePublisher(self, queue: queue, serializer: serializer)
521   - }
522   -
523   - /// Creates a `DownloadResponsePublisher` for this instance and uses a `URLResponseSerializer` to serialize the
524   - /// response.
525   - ///
526   - /// - Parameter queue: `DispatchQueue` on which the `DownloadResponse` will be published. `.main` by default.
527   - ///
528   - /// - Returns: The `DownloadResponsePublisher`.
529   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
530   - public func publishURL(queue: DispatchQueue = .main) -> DownloadResponsePublisher<URL> {
531   - publishResponse(using: URLResponseSerializer(), on: queue)
532   - }
533   -
534   - /// Creates a `DownloadResponsePublisher` for this instance and uses a `DataResponseSerializer` to serialize the
535   - /// response.
536   - ///
537   - /// - Parameters:
538   - /// - queue: `DispatchQueue` on which the `DownloadResponse` will be published. `.main` by default.
539   - /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`
540   - /// by default.
541   - /// - emptyResponseCodes: `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by
542   - /// default.
543   - /// - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of
544   - /// status code. `[.head]` by default.
545   - ///
546   - /// - Returns: The `DownloadResponsePublisher`.
547   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
548   - public func publishData(queue: DispatchQueue = .main,
549   - preprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
550   - emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
551   - emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DownloadResponsePublisher<Data> {
552   - publishResponse(using: DataResponseSerializer(dataPreprocessor: preprocessor,
553   - emptyResponseCodes: emptyResponseCodes,
554   - emptyRequestMethods: emptyRequestMethods),
555   - on: queue)
556   - }
557   -
558   - /// Creates a `DownloadResponsePublisher` for this instance and uses a `StringResponseSerializer` to serialize the
559   - /// response.
560   - ///
561   - /// - Parameters:
562   - /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.
563   - /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`
564   - /// by default.
565   - /// - encoding: `String.Encoding` to parse the response. `nil` by default, in which case the encoding
566   - /// will be determined by the server response, falling back to the default HTTP character
567   - /// set, `ISO-8859-1`.
568   - /// - emptyResponseCodes: `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by
569   - /// default.
570   - /// - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of
571   - /// status code. `[.head]` by default.
572   - ///
573   - /// - Returns: The `DownloadResponsePublisher`.
574   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
575   - public func publishString(queue: DispatchQueue = .main,
576   - preprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
577   - encoding: String.Encoding? = nil,
578   - emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
579   - emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DownloadResponsePublisher<String> {
580   - publishResponse(using: StringResponseSerializer(dataPreprocessor: preprocessor,
581   - encoding: encoding,
582   - emptyResponseCodes: emptyResponseCodes,
583   - emptyRequestMethods: emptyRequestMethods),
584   - on: queue)
585   - }
586   -
587   - @_disfavoredOverload
588   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
589   - @available(*, deprecated, message: "Renamed publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyRequestMethods).")
590   - public func publishDecodable<T: Decodable>(type: T.Type = T.self,
591   - queue: DispatchQueue = .main,
592   - preprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,
593   - decoder: DataDecoder = JSONDecoder(),
594   - emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,
595   - emptyResponseMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods) -> DownloadResponsePublisher<T> {
596   - publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor,
597   - decoder: decoder,
598   - emptyResponseCodes: emptyResponseCodes,
599   - emptyRequestMethods: emptyResponseMethods),
600   - on: queue)
601   - }
602   -
603   - /// Creates a `DownloadResponsePublisher` for this instance and uses a `DecodableResponseSerializer` to serialize
604   - /// the response.
605   - ///
606   - /// - Parameters:
607   - /// - type: `Decodable` type to which to decode response `Data`. Inferred from the context by default.
608   - /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.
609   - /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization.
610   - /// `PassthroughPreprocessor()` by default.
611   - /// - decoder: `DataDecoder` instance used to decode response `Data`. `JSONDecoder()` by default.
612   - /// - emptyResponseCodes: `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by
613   - /// default.
614   - /// - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless
615   - /// of status code. `[.head]` by default.
616   - ///
617   - /// - Returns: The `DownloadResponsePublisher`.
618   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
619   - public func publishDecodable<T: Decodable>(type: T.Type = T.self,
620   - queue: DispatchQueue = .main,
621   - preprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,
622   - decoder: DataDecoder = JSONDecoder(),
623   - emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,
624   - emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods) -> DownloadResponsePublisher<T> {
625   - publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor,
626   - decoder: decoder,
627   - emptyResponseCodes: emptyResponseCodes,
628   - emptyRequestMethods: emptyRequestMethods),
629   - on: queue)
630   - }
631   -}
632   -
633   -@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
634   -extension DownloadResponsePublisher where Value == URL? {
635   - /// Creates an instance which publishes a `DownloadResponse<URL?, AFError>` value without serialization.
636   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
637   - public init(_ request: DownloadRequest, queue: DispatchQueue) {
638   - self.request = request
639   - responseHandler = { request.response(queue: queue, completionHandler: $0) }
640   - }
641   -}
642   -
643   -extension DownloadRequest {
644   - /// Creates a `DownloadResponsePublisher` for this instance which does not serialize the response before publishing.
645   - ///
646   - /// - Parameter queue: `DispatchQueue` on which the `DownloadResponse` will be published. `.main` by default.
647   - ///
648   - /// - Returns: The `DownloadResponsePublisher`.
649   - @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
650   - public func publishUnserialized(on queue: DispatchQueue = .main) -> DownloadResponsePublisher<URL?> {
651   - DownloadResponsePublisher(self, queue: queue)
652   - }
653   -}
654   -
655   -#endif
Pods/Alamofire/Source/Concurrency.swift deleted 100644 → 0
1   -//
2   -// Concurrency.swift
3   -//
4   -// Copyright (c) 2021 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -#if compiler(>=5.6.0) && canImport(_Concurrency)
26   -
27   -import Foundation
28   -
29   -// MARK: - Request Event Streams
30   -
31   -@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
32   -extension Request {
33   - /// Creates a `StreamOf<Progress>` for the instance's upload progress.
34   - ///
35   - /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default.
36   - ///
37   - /// - Returns: The `StreamOf<Progress>`.
38   - public func uploadProgress(bufferingPolicy: StreamOf<Progress>.BufferingPolicy = .unbounded) -> StreamOf<Progress> {
39   - stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in
40   - uploadProgress(queue: .singleEventQueue) { progress in
41   - continuation.yield(progress)
42   - }
43   - }
44   - }
45   -
46   - /// Creates a `StreamOf<Progress>` for the instance's download progress.
47   - ///
48   - /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default.
49   - ///
50   - /// - Returns: The `StreamOf<Progress>`.
51   - public func downloadProgress(bufferingPolicy: StreamOf<Progress>.BufferingPolicy = .unbounded) -> StreamOf<Progress> {
52   - stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in
53   - downloadProgress(queue: .singleEventQueue) { progress in
54   - continuation.yield(progress)
55   - }
56   - }
57   - }
58   -
59   - /// Creates a `StreamOf<URLRequest>` for the `URLRequest`s produced for the instance.
60   - ///
61   - /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default.
62   - ///
63   - /// - Returns: The `StreamOf<URLRequest>`.
64   - public func urlRequests(bufferingPolicy: StreamOf<URLRequest>.BufferingPolicy = .unbounded) -> StreamOf<URLRequest> {
65   - stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in
66   - onURLRequestCreation(on: .singleEventQueue) { request in
67   - continuation.yield(request)
68   - }
69   - }
70   - }
71   -
72   - /// Creates a `StreamOf<URLSessionTask>` for the `URLSessionTask`s produced for the instance.
73   - ///
74   - /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default.
75   - ///
76   - /// - Returns: The `StreamOf<URLSessionTask>`.
77   - public func urlSessionTasks(bufferingPolicy: StreamOf<URLSessionTask>.BufferingPolicy = .unbounded) -> StreamOf<URLSessionTask> {
78   - stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in
79   - onURLSessionTaskCreation(on: .singleEventQueue) { task in
80   - continuation.yield(task)
81   - }
82   - }
83   - }
84   -
85   - /// Creates a `StreamOf<String>` for the cURL descriptions produced for the instance.
86   - ///
87   - /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default.
88   - ///
89   - /// - Returns: The `StreamOf<String>`.
90   - public func cURLDescriptions(bufferingPolicy: StreamOf<String>.BufferingPolicy = .unbounded) -> StreamOf<String> {
91   - stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in
92   - cURLDescription(on: .singleEventQueue) { description in
93   - continuation.yield(description)
94   - }
95   - }
96   - }
97   -
98   - private func stream<T>(of type: T.Type = T.self,
99   - bufferingPolicy: StreamOf<T>.BufferingPolicy = .unbounded,
100   - yielder: @escaping (StreamOf<T>.Continuation) -> Void) -> StreamOf<T> {
101   - StreamOf<T>(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in
102   - yielder(continuation)
103   - // Must come after serializers run in order to catch retry progress.
104   - onFinish {
105   - continuation.finish()
106   - }
107   - }
108   - }
109   -}
110   -
111   -// MARK: - DataTask
112   -
113   -/// Value used to `await` a `DataResponse` and associated values.
114   -@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
115   -public struct DataTask<Value> {
116   - /// `DataResponse` produced by the `DataRequest` and its response handler.
117   - public var response: DataResponse<Value, AFError> {
118   - get async {
119   - if shouldAutomaticallyCancel {
120   - return await withTaskCancellationHandler {
121   - await task.value
122   - } onCancel: {
123   - cancel()
124   - }
125   - } else {
126   - return await task.value
127   - }
128   - }
129   - }
130   -
131   - /// `Result` of any response serialization performed for the `response`.
132   - public var result: Result<Value, AFError> {
133   - get async { await response.result }
134   - }
135   -
136   - /// `Value` returned by the `response`.
137   - public var value: Value {
138   - get async throws {
139   - try await result.get()
140   - }
141   - }
142   -
143   - private let request: DataRequest
144   - private let task: Task<DataResponse<Value, AFError>, Never>
145   - private let shouldAutomaticallyCancel: Bool
146   -
147   - fileprivate init(request: DataRequest, task: Task<DataResponse<Value, AFError>, Never>, shouldAutomaticallyCancel: Bool) {
148   - self.request = request
149   - self.task = task
150   - self.shouldAutomaticallyCancel = shouldAutomaticallyCancel
151   - }
152   -
153   - /// Cancel the underlying `DataRequest` and `Task`.
154   - public func cancel() {
155   - task.cancel()
156   - }
157   -
158   - /// Resume the underlying `DataRequest`.
159   - public func resume() {
160   - request.resume()
161   - }
162   -
163   - /// Suspend the underlying `DataRequest`.
164   - public func suspend() {
165   - request.suspend()
166   - }
167   -}
168   -
169   -@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
170   -extension DataRequest {
171   - /// Creates a `DataTask` to `await` a `Data` value.
172   - ///
173   - /// - Parameters:
174   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
175   - /// enclosing async context is cancelled. Only applies to `DataTask`'s async
176   - /// properties. `false` by default.
177   - /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before completion.
178   - /// - emptyResponseCodes: HTTP response codes for which empty responses are allowed. `[204, 205]` by default.
179   - /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.
180   - ///
181   - /// - Returns: The `DataTask`.
182   - public func serializingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = false,
183   - dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
184   - emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
185   - emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DataTask<Data> {
186   - serializingResponse(using: DataResponseSerializer(dataPreprocessor: dataPreprocessor,
187   - emptyResponseCodes: emptyResponseCodes,
188   - emptyRequestMethods: emptyRequestMethods),
189   - automaticallyCancelling: shouldAutomaticallyCancel)
190   - }
191   -
192   - /// Creates a `DataTask` to `await` serialization of a `Decodable` value.
193   - ///
194   - /// - Parameters:
195   - /// - type: `Decodable` type to decode from response data.
196   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
197   - /// enclosing async context is cancelled. Only applies to `DataTask`'s async
198   - /// properties. `false` by default.
199   - /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the serializer.
200   - /// `PassthroughPreprocessor()` by default.
201   - /// - decoder: `DataDecoder` to use to decode the response. `JSONDecoder()` by default.
202   - /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default.
203   - /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.
204   - ///
205   - /// - Returns: The `DataTask`.
206   - public func serializingDecodable<Value: Decodable>(_ type: Value.Type = Value.self,
207   - automaticallyCancelling shouldAutomaticallyCancel: Bool = false,
208   - dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<Value>.defaultDataPreprocessor,
209   - decoder: DataDecoder = JSONDecoder(),
210   - emptyResponseCodes: Set<Int> = DecodableResponseSerializer<Value>.defaultEmptyResponseCodes,
211   - emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<Value>.defaultEmptyRequestMethods) -> DataTask<Value> {
212   - serializingResponse(using: DecodableResponseSerializer<Value>(dataPreprocessor: dataPreprocessor,
213   - decoder: decoder,
214   - emptyResponseCodes: emptyResponseCodes,
215   - emptyRequestMethods: emptyRequestMethods),
216   - automaticallyCancelling: shouldAutomaticallyCancel)
217   - }
218   -
219   - /// Creates a `DataTask` to `await` serialization of a `String` value.
220   - ///
221   - /// - Parameters:
222   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
223   - /// enclosing async context is cancelled. Only applies to `DataTask`'s async
224   - /// properties. `false` by default.
225   - /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the serializer.
226   - /// `PassthroughPreprocessor()` by default.
227   - /// - encoding: `String.Encoding` to use during serialization. Defaults to `nil`, in which case
228   - /// the encoding will be determined from the server response, falling back to the
229   - /// default HTTP character set, `ISO-8859-1`.
230   - /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default.
231   - /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.
232   - ///
233   - /// - Returns: The `DataTask`.
234   - public func serializingString(automaticallyCancelling shouldAutomaticallyCancel: Bool = false,
235   - dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
236   - encoding: String.Encoding? = nil,
237   - emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
238   - emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DataTask<String> {
239   - serializingResponse(using: StringResponseSerializer(dataPreprocessor: dataPreprocessor,
240   - encoding: encoding,
241   - emptyResponseCodes: emptyResponseCodes,
242   - emptyRequestMethods: emptyRequestMethods),
243   - automaticallyCancelling: shouldAutomaticallyCancel)
244   - }
245   -
246   - /// Creates a `DataTask` to `await` serialization using the provided `ResponseSerializer` instance.
247   - ///
248   - /// - Parameters:
249   - /// - serializer: `ResponseSerializer` responsible for serializing the request, response, and data.
250   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
251   - /// enclosing async context is cancelled. Only applies to `DataTask`'s async
252   - /// properties. `false` by default.
253   - ///
254   - /// - Returns: The `DataTask`.
255   - public func serializingResponse<Serializer: ResponseSerializer>(using serializer: Serializer,
256   - automaticallyCancelling shouldAutomaticallyCancel: Bool = false)
257   - -> DataTask<Serializer.SerializedObject> {
258   - dataTask(automaticallyCancelling: shouldAutomaticallyCancel) {
259   - self.response(queue: .singleEventQueue,
260   - responseSerializer: serializer,
261   - completionHandler: $0)
262   - }
263   - }
264   -
265   - /// Creates a `DataTask` to `await` serialization using the provided `DataResponseSerializerProtocol` instance.
266   - ///
267   - /// - Parameters:
268   - /// - serializer: `DataResponseSerializerProtocol` responsible for serializing the request,
269   - /// response, and data.
270   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
271   - /// enclosing async context is cancelled. Only applies to `DataTask`'s async
272   - /// properties. `false` by default.
273   - ///
274   - /// - Returns: The `DataTask`.
275   - public func serializingResponse<Serializer: DataResponseSerializerProtocol>(using serializer: Serializer,
276   - automaticallyCancelling shouldAutomaticallyCancel: Bool = false)
277   - -> DataTask<Serializer.SerializedObject> {
278   - dataTask(automaticallyCancelling: shouldAutomaticallyCancel) {
279   - self.response(queue: .singleEventQueue,
280   - responseSerializer: serializer,
281   - completionHandler: $0)
282   - }
283   - }
284   -
285   - private func dataTask<Value>(automaticallyCancelling shouldAutomaticallyCancel: Bool,
286   - forResponse onResponse: @escaping (@escaping (DataResponse<Value, AFError>) -> Void) -> Void)
287   - -> DataTask<Value> {
288   - let task = Task {
289   - await withTaskCancellationHandler {
290   - await withCheckedContinuation { continuation in
291   - onResponse {
292   - continuation.resume(returning: $0)
293   - }
294   - }
295   - } onCancel: {
296   - self.cancel()
297   - }
298   - }
299   -
300   - return DataTask<Value>(request: self, task: task, shouldAutomaticallyCancel: shouldAutomaticallyCancel)
301   - }
302   -}
303   -
304   -// MARK: - DownloadTask
305   -
306   -/// Value used to `await` a `DownloadResponse` and associated values.
307   -@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
308   -public struct DownloadTask<Value> {
309   - /// `DownloadResponse` produced by the `DownloadRequest` and its response handler.
310   - public var response: DownloadResponse<Value, AFError> {
311   - get async {
312   - if shouldAutomaticallyCancel {
313   - return await withTaskCancellationHandler {
314   - await task.value
315   - } onCancel: {
316   - cancel()
317   - }
318   - } else {
319   - return await task.value
320   - }
321   - }
322   - }
323   -
324   - /// `Result` of any response serialization performed for the `response`.
325   - public var result: Result<Value, AFError> {
326   - get async { await response.result }
327   - }
328   -
329   - /// `Value` returned by the `response`.
330   - public var value: Value {
331   - get async throws {
332   - try await result.get()
333   - }
334   - }
335   -
336   - private let task: Task<AFDownloadResponse<Value>, Never>
337   - private let request: DownloadRequest
338   - private let shouldAutomaticallyCancel: Bool
339   -
340   - fileprivate init(request: DownloadRequest, task: Task<AFDownloadResponse<Value>, Never>, shouldAutomaticallyCancel: Bool) {
341   - self.request = request
342   - self.task = task
343   - self.shouldAutomaticallyCancel = shouldAutomaticallyCancel
344   - }
345   -
346   - /// Cancel the underlying `DownloadRequest` and `Task`.
347   - public func cancel() {
348   - task.cancel()
349   - }
350   -
351   - /// Resume the underlying `DownloadRequest`.
352   - public func resume() {
353   - request.resume()
354   - }
355   -
356   - /// Suspend the underlying `DownloadRequest`.
357   - public func suspend() {
358   - request.suspend()
359   - }
360   -}
361   -
362   -@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
363   -extension DownloadRequest {
364   - /// Creates a `DownloadTask` to `await` a `Data` value.
365   - ///
366   - /// - Parameters:
367   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
368   - /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async
369   - /// properties. `false` by default.
370   - /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before completion.
371   - /// - emptyResponseCodes: HTTP response codes for which empty responses are allowed. `[204, 205]` by default.
372   - /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.
373   - ///
374   - /// - Returns: The `DownloadTask`.
375   - public func serializingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = false,
376   - dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
377   - emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
378   - emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DownloadTask<Data> {
379   - serializingDownload(using: DataResponseSerializer(dataPreprocessor: dataPreprocessor,
380   - emptyResponseCodes: emptyResponseCodes,
381   - emptyRequestMethods: emptyRequestMethods),
382   - automaticallyCancelling: shouldAutomaticallyCancel)
383   - }
384   -
385   - /// Creates a `DownloadTask` to `await` serialization of a `Decodable` value.
386   - ///
387   - /// - Note: This serializer reads the entire response into memory before parsing.
388   - ///
389   - /// - Parameters:
390   - /// - type: `Decodable` type to decode from response data.
391   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
392   - /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async
393   - /// properties. `false` by default.
394   - /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the serializer.
395   - /// `PassthroughPreprocessor()` by default.
396   - /// - decoder: `DataDecoder` to use to decode the response. `JSONDecoder()` by default.
397   - /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default.
398   - /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.
399   - ///
400   - /// - Returns: The `DownloadTask`.
401   - public func serializingDecodable<Value: Decodable>(_ type: Value.Type = Value.self,
402   - automaticallyCancelling shouldAutomaticallyCancel: Bool = false,
403   - dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<Value>.defaultDataPreprocessor,
404   - decoder: DataDecoder = JSONDecoder(),
405   - emptyResponseCodes: Set<Int> = DecodableResponseSerializer<Value>.defaultEmptyResponseCodes,
406   - emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<Value>.defaultEmptyRequestMethods) -> DownloadTask<Value> {
407   - serializingDownload(using: DecodableResponseSerializer<Value>(dataPreprocessor: dataPreprocessor,
408   - decoder: decoder,
409   - emptyResponseCodes: emptyResponseCodes,
410   - emptyRequestMethods: emptyRequestMethods),
411   - automaticallyCancelling: shouldAutomaticallyCancel)
412   - }
413   -
414   - /// Creates a `DownloadTask` to `await` serialization of the downloaded file's `URL` on disk.
415   - ///
416   - /// - Parameters:
417   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
418   - /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async
419   - /// properties. `false` by default.
420   - ///
421   - /// - Returns: The `DownloadTask`.
422   - public func serializingDownloadedFileURL(automaticallyCancelling shouldAutomaticallyCancel: Bool = false) -> DownloadTask<URL> {
423   - serializingDownload(using: URLResponseSerializer(),
424   - automaticallyCancelling: shouldAutomaticallyCancel)
425   - }
426   -
427   - /// Creates a `DownloadTask` to `await` serialization of a `String` value.
428   - ///
429   - /// - Parameters:
430   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
431   - /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async
432   - /// properties. `false` by default.
433   - /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the
434   - /// serializer. `PassthroughPreprocessor()` by default.
435   - /// - encoding: `String.Encoding` to use during serialization. Defaults to `nil`, in which case
436   - /// the encoding will be determined from the server response, falling back to the
437   - /// default HTTP character set, `ISO-8859-1`.
438   - /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default.
439   - /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.
440   - ///
441   - /// - Returns: The `DownloadTask`.
442   - public func serializingString(automaticallyCancelling shouldAutomaticallyCancel: Bool = false,
443   - dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
444   - encoding: String.Encoding? = nil,
445   - emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
446   - emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DownloadTask<String> {
447   - serializingDownload(using: StringResponseSerializer(dataPreprocessor: dataPreprocessor,
448   - encoding: encoding,
449   - emptyResponseCodes: emptyResponseCodes,
450   - emptyRequestMethods: emptyRequestMethods),
451   - automaticallyCancelling: shouldAutomaticallyCancel)
452   - }
453   -
454   - /// Creates a `DownloadTask` to `await` serialization using the provided `ResponseSerializer` instance.
455   - ///
456   - /// - Parameters:
457   - /// - serializer: `ResponseSerializer` responsible for serializing the request, response, and data.
458   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
459   - /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async
460   - /// properties. `false` by default.
461   - ///
462   - /// - Returns: The `DownloadTask`.
463   - public func serializingDownload<Serializer: ResponseSerializer>(using serializer: Serializer,
464   - automaticallyCancelling shouldAutomaticallyCancel: Bool = false)
465   - -> DownloadTask<Serializer.SerializedObject> {
466   - downloadTask(automaticallyCancelling: shouldAutomaticallyCancel) {
467   - self.response(queue: .singleEventQueue,
468   - responseSerializer: serializer,
469   - completionHandler: $0)
470   - }
471   - }
472   -
473   - /// Creates a `DownloadTask` to `await` serialization using the provided `DownloadResponseSerializerProtocol`
474   - /// instance.
475   - ///
476   - /// - Parameters:
477   - /// - serializer: `DownloadResponseSerializerProtocol` responsible for serializing the request,
478   - /// response, and data.
479   - /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the
480   - /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async
481   - /// properties. `false` by default.
482   - ///
483   - /// - Returns: The `DownloadTask`.
484   - public func serializingDownload<Serializer: DownloadResponseSerializerProtocol>(using serializer: Serializer,
485   - automaticallyCancelling shouldAutomaticallyCancel: Bool = false)
486   - -> DownloadTask<Serializer.SerializedObject> {
487   - downloadTask(automaticallyCancelling: shouldAutomaticallyCancel) {
488   - self.response(queue: .singleEventQueue,
489   - responseSerializer: serializer,
490   - completionHandler: $0)
491   - }
492   - }
493   -
494   - private func downloadTask<Value>(automaticallyCancelling shouldAutomaticallyCancel: Bool,
495   - forResponse onResponse: @escaping (@escaping (DownloadResponse<Value, AFError>) -> Void) -> Void)
496   - -> DownloadTask<Value> {
497   - let task = Task {
498   - await withTaskCancellationHandler {
499   - await withCheckedContinuation { continuation in
500   - onResponse {
501   - continuation.resume(returning: $0)
502   - }
503   - }
504   - } onCancel: {
505   - self.cancel()
506   - }
507   - }
508   -
509   - return DownloadTask<Value>(request: self, task: task, shouldAutomaticallyCancel: shouldAutomaticallyCancel)
510   - }
511   -}
512   -
513   -// MARK: - DataStreamTask
514   -
515   -@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
516   -public struct DataStreamTask {
517   - // Type of created streams.
518   - public typealias Stream<Success, Failure: Error> = StreamOf<DataStreamRequest.Stream<Success, Failure>>
519   -
520   - private let request: DataStreamRequest
521   -
522   - fileprivate init(request: DataStreamRequest) {
523   - self.request = request
524   - }
525   -
526   - /// Creates a `Stream` of `Data` values from the underlying `DataStreamRequest`.
527   - ///
528   - /// - Parameters:
529   - /// - shouldAutomaticallyCancel: `Bool` indicating whether the underlying `DataStreamRequest` should be canceled
530   - /// which observation of the stream stops. `true` by default.
531   - /// - bufferingPolicy: ` BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default.
532   - ///
533   - /// - Returns: The `Stream`.
534   - public func streamingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, bufferingPolicy: Stream<Data, Never>.BufferingPolicy = .unbounded) -> Stream<Data, Never> {
535   - createStream(automaticallyCancelling: shouldAutomaticallyCancel, bufferingPolicy: bufferingPolicy) { onStream in
536   - request.responseStream(on: .streamCompletionQueue(forRequestID: request.id), stream: onStream)
537   - }
538   - }
539   -
540   - /// Creates a `Stream` of `UTF-8` `String`s from the underlying `DataStreamRequest`.
541   - ///
542   - /// - Parameters:
543   - /// - shouldAutomaticallyCancel: `Bool` indicating whether the underlying `DataStreamRequest` should be canceled
544   - /// which observation of the stream stops. `true` by default.
545   - /// - bufferingPolicy: ` BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default.
546   - /// - Returns:
547   - public func streamingStrings(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, bufferingPolicy: Stream<String, Never>.BufferingPolicy = .unbounded) -> Stream<String, Never> {
548   - createStream(automaticallyCancelling: shouldAutomaticallyCancel, bufferingPolicy: bufferingPolicy) { onStream in
549   - request.responseStreamString(on: .streamCompletionQueue(forRequestID: request.id), stream: onStream)
550   - }
551   - }
552   -
553   - /// Creates a `Stream` of `Decodable` values from the underlying `DataStreamRequest`.
554   - ///
555   - /// - Parameters:
556   - /// - type: `Decodable` type to be serialized from stream payloads.
557   - /// - shouldAutomaticallyCancel: `Bool` indicating whether the underlying `DataStreamRequest` should be canceled
558   - /// which observation of the stream stops. `true` by default.
559   - /// - bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default.
560   - ///
561   - /// - Returns: The `Stream`.
562   - public func streamingDecodables<T>(_ type: T.Type = T.self,
563   - automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
564   - bufferingPolicy: Stream<T, AFError>.BufferingPolicy = .unbounded)
565   - -> Stream<T, AFError> where T: Decodable {
566   - streamingResponses(serializedUsing: DecodableStreamSerializer<T>(),
567   - automaticallyCancelling: shouldAutomaticallyCancel,
568   - bufferingPolicy: bufferingPolicy)
569   - }
570   -
571   - /// Creates a `Stream` of values using the provided `DataStreamSerializer` from the underlying `DataStreamRequest`.
572   - ///
573   - /// - Parameters:
574   - /// - serializer: `DataStreamSerializer` to use to serialize incoming `Data`.
575   - /// - shouldAutomaticallyCancel: `Bool` indicating whether the underlying `DataStreamRequest` should be canceled
576   - /// which observation of the stream stops. `true` by default.
577   - /// - bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default.
578   - ///
579   - /// - Returns: The `Stream`.
580   - public func streamingResponses<Serializer: DataStreamSerializer>(serializedUsing serializer: Serializer,
581   - automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
582   - bufferingPolicy: Stream<Serializer.SerializedObject, AFError>.BufferingPolicy = .unbounded)
583   - -> Stream<Serializer.SerializedObject, AFError> {
584   - createStream(automaticallyCancelling: shouldAutomaticallyCancel, bufferingPolicy: bufferingPolicy) { onStream in
585   - request.responseStream(using: serializer,
586   - on: .streamCompletionQueue(forRequestID: request.id),
587   - stream: onStream)
588   - }
589   - }
590   -
591   - private func createStream<Success, Failure: Error>(automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
592   - bufferingPolicy: Stream<Success, Failure>.BufferingPolicy = .unbounded,
593   - forResponse onResponse: @escaping (@escaping (DataStreamRequest.Stream<Success, Failure>) -> Void) -> Void)
594   - -> Stream<Success, Failure> {
595   - StreamOf(bufferingPolicy: bufferingPolicy) {
596   - guard shouldAutomaticallyCancel,
597   - request.isInitialized || request.isResumed || request.isSuspended else { return }
598   -
599   - cancel()
600   - } builder: { continuation in
601   - onResponse { stream in
602   - continuation.yield(stream)
603   - if case .complete = stream.event {
604   - continuation.finish()
605   - }
606   - }
607   - }
608   - }
609   -
610   - /// Cancel the underlying `DataStreamRequest`.
611   - public func cancel() {
612   - request.cancel()
613   - }
614   -
615   - /// Resume the underlying `DataStreamRequest`.
616   - public func resume() {
617   - request.resume()
618   - }
619   -
620   - /// Suspend the underlying `DataStreamRequest`.
621   - public func suspend() {
622   - request.suspend()
623   - }
624   -}
625   -
626   -@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
627   -extension DataStreamRequest {
628   - /// Creates a `DataStreamTask` used to `await` streams of serialized values.
629   - ///
630   - /// - Returns: The `DataStreamTask`.
631   - public func streamTask() -> DataStreamTask {
632   - DataStreamTask(request: self)
633   - }
634   -}
635   -
636   -extension DispatchQueue {
637   - fileprivate static let singleEventQueue = DispatchQueue(label: "org.alamofire.concurrencySingleEventQueue",
638   - attributes: .concurrent)
639   -
640   - fileprivate static func streamCompletionQueue(forRequestID id: UUID) -> DispatchQueue {
641   - DispatchQueue(label: "org.alamofire.concurrencyStreamCompletionQueue-\(id)", target: .singleEventQueue)
642   - }
643   -}
644   -
645   -/// An asynchronous sequence generated from an underlying `AsyncStream`. Only produced by Alamofire.
646   -@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
647   -public struct StreamOf<Element>: AsyncSequence {
648   - public typealias AsyncIterator = Iterator
649   - public typealias BufferingPolicy = AsyncStream<Element>.Continuation.BufferingPolicy
650   - fileprivate typealias Continuation = AsyncStream<Element>.Continuation
651   -
652   - private let bufferingPolicy: BufferingPolicy
653   - private let onTermination: (() -> Void)?
654   - private let builder: (Continuation) -> Void
655   -
656   - fileprivate init(bufferingPolicy: BufferingPolicy = .unbounded,
657   - onTermination: (() -> Void)? = nil,
658   - builder: @escaping (Continuation) -> Void) {
659   - self.bufferingPolicy = bufferingPolicy
660   - self.onTermination = onTermination
661   - self.builder = builder
662   - }
663   -
664   - public func makeAsyncIterator() -> Iterator {
665   - var continuation: AsyncStream<Element>.Continuation?
666   - let stream = AsyncStream<Element>(bufferingPolicy: bufferingPolicy) { innerContinuation in
667   - continuation = innerContinuation
668   - builder(innerContinuation)
669   - }
670   -
671   - return Iterator(iterator: stream.makeAsyncIterator()) {
672   - continuation?.finish()
673   - onTermination?()
674   - }
675   - }
676   -
677   - public struct Iterator: AsyncIteratorProtocol {
678   - private final class Token {
679   - private let onDeinit: () -> Void
680   -
681   - init(onDeinit: @escaping () -> Void) {
682   - self.onDeinit = onDeinit
683   - }
684   -
685   - deinit {
686   - onDeinit()
687   - }
688   - }
689   -
690   - private var iterator: AsyncStream<Element>.AsyncIterator
691   - private let token: Token
692   -
693   - init(iterator: AsyncStream<Element>.AsyncIterator, onCancellation: @escaping () -> Void) {
694   - self.iterator = iterator
695   - token = Token(onDeinit: onCancellation)
696   - }
697   -
698   - public mutating func next() async -> Element? {
699   - await iterator.next()
700   - }
701   - }
702   -}
703   -
704   -#endif
Pods/Alamofire/Source/DispatchQueue+Alamofire.swift deleted 100644 → 0
1   -//
2   -// DispatchQueue+Alamofire.swift
3   -//
4   -// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -import Dispatch
26   -import Foundation
27   -
28   -extension DispatchQueue {
29   - /// Execute the provided closure after a `TimeInterval`.
30   - ///
31   - /// - Parameters:
32   - /// - delay: `TimeInterval` to delay execution.
33   - /// - closure: Closure to execute.
34   - func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {
35   - asyncAfter(deadline: .now() + delay, execute: closure)
36   - }
37   -}
Pods/Alamofire/Source/EventMonitor.swift deleted 100644 → 0
1   -//
2   -// EventMonitor.swift
3   -//
4   -// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -import Foundation
26   -
27   -/// Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various
28   -/// `URLSession` delegate protocols as well as various events from the lifetime of `Request` and its subclasses.
29   -public protocol EventMonitor {
30   - /// The `DispatchQueue` onto which Alamofire's root `CompositeEventMonitor` will dispatch events. `.main` by default.
31   - var queue: DispatchQueue { get }
32   -
33   - // MARK: - URLSession Events
34   -
35   - // MARK: URLSessionDelegate Events
36   -
37   - /// Event called during `URLSessionDelegate`'s `urlSession(_:didBecomeInvalidWithError:)` method.
38   - func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?)
39   -
40   - // MARK: URLSessionTaskDelegate Events
41   -
42   - /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didReceive:completionHandler:)` method.
43   - func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge)
44   -
45   - /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)` method.
46   - func urlSession(_ session: URLSession,
47   - task: URLSessionTask,
48   - didSendBodyData bytesSent: Int64,
49   - totalBytesSent: Int64,
50   - totalBytesExpectedToSend: Int64)
51   -
52   - /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:needNewBodyStream:)` method.
53   - func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask)
54   -
55   - /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` method.
56   - func urlSession(_ session: URLSession,
57   - task: URLSessionTask,
58   - willPerformHTTPRedirection response: HTTPURLResponse,
59   - newRequest request: URLRequest)
60   -
61   - /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didFinishCollecting:)` method.
62   - func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics)
63   -
64   - /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didCompleteWithError:)` method.
65   - func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
66   -
67   - /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:taskIsWaitingForConnectivity:)` method.
68   - func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask)
69   -
70   - // MARK: URLSessionDataDelegate Events
71   -
72   - /// Event called during `URLSessionDataDelegate`'s `urlSession(_:dataTask:didReceive:)` method.
73   - func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
74   -
75   - /// Event called during `URLSessionDataDelegate`'s `urlSession(_:dataTask:willCacheResponse:completionHandler:)` method.
76   - func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse)
77   -
78   - // MARK: URLSessionDownloadDelegate Events
79   -
80   - /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)` method.
81   - func urlSession(_ session: URLSession,
82   - downloadTask: URLSessionDownloadTask,
83   - didResumeAtOffset fileOffset: Int64,
84   - expectedTotalBytes: Int64)
85   -
86   - /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)` method.
87   - func urlSession(_ session: URLSession,
88   - downloadTask: URLSessionDownloadTask,
89   - didWriteData bytesWritten: Int64,
90   - totalBytesWritten: Int64,
91   - totalBytesExpectedToWrite: Int64)
92   -
93   - /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didFinishDownloadingTo:)` method.
94   - func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
95   -
96   - // MARK: - Request Events
97   -
98   - /// Event called when a `URLRequest` is first created for a `Request`. If a `RequestAdapter` is active, the
99   - /// `URLRequest` will be adapted before being issued.
100   - func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest)
101   -
102   - /// Event called when the attempt to create a `URLRequest` from a `Request`'s original `URLRequestConvertible` value fails.
103   - func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError)
104   -
105   - /// Event called when a `RequestAdapter` adapts the `Request`'s initial `URLRequest`.
106   - func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest)
107   -
108   - /// Event called when a `RequestAdapter` fails to adapt the `Request`'s initial `URLRequest`.
109   - func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError)
110   -
111   - /// Event called when a final `URLRequest` is created for a `Request`.
112   - func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest)
113   -
114   - /// Event called when a `URLSessionTask` subclass instance is created for a `Request`.
115   - func request(_ request: Request, didCreateTask task: URLSessionTask)
116   -
117   - /// Event called when a `Request` receives a `URLSessionTaskMetrics` value.
118   - func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics)
119   -
120   - /// Event called when a `Request` fails due to an error created by Alamofire. e.g. When certificate pinning fails.
121   - func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError)
122   -
123   - /// Event called when a `Request`'s task completes, possibly with an error. A `Request` may receive this event
124   - /// multiple times if it is retried.
125   - func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?)
126   -
127   - /// Event called when a `Request` is about to be retried.
128   - func requestIsRetrying(_ request: Request)
129   -
130   - /// Event called when a `Request` finishes and response serializers are being called.
131   - func requestDidFinish(_ request: Request)
132   -
133   - /// Event called when a `Request` receives a `resume` call.
134   - func requestDidResume(_ request: Request)
135   -
136   - /// Event called when a `Request`'s associated `URLSessionTask` is resumed.
137   - func request(_ request: Request, didResumeTask task: URLSessionTask)
138   -
139   - /// Event called when a `Request` receives a `suspend` call.
140   - func requestDidSuspend(_ request: Request)
141   -
142   - /// Event called when a `Request`'s associated `URLSessionTask` is suspended.
143   - func request(_ request: Request, didSuspendTask task: URLSessionTask)
144   -
145   - /// Event called when a `Request` receives a `cancel` call.
146   - func requestDidCancel(_ request: Request)
147   -
148   - /// Event called when a `Request`'s associated `URLSessionTask` is cancelled.
149   - func request(_ request: Request, didCancelTask task: URLSessionTask)
150   -
151   - // MARK: DataRequest Events
152   -
153   - /// Event called when a `DataRequest` calls a `Validation`.
154   - func request(_ request: DataRequest,
155   - didValidateRequest urlRequest: URLRequest?,
156   - response: HTTPURLResponse,
157   - data: Data?,
158   - withResult result: Request.ValidationResult)
159   -
160   - /// Event called when a `DataRequest` creates a `DataResponse<Data?>` value without calling a `ResponseSerializer`.
161   - func request(_ request: DataRequest, didParseResponse response: DataResponse<Data?, AFError>)
162   -
163   - /// Event called when a `DataRequest` calls a `ResponseSerializer` and creates a generic `DataResponse<Value, AFError>`.
164   - func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value, AFError>)
165   -
166   - // MARK: DataStreamRequest Events
167   -
168   - /// Event called when a `DataStreamRequest` calls a `Validation` closure.
169   - ///
170   - /// - Parameters:
171   - /// - request: `DataStreamRequest` which is calling the `Validation`.
172   - /// - urlRequest: `URLRequest` of the request being validated.
173   - /// - response: `HTTPURLResponse` of the request being validated.
174   - /// - result: Produced `ValidationResult`.
175   - func request(_ request: DataStreamRequest,
176   - didValidateRequest urlRequest: URLRequest?,
177   - response: HTTPURLResponse,
178   - withResult result: Request.ValidationResult)
179   -
180   - /// Event called when a `DataStreamSerializer` produces a value from streamed `Data`.
181   - ///
182   - /// - Parameters:
183   - /// - request: `DataStreamRequest` for which the value was serialized.
184   - /// - result: `Result` of the serialization attempt.
185   - func request<Value>(_ request: DataStreamRequest, didParseStream result: Result<Value, AFError>)
186   -
187   - // MARK: UploadRequest Events
188   -
189   - /// Event called when an `UploadRequest` creates its `Uploadable` value, indicating the type of upload it represents.
190   - func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable)
191   -
192   - /// Event called when an `UploadRequest` failed to create its `Uploadable` value due to an error.
193   - func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError)
194   -
195   - /// Event called when an `UploadRequest` provides the `InputStream` from its `Uploadable` value. This only occurs if
196   - /// the `InputStream` does not wrap a `Data` value or file `URL`.
197   - func request(_ request: UploadRequest, didProvideInputStream stream: InputStream)
198   -
199   - // MARK: DownloadRequest Events
200   -
201   - /// Event called when a `DownloadRequest`'s `URLSessionDownloadTask` finishes and the temporary file has been moved.
202   - func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result<URL, AFError>)
203   -
204   - /// Event called when a `DownloadRequest`'s `Destination` closure is called and creates the destination URL the
205   - /// downloaded file will be moved to.
206   - func request(_ request: DownloadRequest, didCreateDestinationURL url: URL)
207   -
208   - /// Event called when a `DownloadRequest` calls a `Validation`.
209   - func request(_ request: DownloadRequest,
210   - didValidateRequest urlRequest: URLRequest?,
211   - response: HTTPURLResponse,
212   - fileURL: URL?,
213   - withResult result: Request.ValidationResult)
214   -
215   - /// Event called when a `DownloadRequest` creates a `DownloadResponse<URL?, AFError>` without calling a `ResponseSerializer`.
216   - func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse<URL?, AFError>)
217   -
218   - /// Event called when a `DownloadRequest` calls a `DownloadResponseSerializer` and creates a generic `DownloadResponse<Value, AFError>`
219   - func request<Value>(_ request: DownloadRequest, didParseResponse response: DownloadResponse<Value, AFError>)
220   -}
221   -
222   -extension EventMonitor {
223   - /// The default queue on which `CompositeEventMonitor`s will call the `EventMonitor` methods. `.main` by default.
224   - public var queue: DispatchQueue { .main }
225   -
226   - // MARK: Default Implementations
227   -
228   - public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {}
229   - public func urlSession(_ session: URLSession,
230   - task: URLSessionTask,
231   - didReceive challenge: URLAuthenticationChallenge) {}
232   - public func urlSession(_ session: URLSession,
233   - task: URLSessionTask,
234   - didSendBodyData bytesSent: Int64,
235   - totalBytesSent: Int64,
236   - totalBytesExpectedToSend: Int64) {}
237   - public func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) {}
238   - public func urlSession(_ session: URLSession,
239   - task: URLSessionTask,
240   - willPerformHTTPRedirection response: HTTPURLResponse,
241   - newRequest request: URLRequest) {}
242   - public func urlSession(_ session: URLSession,
243   - task: URLSessionTask,
244   - didFinishCollecting metrics: URLSessionTaskMetrics) {}
245   - public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {}
246   - public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {}
247   - public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {}
248   - public func urlSession(_ session: URLSession,
249   - dataTask: URLSessionDataTask,
250   - willCacheResponse proposedResponse: CachedURLResponse) {}
251   - public func urlSession(_ session: URLSession,
252   - downloadTask: URLSessionDownloadTask,
253   - didResumeAtOffset fileOffset: Int64,
254   - expectedTotalBytes: Int64) {}
255   - public func urlSession(_ session: URLSession,
256   - downloadTask: URLSessionDownloadTask,
257   - didWriteData bytesWritten: Int64,
258   - totalBytesWritten: Int64,
259   - totalBytesExpectedToWrite: Int64) {}
260   - public func urlSession(_ session: URLSession,
261   - downloadTask: URLSessionDownloadTask,
262   - didFinishDownloadingTo location: URL) {}
263   - public func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) {}
264   - public func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) {}
265   - public func request(_ request: Request,
266   - didAdaptInitialRequest initialRequest: URLRequest,
267   - to adaptedRequest: URLRequest) {}
268   - public func request(_ request: Request,
269   - didFailToAdaptURLRequest initialRequest: URLRequest,
270   - withError error: AFError) {}
271   - public func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) {}
272   - public func request(_ request: Request, didCreateTask task: URLSessionTask) {}
273   - public func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) {}
274   - public func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) {}
275   - public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {}
276   - public func requestIsRetrying(_ request: Request) {}
277   - public func requestDidFinish(_ request: Request) {}
278   - public func requestDidResume(_ request: Request) {}
279   - public func request(_ request: Request, didResumeTask task: URLSessionTask) {}
280   - public func requestDidSuspend(_ request: Request) {}
281   - public func request(_ request: Request, didSuspendTask task: URLSessionTask) {}
282   - public func requestDidCancel(_ request: Request) {}
283   - public func request(_ request: Request, didCancelTask task: URLSessionTask) {}
284   - public func request(_ request: DataRequest,
285   - didValidateRequest urlRequest: URLRequest?,
286   - response: HTTPURLResponse,
287   - data: Data?,
288   - withResult result: Request.ValidationResult) {}
289   - public func request(_ request: DataRequest, didParseResponse response: DataResponse<Data?, AFError>) {}
290   - public func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value, AFError>) {}
291   - public func request(_ request: DataStreamRequest,
292   - didValidateRequest urlRequest: URLRequest?,
293   - response: HTTPURLResponse,
294   - withResult result: Request.ValidationResult) {}
295   - public func request<Value>(_ request: DataStreamRequest, didParseStream result: Result<Value, AFError>) {}
296   - public func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) {}
297   - public func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) {}
298   - public func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) {}
299   - public func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result<URL, AFError>) {}
300   - public func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) {}
301   - public func request(_ request: DownloadRequest,
302   - didValidateRequest urlRequest: URLRequest?,
303   - response: HTTPURLResponse,
304   - fileURL: URL?,
305   - withResult result: Request.ValidationResult) {}
306   - public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse<URL?, AFError>) {}
307   - public func request<Value>(_ request: DownloadRequest, didParseResponse response: DownloadResponse<Value, AFError>) {}
308   -}
309   -
310   -/// An `EventMonitor` which can contain multiple `EventMonitor`s and calls their methods on their queues.
311   -public final class CompositeEventMonitor: EventMonitor {
312   - public let queue = DispatchQueue(label: "org.alamofire.compositeEventMonitor", qos: .utility)
313   -
314   - let monitors: [EventMonitor]
315   -
316   - init(monitors: [EventMonitor]) {
317   - self.monitors = monitors
318   - }
319   -
320   - func performEvent(_ event: @escaping (EventMonitor) -> Void) {
321   - queue.async {
322   - for monitor in self.monitors {
323   - monitor.queue.async { event(monitor) }
324   - }
325   - }
326   - }
327   -
328   - public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {
329   - performEvent { $0.urlSession(session, didBecomeInvalidWithError: error) }
330   - }
331   -
332   - public func urlSession(_ session: URLSession,
333   - task: URLSessionTask,
334   - didReceive challenge: URLAuthenticationChallenge) {
335   - performEvent { $0.urlSession(session, task: task, didReceive: challenge) }
336   - }
337   -
338   - public func urlSession(_ session: URLSession,
339   - task: URLSessionTask,
340   - didSendBodyData bytesSent: Int64,
341   - totalBytesSent: Int64,
342   - totalBytesExpectedToSend: Int64) {
343   - performEvent {
344   - $0.urlSession(session,
345   - task: task,
346   - didSendBodyData: bytesSent,
347   - totalBytesSent: totalBytesSent,
348   - totalBytesExpectedToSend: totalBytesExpectedToSend)
349   - }
350   - }
351   -
352   - public func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) {
353   - performEvent {
354   - $0.urlSession(session, taskNeedsNewBodyStream: task)
355   - }
356   - }
357   -
358   - public func urlSession(_ session: URLSession,
359   - task: URLSessionTask,
360   - willPerformHTTPRedirection response: HTTPURLResponse,
361   - newRequest request: URLRequest) {
362   - performEvent {
363   - $0.urlSession(session,
364   - task: task,
365   - willPerformHTTPRedirection: response,
366   - newRequest: request)
367   - }
368   - }
369   -
370   - public func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {
371   - performEvent { $0.urlSession(session, task: task, didFinishCollecting: metrics) }
372   - }
373   -
374   - public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
375   - performEvent { $0.urlSession(session, task: task, didCompleteWithError: error) }
376   - }
377   -
378   - @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
379   - public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {
380   - performEvent { $0.urlSession(session, taskIsWaitingForConnectivity: task) }
381   - }
382   -
383   - public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
384   - performEvent { $0.urlSession(session, dataTask: dataTask, didReceive: data) }
385   - }
386   -
387   - public func urlSession(_ session: URLSession,
388   - dataTask: URLSessionDataTask,
389   - willCacheResponse proposedResponse: CachedURLResponse) {
390   - performEvent { $0.urlSession(session, dataTask: dataTask, willCacheResponse: proposedResponse) }
391   - }
392   -
393   - public func urlSession(_ session: URLSession,
394   - downloadTask: URLSessionDownloadTask,
395   - didResumeAtOffset fileOffset: Int64,
396   - expectedTotalBytes: Int64) {
397   - performEvent {
398   - $0.urlSession(session,
399   - downloadTask: downloadTask,
400   - didResumeAtOffset: fileOffset,
401   - expectedTotalBytes: expectedTotalBytes)
402   - }
403   - }
404   -
405   - public func urlSession(_ session: URLSession,
406   - downloadTask: URLSessionDownloadTask,
407   - didWriteData bytesWritten: Int64,
408   - totalBytesWritten: Int64,
409   - totalBytesExpectedToWrite: Int64) {
410   - performEvent {
411   - $0.urlSession(session,
412   - downloadTask: downloadTask,
413   - didWriteData: bytesWritten,
414   - totalBytesWritten: totalBytesWritten,
415   - totalBytesExpectedToWrite: totalBytesExpectedToWrite)
416   - }
417   - }
418   -
419   - public func urlSession(_ session: URLSession,
420   - downloadTask: URLSessionDownloadTask,
421   - didFinishDownloadingTo location: URL) {
422   - performEvent { $0.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: location) }
423   - }
424   -
425   - public func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) {
426   - performEvent { $0.request(request, didCreateInitialURLRequest: urlRequest) }
427   - }
428   -
429   - public func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) {
430   - performEvent { $0.request(request, didFailToCreateURLRequestWithError: error) }
431   - }
432   -
433   - public func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) {
434   - performEvent { $0.request(request, didAdaptInitialRequest: initialRequest, to: adaptedRequest) }
435   - }
436   -
437   - public func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) {
438   - performEvent { $0.request(request, didFailToAdaptURLRequest: initialRequest, withError: error) }
439   - }
440   -
441   - public func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) {
442   - performEvent { $0.request(request, didCreateURLRequest: urlRequest) }
443   - }
444   -
445   - public func request(_ request: Request, didCreateTask task: URLSessionTask) {
446   - performEvent { $0.request(request, didCreateTask: task) }
447   - }
448   -
449   - public func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) {
450   - performEvent { $0.request(request, didGatherMetrics: metrics) }
451   - }
452   -
453   - public func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) {
454   - performEvent { $0.request(request, didFailTask: task, earlyWithError: error) }
455   - }
456   -
457   - public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {
458   - performEvent { $0.request(request, didCompleteTask: task, with: error) }
459   - }
460   -
461   - public func requestIsRetrying(_ request: Request) {
462   - performEvent { $0.requestIsRetrying(request) }
463   - }
464   -
465   - public func requestDidFinish(_ request: Request) {
466   - performEvent { $0.requestDidFinish(request) }
467   - }
468   -
469   - public func requestDidResume(_ request: Request) {
470   - performEvent { $0.requestDidResume(request) }
471   - }
472   -
473   - public func request(_ request: Request, didResumeTask task: URLSessionTask) {
474   - performEvent { $0.request(request, didResumeTask: task) }
475   - }
476   -
477   - public func requestDidSuspend(_ request: Request) {
478   - performEvent { $0.requestDidSuspend(request) }
479   - }
480   -
481   - public func request(_ request: Request, didSuspendTask task: URLSessionTask) {
482   - performEvent { $0.request(request, didSuspendTask: task) }
483   - }
484   -
485   - public func requestDidCancel(_ request: Request) {
486   - performEvent { $0.requestDidCancel(request) }
487   - }
488   -
489   - public func request(_ request: Request, didCancelTask task: URLSessionTask) {
490   - performEvent { $0.request(request, didCancelTask: task) }
491   - }
492   -
493   - public func request(_ request: DataRequest,
494   - didValidateRequest urlRequest: URLRequest?,
495   - response: HTTPURLResponse,
496   - data: Data?,
497   - withResult result: Request.ValidationResult) {
498   - performEvent { $0.request(request,
499   - didValidateRequest: urlRequest,
500   - response: response,
501   - data: data,
502   - withResult: result)
503   - }
504   - }
505   -
506   - public func request(_ request: DataRequest, didParseResponse response: DataResponse<Data?, AFError>) {
507   - performEvent { $0.request(request, didParseResponse: response) }
508   - }
509   -
510   - public func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value, AFError>) {
511   - performEvent { $0.request(request, didParseResponse: response) }
512   - }
513   -
514   - public func request(_ request: DataStreamRequest,
515   - didValidateRequest urlRequest: URLRequest?,
516   - response: HTTPURLResponse,
517   - withResult result: Request.ValidationResult) {
518   - performEvent { $0.request(request,
519   - didValidateRequest: urlRequest,
520   - response: response,
521   - withResult: result)
522   - }
523   - }
524   -
525   - public func request<Value>(_ request: DataStreamRequest, didParseStream result: Result<Value, AFError>) {
526   - performEvent { $0.request(request, didParseStream: result) }
527   - }
528   -
529   - public func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) {
530   - performEvent { $0.request(request, didCreateUploadable: uploadable) }
531   - }
532   -
533   - public func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) {
534   - performEvent { $0.request(request, didFailToCreateUploadableWithError: error) }
535   - }
536   -
537   - public func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) {
538   - performEvent { $0.request(request, didProvideInputStream: stream) }
539   - }
540   -
541   - public func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result<URL, AFError>) {
542   - performEvent { $0.request(request, didFinishDownloadingUsing: task, with: result) }
543   - }
544   -
545   - public func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) {
546   - performEvent { $0.request(request, didCreateDestinationURL: url) }
547   - }
548   -
549   - public func request(_ request: DownloadRequest,
550   - didValidateRequest urlRequest: URLRequest?,
551   - response: HTTPURLResponse,
552   - fileURL: URL?,
553   - withResult result: Request.ValidationResult) {
554   - performEvent { $0.request(request,
555   - didValidateRequest: urlRequest,
556   - response: response,
557   - fileURL: fileURL,
558   - withResult: result) }
559   - }
560   -
561   - public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse<URL?, AFError>) {
562   - performEvent { $0.request(request, didParseResponse: response) }
563   - }
564   -
565   - public func request<Value>(_ request: DownloadRequest, didParseResponse response: DownloadResponse<Value, AFError>) {
566   - performEvent { $0.request(request, didParseResponse: response) }
567   - }
568   -}
569   -
570   -/// `EventMonitor` that allows optional closures to be set to receive events.
571   -open class ClosureEventMonitor: EventMonitor {
572   - /// Closure called on the `urlSession(_:didBecomeInvalidWithError:)` event.
573   - open var sessionDidBecomeInvalidWithError: ((URLSession, Error?) -> Void)?
574   -
575   - /// Closure called on the `urlSession(_:task:didReceive:completionHandler:)`.
576   - open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> Void)?
577   -
578   - /// Closure that receives `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)` event.
579   - open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)?
580   -
581   - /// Closure called on the `urlSession(_:task:needNewBodyStream:)` event.
582   - open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> Void)?
583   -
584   - /// Closure called on the `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` event.
585   - open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> Void)?
586   -
587   - /// Closure called on the `urlSession(_:task:didFinishCollecting:)` event.
588   - open var taskDidFinishCollectingMetrics: ((URLSession, URLSessionTask, URLSessionTaskMetrics) -> Void)?
589   -
590   - /// Closure called on the `urlSession(_:task:didCompleteWithError:)` event.
591   - open var taskDidComplete: ((URLSession, URLSessionTask, Error?) -> Void)?
592   -
593   - /// Closure called on the `urlSession(_:taskIsWaitingForConnectivity:)` event.
594   - open var taskIsWaitingForConnectivity: ((URLSession, URLSessionTask) -> Void)?
595   -
596   - /// Closure that receives the `urlSession(_:dataTask:didReceive:)` event.
597   - open var dataTaskDidReceiveData: ((URLSession, URLSessionDataTask, Data) -> Void)?
598   -
599   - /// Closure called on the `urlSession(_:dataTask:willCacheResponse:completionHandler:)` event.
600   - open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> Void)?
601   -
602   - /// Closure called on the `urlSession(_:downloadTask:didFinishDownloadingTo:)` event.
603   - open var downloadTaskDidFinishDownloadingToURL: ((URLSession, URLSessionDownloadTask, URL) -> Void)?
604   -
605   - /// Closure called on the `urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)`
606   - /// event.
607   - open var downloadTaskDidWriteData: ((URLSession, URLSessionDownloadTask, Int64, Int64, Int64) -> Void)?
608   -
609   - /// Closure called on the `urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)` event.
610   - open var downloadTaskDidResumeAtOffset: ((URLSession, URLSessionDownloadTask, Int64, Int64) -> Void)?
611   -
612   - // MARK: - Request Events
613   -
614   - /// Closure called on the `request(_:didCreateInitialURLRequest:)` event.
615   - open var requestDidCreateInitialURLRequest: ((Request, URLRequest) -> Void)?
616   -
617   - /// Closure called on the `request(_:didFailToCreateURLRequestWithError:)` event.
618   - open var requestDidFailToCreateURLRequestWithError: ((Request, AFError) -> Void)?
619   -
620   - /// Closure called on the `request(_:didAdaptInitialRequest:to:)` event.
621   - open var requestDidAdaptInitialRequestToAdaptedRequest: ((Request, URLRequest, URLRequest) -> Void)?
622   -
623   - /// Closure called on the `request(_:didFailToAdaptURLRequest:withError:)` event.
624   - open var requestDidFailToAdaptURLRequestWithError: ((Request, URLRequest, AFError) -> Void)?
625   -
626   - /// Closure called on the `request(_:didCreateURLRequest:)` event.
627   - open var requestDidCreateURLRequest: ((Request, URLRequest) -> Void)?
628   -
629   - /// Closure called on the `request(_:didCreateTask:)` event.
630   - open var requestDidCreateTask: ((Request, URLSessionTask) -> Void)?
631   -
632   - /// Closure called on the `request(_:didGatherMetrics:)` event.
633   - open var requestDidGatherMetrics: ((Request, URLSessionTaskMetrics) -> Void)?
634   -
635   - /// Closure called on the `request(_:didFailTask:earlyWithError:)` event.
636   - open var requestDidFailTaskEarlyWithError: ((Request, URLSessionTask, AFError) -> Void)?
637   -
638   - /// Closure called on the `request(_:didCompleteTask:with:)` event.
639   - open var requestDidCompleteTaskWithError: ((Request, URLSessionTask, AFError?) -> Void)?
640   -
641   - /// Closure called on the `requestIsRetrying(_:)` event.
642   - open var requestIsRetrying: ((Request) -> Void)?
643   -
644   - /// Closure called on the `requestDidFinish(_:)` event.
645   - open var requestDidFinish: ((Request) -> Void)?
646   -
647   - /// Closure called on the `requestDidResume(_:)` event.
648   - open var requestDidResume: ((Request) -> Void)?
649   -
650   - /// Closure called on the `request(_:didResumeTask:)` event.
651   - open var requestDidResumeTask: ((Request, URLSessionTask) -> Void)?
652   -
653   - /// Closure called on the `requestDidSuspend(_:)` event.
654   - open var requestDidSuspend: ((Request) -> Void)?
655   -
656   - /// Closure called on the `request(_:didSuspendTask:)` event.
657   - open var requestDidSuspendTask: ((Request, URLSessionTask) -> Void)?
658   -
659   - /// Closure called on the `requestDidCancel(_:)` event.
660   - open var requestDidCancel: ((Request) -> Void)?
661   -
662   - /// Closure called on the `request(_:didCancelTask:)` event.
663   - open var requestDidCancelTask: ((Request, URLSessionTask) -> Void)?
664   -
665   - /// Closure called on the `request(_:didValidateRequest:response:data:withResult:)` event.
666   - open var requestDidValidateRequestResponseDataWithResult: ((DataRequest, URLRequest?, HTTPURLResponse, Data?, Request.ValidationResult) -> Void)?
667   -
668   - /// Closure called on the `request(_:didParseResponse:)` event.
669   - open var requestDidParseResponse: ((DataRequest, DataResponse<Data?, AFError>) -> Void)?
670   -
671   - /// Closure called on the `request(_:didValidateRequest:response:withResult:)` event.
672   - open var requestDidValidateRequestResponseWithResult: ((DataStreamRequest, URLRequest?, HTTPURLResponse, Request.ValidationResult) -> Void)?
673   -
674   - /// Closure called on the `request(_:didCreateUploadable:)` event.
675   - open var requestDidCreateUploadable: ((UploadRequest, UploadRequest.Uploadable) -> Void)?
676   -
677   - /// Closure called on the `request(_:didFailToCreateUploadableWithError:)` event.
678   - open var requestDidFailToCreateUploadableWithError: ((UploadRequest, AFError) -> Void)?
679   -
680   - /// Closure called on the `request(_:didProvideInputStream:)` event.
681   - open var requestDidProvideInputStream: ((UploadRequest, InputStream) -> Void)?
682   -
683   - /// Closure called on the `request(_:didFinishDownloadingUsing:with:)` event.
684   - open var requestDidFinishDownloadingUsingTaskWithResult: ((DownloadRequest, URLSessionTask, Result<URL, AFError>) -> Void)?
685   -
686   - /// Closure called on the `request(_:didCreateDestinationURL:)` event.
687   - open var requestDidCreateDestinationURL: ((DownloadRequest, URL) -> Void)?
688   -
689   - /// Closure called on the `request(_:didValidateRequest:response:temporaryURL:destinationURL:withResult:)` event.
690   - open var requestDidValidateRequestResponseFileURLWithResult: ((DownloadRequest, URLRequest?, HTTPURLResponse, URL?, Request.ValidationResult) -> Void)?
691   -
692   - /// Closure called on the `request(_:didParseResponse:)` event.
693   - open var requestDidParseDownloadResponse: ((DownloadRequest, DownloadResponse<URL?, AFError>) -> Void)?
694   -
695   - public let queue: DispatchQueue
696   -
697   - /// Creates an instance using the provided queue.
698   - ///
699   - /// - Parameter queue: `DispatchQueue` on which events will fired. `.main` by default.
700   - public init(queue: DispatchQueue = .main) {
701   - self.queue = queue
702   - }
703   -
704   - open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {
705   - sessionDidBecomeInvalidWithError?(session, error)
706   - }
707   -
708   - open func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge) {
709   - taskDidReceiveChallenge?(session, task, challenge)
710   - }
711   -
712   - open func urlSession(_ session: URLSession,
713   - task: URLSessionTask,
714   - didSendBodyData bytesSent: Int64,
715   - totalBytesSent: Int64,
716   - totalBytesExpectedToSend: Int64) {
717   - taskDidSendBodyData?(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend)
718   - }
719   -
720   - open func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) {
721   - taskNeedNewBodyStream?(session, task)
722   - }
723   -
724   - open func urlSession(_ session: URLSession,
725   - task: URLSessionTask,
726   - willPerformHTTPRedirection response: HTTPURLResponse,
727   - newRequest request: URLRequest) {
728   - taskWillPerformHTTPRedirection?(session, task, response, request)
729   - }
730   -
731   - open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {
732   - taskDidFinishCollectingMetrics?(session, task, metrics)
733   - }
734   -
735   - open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
736   - taskDidComplete?(session, task, error)
737   - }
738   -
739   - @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
740   - open func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {
741   - taskIsWaitingForConnectivity?(session, task)
742   - }
743   -
744   - open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
745   - dataTaskDidReceiveData?(session, dataTask, data)
746   - }
747   -
748   - open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse) {
749   - dataTaskWillCacheResponse?(session, dataTask, proposedResponse)
750   - }
751   -
752   - open func urlSession(_ session: URLSession,
753   - downloadTask: URLSessionDownloadTask,
754   - didResumeAtOffset fileOffset: Int64,
755   - expectedTotalBytes: Int64) {
756   - downloadTaskDidResumeAtOffset?(session, downloadTask, fileOffset, expectedTotalBytes)
757   - }
758   -
759   - open func urlSession(_ session: URLSession,
760   - downloadTask: URLSessionDownloadTask,
761   - didWriteData bytesWritten: Int64,
762   - totalBytesWritten: Int64,
763   - totalBytesExpectedToWrite: Int64) {
764   - downloadTaskDidWriteData?(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite)
765   - }
766   -
767   - open func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
768   - downloadTaskDidFinishDownloadingToURL?(session, downloadTask, location)
769   - }
770   -
771   - // MARK: Request Events
772   -
773   - open func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) {
774   - requestDidCreateInitialURLRequest?(request, urlRequest)
775   - }
776   -
777   - open func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) {
778   - requestDidFailToCreateURLRequestWithError?(request, error)
779   - }
780   -
781   - open func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) {
782   - requestDidAdaptInitialRequestToAdaptedRequest?(request, initialRequest, adaptedRequest)
783   - }
784   -
785   - open func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) {
786   - requestDidFailToAdaptURLRequestWithError?(request, initialRequest, error)
787   - }
788   -
789   - open func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) {
790   - requestDidCreateURLRequest?(request, urlRequest)
791   - }
792   -
793   - open func request(_ request: Request, didCreateTask task: URLSessionTask) {
794   - requestDidCreateTask?(request, task)
795   - }
796   -
797   - open func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) {
798   - requestDidGatherMetrics?(request, metrics)
799   - }
800   -
801   - open func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) {
802   - requestDidFailTaskEarlyWithError?(request, task, error)
803   - }
804   -
805   - open func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {
806   - requestDidCompleteTaskWithError?(request, task, error)
807   - }
808   -
809   - open func requestIsRetrying(_ request: Request) {
810   - requestIsRetrying?(request)
811   - }
812   -
813   - open func requestDidFinish(_ request: Request) {
814   - requestDidFinish?(request)
815   - }
816   -
817   - open func requestDidResume(_ request: Request) {
818   - requestDidResume?(request)
819   - }
820   -
821   - public func request(_ request: Request, didResumeTask task: URLSessionTask) {
822   - requestDidResumeTask?(request, task)
823   - }
824   -
825   - open func requestDidSuspend(_ request: Request) {
826   - requestDidSuspend?(request)
827   - }
828   -
829   - public func request(_ request: Request, didSuspendTask task: URLSessionTask) {
830   - requestDidSuspendTask?(request, task)
831   - }
832   -
833   - open func requestDidCancel(_ request: Request) {
834   - requestDidCancel?(request)
835   - }
836   -
837   - public func request(_ request: Request, didCancelTask task: URLSessionTask) {
838   - requestDidCancelTask?(request, task)
839   - }
840   -
841   - open func request(_ request: DataRequest,
842   - didValidateRequest urlRequest: URLRequest?,
843   - response: HTTPURLResponse,
844   - data: Data?,
845   - withResult result: Request.ValidationResult) {
846   - requestDidValidateRequestResponseDataWithResult?(request, urlRequest, response, data, result)
847   - }
848   -
849   - open func request(_ request: DataRequest, didParseResponse response: DataResponse<Data?, AFError>) {
850   - requestDidParseResponse?(request, response)
851   - }
852   -
853   - public func request(_ request: DataStreamRequest, didValidateRequest urlRequest: URLRequest?, response: HTTPURLResponse, withResult result: Request.ValidationResult) {
854   - requestDidValidateRequestResponseWithResult?(request, urlRequest, response, result)
855   - }
856   -
857   - open func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) {
858   - requestDidCreateUploadable?(request, uploadable)
859   - }
860   -
861   - open func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) {
862   - requestDidFailToCreateUploadableWithError?(request, error)
863   - }
864   -
865   - open func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) {
866   - requestDidProvideInputStream?(request, stream)
867   - }
868   -
869   - open func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result<URL, AFError>) {
870   - requestDidFinishDownloadingUsingTaskWithResult?(request, task, result)
871   - }
872   -
873   - open func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) {
874   - requestDidCreateDestinationURL?(request, url)
875   - }
876   -
877   - open func request(_ request: DownloadRequest,
878   - didValidateRequest urlRequest: URLRequest?,
879   - response: HTTPURLResponse,
880   - fileURL: URL?,
881   - withResult result: Request.ValidationResult) {
882   - requestDidValidateRequestResponseFileURLWithResult?(request,
883   - urlRequest,
884   - response,
885   - fileURL,
886   - result)
887   - }
888   -
889   - open func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse<URL?, AFError>) {
890   - requestDidParseDownloadResponse?(request, response)
891   - }
892   -}
Pods/Alamofire/Source/HTTPHeaders.swift deleted 100644 → 0
1   -//
2   -// HTTPHeaders.swift
3   -//
4   -// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -import Foundation
26   -
27   -/// An order-preserving and case-insensitive representation of HTTP headers.
28   -public struct HTTPHeaders {
29   - private var headers: [HTTPHeader] = []
30   -
31   - /// Creates an empty instance.
32   - public init() {}
33   -
34   - /// Creates an instance from an array of `HTTPHeader`s. Duplicate case-insensitive names are collapsed into the last
35   - /// name and value encountered.
36   - public init(_ headers: [HTTPHeader]) {
37   - self.init()
38   -
39   - headers.forEach { update($0) }
40   - }
41   -
42   - /// Creates an instance from a `[String: String]`. Duplicate case-insensitive names are collapsed into the last name
43   - /// and value encountered.
44   - public init(_ dictionary: [String: String]) {
45   - self.init()
46   -
47   - dictionary.forEach { update(HTTPHeader(name: $0.key, value: $0.value)) }
48   - }
49   -
50   - /// Case-insensitively updates or appends an `HTTPHeader` into the instance using the provided `name` and `value`.
51   - ///
52   - /// - Parameters:
53   - /// - name: The `HTTPHeader` name.
54   - /// - value: The `HTTPHeader value.
55   - public mutating func add(name: String, value: String) {
56   - update(HTTPHeader(name: name, value: value))
57   - }
58   -
59   - /// Case-insensitively updates or appends the provided `HTTPHeader` into the instance.
60   - ///
61   - /// - Parameter header: The `HTTPHeader` to update or append.
62   - public mutating func add(_ header: HTTPHeader) {
63   - update(header)
64   - }
65   -
66   - /// Case-insensitively updates or appends an `HTTPHeader` into the instance using the provided `name` and `value`.
67   - ///
68   - /// - Parameters:
69   - /// - name: The `HTTPHeader` name.
70   - /// - value: The `HTTPHeader value.
71   - public mutating func update(name: String, value: String) {
72   - update(HTTPHeader(name: name, value: value))
73   - }
74   -
75   - /// Case-insensitively updates or appends the provided `HTTPHeader` into the instance.
76   - ///
77   - /// - Parameter header: The `HTTPHeader` to update or append.
78   - public mutating func update(_ header: HTTPHeader) {
79   - guard let index = headers.index(of: header.name) else {
80   - headers.append(header)
81   - return
82   - }
83   -
84   - headers.replaceSubrange(index...index, with: [header])
85   - }
86   -
87   - /// Case-insensitively removes an `HTTPHeader`, if it exists, from the instance.
88   - ///
89   - /// - Parameter name: The name of the `HTTPHeader` to remove.
90   - public mutating func remove(name: String) {
91   - guard let index = headers.index(of: name) else { return }
92   -
93   - headers.remove(at: index)
94   - }
95   -
96   - /// Sort the current instance by header name, case insensitively.
97   - public mutating func sort() {
98   - headers.sort { $0.name.lowercased() < $1.name.lowercased() }
99   - }
100   -
101   - /// Returns an instance sorted by header name.
102   - ///
103   - /// - Returns: A copy of the current instance sorted by name.
104   - public func sorted() -> HTTPHeaders {
105   - var headers = self
106   - headers.sort()
107   -
108   - return headers
109   - }
110   -
111   - /// Case-insensitively find a header's value by name.
112   - ///
113   - /// - Parameter name: The name of the header to search for, case-insensitively.
114   - ///
115   - /// - Returns: The value of header, if it exists.
116   - public func value(for name: String) -> String? {
117   - guard let index = headers.index(of: name) else { return nil }
118   -
119   - return headers[index].value
120   - }
121   -
122   - /// Case-insensitively access the header with the given name.
123   - ///
124   - /// - Parameter name: The name of the header.
125   - public subscript(_ name: String) -> String? {
126   - get { value(for: name) }
127   - set {
128   - if let value = newValue {
129   - update(name: name, value: value)
130   - } else {
131   - remove(name: name)
132   - }
133   - }
134   - }
135   -
136   - /// The dictionary representation of all headers.
137   - ///
138   - /// This representation does not preserve the current order of the instance.
139   - public var dictionary: [String: String] {
140   - let namesAndValues = headers.map { ($0.name, $0.value) }
141   -
142   - return Dictionary(namesAndValues, uniquingKeysWith: { _, last in last })
143   - }
144   -}
145   -
146   -extension HTTPHeaders: ExpressibleByDictionaryLiteral {
147   - public init(dictionaryLiteral elements: (String, String)...) {
148   - self.init()
149   -
150   - elements.forEach { update(name: $0.0, value: $0.1) }
151   - }
152   -}
153   -
154   -extension HTTPHeaders: ExpressibleByArrayLiteral {
155   - public init(arrayLiteral elements: HTTPHeader...) {
156   - self.init(elements)
157   - }
158   -}
159   -
160   -extension HTTPHeaders: Sequence {
161   - public func makeIterator() -> IndexingIterator<[HTTPHeader]> {
162   - headers.makeIterator()
163   - }
164   -}
165   -
166   -extension HTTPHeaders: Collection {
167   - public var startIndex: Int {
168   - headers.startIndex
169   - }
170   -
171   - public var endIndex: Int {
172   - headers.endIndex
173   - }
174   -
175   - public subscript(position: Int) -> HTTPHeader {
176   - headers[position]
177   - }
178   -
179   - public func index(after i: Int) -> Int {
180   - headers.index(after: i)
181   - }
182   -}
183   -
184   -extension HTTPHeaders: CustomStringConvertible {
185   - public var description: String {
186   - headers.map(\.description)
187   - .joined(separator: "\n")
188   - }
189   -}
190   -
191   -// MARK: - HTTPHeader
192   -
193   -/// A representation of a single HTTP header's name / value pair.
194   -public struct HTTPHeader: Hashable {
195   - /// Name of the header.
196   - public let name: String
197   -
198   - /// Value of the header.
199   - public let value: String
200   -
201   - /// Creates an instance from the given `name` and `value`.
202   - ///
203   - /// - Parameters:
204   - /// - name: The name of the header.
205   - /// - value: The value of the header.
206   - public init(name: String, value: String) {
207   - self.name = name
208   - self.value = value
209   - }
210   -}
211   -
212   -extension HTTPHeader: CustomStringConvertible {
213   - public var description: String {
214   - "\(name): \(value)"
215   - }
216   -}
217   -
218   -extension HTTPHeader {
219   - /// Returns an `Accept` header.
220   - ///
221   - /// - Parameter value: The `Accept` value.
222   - /// - Returns: The header.
223   - public static func accept(_ value: String) -> HTTPHeader {
224   - HTTPHeader(name: "Accept", value: value)
225   - }
226   -
227   - /// Returns an `Accept-Charset` header.
228   - ///
229   - /// - Parameter value: The `Accept-Charset` value.
230   - /// - Returns: The header.
231   - public static func acceptCharset(_ value: String) -> HTTPHeader {
232   - HTTPHeader(name: "Accept-Charset", value: value)
233   - }
234   -
235   - /// Returns an `Accept-Language` header.
236   - ///
237   - /// Alamofire offers a default Accept-Language header that accumulates and encodes the system's preferred languages.
238   - /// Use `HTTPHeader.defaultAcceptLanguage`.
239   - ///
240   - /// - Parameter value: The `Accept-Language` value.
241   - ///
242   - /// - Returns: The header.
243   - public static func acceptLanguage(_ value: String) -> HTTPHeader {
244   - HTTPHeader(name: "Accept-Language", value: value)
245   - }
246   -
247   - /// Returns an `Accept-Encoding` header.
248   - ///
249   - /// Alamofire offers a default accept encoding value that provides the most common values. Use
250   - /// `HTTPHeader.defaultAcceptEncoding`.
251   - ///
252   - /// - Parameter value: The `Accept-Encoding` value.
253   - ///
254   - /// - Returns: The header
255   - public static func acceptEncoding(_ value: String) -> HTTPHeader {
256   - HTTPHeader(name: "Accept-Encoding", value: value)
257   - }
258   -
259   - /// Returns a `Basic` `Authorization` header using the `username` and `password` provided.
260   - ///
261   - /// - Parameters:
262   - /// - username: The username of the header.
263   - /// - password: The password of the header.
264   - ///
265   - /// - Returns: The header.
266   - public static func authorization(username: String, password: String) -> HTTPHeader {
267   - let credential = Data("\(username):\(password)".utf8).base64EncodedString()
268   -
269   - return authorization("Basic \(credential)")
270   - }
271   -
272   - /// Returns a `Bearer` `Authorization` header using the `bearerToken` provided
273   - ///
274   - /// - Parameter bearerToken: The bearer token.
275   - ///
276   - /// - Returns: The header.
277   - public static func authorization(bearerToken: String) -> HTTPHeader {
278   - authorization("Bearer \(bearerToken)")
279   - }
280   -
281   - /// Returns an `Authorization` header.
282   - ///
283   - /// Alamofire provides built-in methods to produce `Authorization` headers. For a Basic `Authorization` header use
284   - /// `HTTPHeader.authorization(username:password:)`. For a Bearer `Authorization` header, use
285   - /// `HTTPHeader.authorization(bearerToken:)`.
286   - ///
287   - /// - Parameter value: The `Authorization` value.
288   - ///
289   - /// - Returns: The header.
290   - public static func authorization(_ value: String) -> HTTPHeader {
291   - HTTPHeader(name: "Authorization", value: value)
292   - }
293   -
294   - /// Returns a `Content-Disposition` header.
295   - ///
296   - /// - Parameter value: The `Content-Disposition` value.
297   - ///
298   - /// - Returns: The header.
299   - public static func contentDisposition(_ value: String) -> HTTPHeader {
300   - HTTPHeader(name: "Content-Disposition", value: value)
301   - }
302   -
303   - /// Returns a `Content-Encoding` header.
304   - ///
305   - /// - Parameter value: The `Content-Encoding`.
306   - ///
307   - /// - Returns: The header.
308   - public static func contentEncoding(_ value: String) -> HTTPHeader {
309   - HTTPHeader(name: "Content-Encoding", value: value)
310   - }
311   -
312   - /// Returns a `Content-Type` header.
313   - ///
314   - /// All Alamofire `ParameterEncoding`s and `ParameterEncoder`s set the `Content-Type` of the request, so it may not
315   - /// be necessary to manually set this value.
316   - ///
317   - /// - Parameter value: The `Content-Type` value.
318   - ///
319   - /// - Returns: The header.
320   - public static func contentType(_ value: String) -> HTTPHeader {
321   - HTTPHeader(name: "Content-Type", value: value)
322   - }
323   -
324   - /// Returns a `User-Agent` header.
325   - ///
326   - /// - Parameter value: The `User-Agent` value.
327   - ///
328   - /// - Returns: The header.
329   - public static func userAgent(_ value: String) -> HTTPHeader {
330   - HTTPHeader(name: "User-Agent", value: value)
331   - }
332   -}
333   -
334   -extension Array where Element == HTTPHeader {
335   - /// Case-insensitively finds the index of an `HTTPHeader` with the provided name, if it exists.
336   - func index(of name: String) -> Int? {
337   - let lowercasedName = name.lowercased()
338   - return firstIndex { $0.name.lowercased() == lowercasedName }
339   - }
340   -}
341   -
342   -// MARK: - Defaults
343   -
344   -extension HTTPHeaders {
345   - /// The default set of `HTTPHeaders` used by Alamofire. Includes `Accept-Encoding`, `Accept-Language`, and
346   - /// `User-Agent`.
347   - public static let `default`: HTTPHeaders = [.defaultAcceptEncoding,
348   - .defaultAcceptLanguage,
349   - .defaultUserAgent]
350   -}
351   -
352   -extension HTTPHeader {
353   - /// Returns Alamofire's default `Accept-Encoding` header, appropriate for the encodings supported by particular OS
354   - /// versions.
355   - ///
356   - /// See the [Accept-Encoding HTTP header documentation](https://tools.ietf.org/html/rfc7230#section-4.2.3) .
357   - public static let defaultAcceptEncoding: HTTPHeader = {
358   - let encodings: [String]
359   - if #available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *) {
360   - encodings = ["br", "gzip", "deflate"]
361   - } else {
362   - encodings = ["gzip", "deflate"]
363   - }
364   -
365   - return .acceptEncoding(encodings.qualityEncoded())
366   - }()
367   -
368   - /// Returns Alamofire's default `Accept-Language` header, generated by querying `Locale` for the user's
369   - /// `preferredLanguages`.
370   - ///
371   - /// See the [Accept-Language HTTP header documentation](https://tools.ietf.org/html/rfc7231#section-5.3.5).
372   - public static let defaultAcceptLanguage: HTTPHeader = .acceptLanguage(Locale.preferredLanguages.prefix(6).qualityEncoded())
373   -
374   - /// Returns Alamofire's default `User-Agent` header.
375   - ///
376   - /// See the [User-Agent header documentation](https://tools.ietf.org/html/rfc7231#section-5.5.3).
377   - ///
378   - /// Example: `iOS Example/1.0 (org.alamofire.iOS-Example; build:1; iOS 13.0.0) Alamofire/5.0.0`
379   - public static let defaultUserAgent: HTTPHeader = {
380   - let info = Bundle.main.infoDictionary
381   - let executable = (info?["CFBundleExecutable"] as? String) ??
382   - (ProcessInfo.processInfo.arguments.first?.split(separator: "/").last.map(String.init)) ??
383   - "Unknown"
384   - let bundle = info?["CFBundleIdentifier"] as? String ?? "Unknown"
385   - let appVersion = info?["CFBundleShortVersionString"] as? String ?? "Unknown"
386   - let appBuild = info?["CFBundleVersion"] as? String ?? "Unknown"
387   -
388   - let osNameVersion: String = {
389   - let version = ProcessInfo.processInfo.operatingSystemVersion
390   - let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)"
391   - let osName: String = {
392   - #if os(iOS)
393   - #if targetEnvironment(macCatalyst)
394   - return "macOS(Catalyst)"
395   - #else
396   - return "iOS"
397   - #endif
398   - #elseif os(watchOS)
399   - return "watchOS"
400   - #elseif os(tvOS)
401   - return "tvOS"
402   - #elseif os(macOS)
403   - return "macOS"
404   - #elseif os(Linux)
405   - return "Linux"
406   - #elseif os(Windows)
407   - return "Windows"
408   - #else
409   - return "Unknown"
410   - #endif
411   - }()
412   -
413   - return "\(osName) \(versionString)"
414   - }()
415   -
416   - let alamofireVersion = "Alamofire/\(version)"
417   -
418   - let userAgent = "\(executable)/\(appVersion) (\(bundle); build:\(appBuild); \(osNameVersion)) \(alamofireVersion)"
419   -
420   - return .userAgent(userAgent)
421   - }()
422   -}
423   -
424   -extension Collection where Element == String {
425   - func qualityEncoded() -> String {
426   - enumerated().map { index, encoding in
427   - let quality = 1.0 - (Double(index) * 0.1)
428   - return "\(encoding);q=\(quality)"
429   - }.joined(separator: ", ")
430   - }
431   -}
432   -
433   -// MARK: - System Type Extensions
434   -
435   -extension URLRequest {
436   - /// Returns `allHTTPHeaderFields` as `HTTPHeaders`.
437   - public var headers: HTTPHeaders {
438   - get { allHTTPHeaderFields.map(HTTPHeaders.init) ?? HTTPHeaders() }
439   - set { allHTTPHeaderFields = newValue.dictionary }
440   - }
441   -}
442   -
443   -extension HTTPURLResponse {
444   - /// Returns `allHeaderFields` as `HTTPHeaders`.
445   - public var headers: HTTPHeaders {
446   - (allHeaderFields as? [String: String]).map(HTTPHeaders.init) ?? HTTPHeaders()
447   - }
448   -}
449   -
450   -extension URLSessionConfiguration {
451   - /// Returns `httpAdditionalHeaders` as `HTTPHeaders`.
452   - public var headers: HTTPHeaders {
453   - get { (httpAdditionalHeaders as? [String: String]).map(HTTPHeaders.init) ?? HTTPHeaders() }
454   - set { httpAdditionalHeaders = newValue.dictionary }
455   - }
456   -}
Pods/Alamofire/Source/HTTPMethod.swift deleted 100644 → 0
1   -//
2   -// HTTPMethod.swift
3   -//
4   -// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5   -//
6   -// Permission is hereby granted, free of charge, to any person obtaining a copy
7   -// of this software and associated documentation files (the "Software"), to deal
8   -// in the Software without restriction, including without limitation the rights
9   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -// copies of the Software, and to permit persons to whom the Software is
11   -// furnished to do so, subject to the following conditions:
12   -//
13   -// The above copyright notice and this permission notice shall be included in
14   -// all copies or substantial portions of the Software.
15   -//
16   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -// THE SOFTWARE.
23   -//
24   -
25   -/// Type representing HTTP methods. Raw `String` value is stored and compared case-sensitively, so
26   -/// `HTTPMethod.get != HTTPMethod(rawValue: "get")`.
27   -///
28   -/// See https://tools.ietf.org/html/rfc7231#section-4.3
29   -public struct HTTPMethod: RawRepresentable, Equatable, Hashable {
30   - /// `CONNECT` method.
31   - public static let connect = HTTPMethod(rawValue: "CONNECT")
32   - /// `DELETE` method.
33   - public static let delete = HTTPMethod(rawValue: "DELETE")
34   - /// `GET` method.
35   - public static let get = HTTPMethod(rawValue: "GET")
36   - /// `HEAD` method.
37   - public static let head = HTTPMethod(rawValue: "HEAD")
38   - /// `OPTIONS` method.
39   - public static let options = HTTPMethod(rawValue: "OPTIONS")
40   - /// `PATCH` method.
41   - public static let patch = HTTPMethod(rawValue: "PATCH")
42   - /// `POST` method.
43   - public static let post = HTTPMethod(rawValue: "POST")
44   - /// `PUT` method.
45   - public static let put = HTTPMethod(rawValue: "PUT")
46   - /// `QUERY` method.
47   - public static let query = HTTPMethod(rawValue: "QUERY")
48   - /// `TRACE` method.
49   - public static let trace = HTTPMethod(rawValue: "TRACE")
50   -
51   - public let rawValue: String
52   -
53   - public init(rawValue: String) {
54   - self.rawValue = rawValue
55   - }
56   -}