2015-09-18 15:02:15 -07:00
// AFURLRequestSerialization.h
2017-03-09 20:10:44 -08:00
// Copyright (c) 2011– 2016 Alamofire Software Foundation ( http://alamofire.org/ )
2015-09-18 15:02:15 -07:00
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
# import <Foundation / Foundation.h>
2017-03-09 20:10:44 -08:00
# import <TargetConditionals.h>
# if TARGET_OS_IOS || TARGET_OS_TV
2015-09-18 15:02:15 -07:00
# import <UIKit / UIKit.h>
# elif TARGET_OS_WATCH
# import <WatchKit / WatchKit.h>
# endif
NS_ASSUME_NONNULL_BEGIN
2017-03-09 20:10:44 -08:00
/**
Returns a percent - escaped string following RFC 3986 for a query string key or value .
RFC 3986 states that the following characters are " reserved " characters .
- General Delimiters : " : " , " # " , " [ " , " ] " , " @ " , " ? " , " / "
- Sub - Delimiters : " ! " , " $ " , " & " , " ' " , " ( " , " ) " , " * " , " + " , " , " , " ; " , " = "
In RFC 3986 - Section 3.4 , it states that the " ? " and " / " characters should not be escaped to allow
query strings to include a URL . Therefore , all " reserved " characters with the exception of " ? " and " / "
should be percent - escaped in the query string .
@ param string The string to be percent - escaped .
@ return The percent - escaped string .
*/
FOUNDATION_EXPORT NSString * AFPercentEscapedStringFromString ( NSString * string ) ;
/**
A helper method to generate encoded url query parameters for appending to the end of a URL .
@ param parameters A dictionary of key / values to be encoded .
@ return A url encoded query string
*/
FOUNDATION_EXPORT NSString * AFQueryStringFromParameters ( NSDictionary * parameters ) ;
2015-09-18 15:02:15 -07:00
/**
The ` AFURLRequestSerialization ` protocol is adopted by an object that encodes parameters for a specified HTTP requests . Request serializers may encode parameters as query strings , HTTP bodies , setting the appropriate HTTP header fields as necessary .
For example , a JSON request serializer may set the HTTP body of the request to a JSON representation , and set the ` Content - Type ` HTTP header field value to ` application / json ` .
*/
@ protocol AFURLRequestSerialization < NSObject , NSSecureCoding , NSCopying >
/**
Returns a request with the specified parameters encoded into a copy of the original request .
@ param request The original request .
@ param parameters The parameters to be encoded .
@ param error The error that occurred while attempting to encode the request parameters .
@ return A serialized request .
*/
- ( nullable NSURLRequest * ) requestBySerializingRequest : ( NSURLRequest * ) request
withParameters : ( nullable id ) parameters
2017-03-09 20:10:44 -08:00
error : ( NSError * _Nullable __autoreleasing * ) error NS_SWIFT_NOTHROW ;
2015-09-18 15:02:15 -07:00
@ end
# pragma mark -
/**
*/
typedef NS_ENUM ( NSUInteger , AFHTTPRequestQueryStringSerializationStyle ) {
AFHTTPRequestQueryStringDefaultStyle = 0 ,
} ;
@ protocol AFMultipartFormData ;
/**
` AFHTTPRequestSerializer ` conforms to the ` AFURLRequestSerialization ` & ` AFURLResponseSerialization ` protocols , offering a concrete base implementation of query string / URL form - encoded parameter serialization and default request headers , as well as response status code and content type validation .
Any request or response serializer dealing with HTTP is encouraged to subclass ` AFHTTPRequestSerializer ` in order to ensure consistent default behavior .
*/
@ interface AFHTTPRequestSerializer : NSObject < AFURLRequestSerialization >
/**
The string encoding used to serialize parameters . ` NSUTF8StringEncoding ` by default .
*/
@ property ( nonatomic , assign ) NSStringEncoding stringEncoding ;
/**
Whether created requests can use the device ’ s cellular radio ( if present ) . ` YES ` by default .
@ see NSMutableURLRequest - setAllowsCellularAccess :
*/
@ property ( nonatomic , assign ) BOOL allowsCellularAccess ;
/**
The cache policy of created requests . ` NSURLRequestUseProtocolCachePolicy ` by default .
@ see NSMutableURLRequest - setCachePolicy :
*/
@ property ( nonatomic , assign ) NSURLRequestCachePolicy cachePolicy ;
/**
Whether created requests should use the default cookie handling . ` YES ` by default .
@ see NSMutableURLRequest - setHTTPShouldHandleCookies :
*/
@ property ( nonatomic , assign ) BOOL HTTPShouldHandleCookies ;
/**
Whether created requests can continue transmitting data before receiving a response from an earlier transmission . ` NO ` by default
@ see NSMutableURLRequest - setHTTPShouldUsePipelining :
*/
@ property ( nonatomic , assign ) BOOL HTTPShouldUsePipelining ;
/**
The network service type for created requests . ` NSURLNetworkServiceTypeDefault ` by default .
@ see NSMutableURLRequest - setNetworkServiceType :
*/
@ property ( nonatomic , assign ) NSURLRequestNetworkServiceType networkServiceType ;
/**
The timeout interval , in seconds , for created requests . The default timeout interval is 60 seconds .
@ see NSMutableURLRequest - setTimeoutInterval :
*/
@ property ( nonatomic , assign ) NSTimeInterval timeoutInterval ;
///---------------------------------------
/// @name Configuring HTTP Request Headers
///---------------------------------------
/**
Default HTTP header field values to be applied to serialized requests . By default , these include the following :
- ` Accept - Language ` with the contents of ` NSLocale + preferredLanguages `
- ` User - Agent ` with the contents of various bundle identifiers and OS designations
@ discussion To add or remove default request headers , use ` setValue : forHTTPHeaderField : ` .
*/
2017-03-09 20:10:44 -08:00
@ property ( readonly , nonatomic , strong ) NSDictionary < NSString * , NSString * > * HTTPRequestHeaders ;
2015-09-18 15:02:15 -07:00
/**
Creates and returns a serializer with default configuration .
*/
+ ( instancetype ) serializer ;
/**
Sets the value for the HTTP headers set in request objects made by the HTTP client . If ` nil ` , removes the existing value for that header .
@ param field The HTTP header to set a default value for
@ param value The value set as default for the specified header , or ` nil `
*/
- ( void ) setValue : ( nullable NSString * ) value
forHTTPHeaderField : ( NSString * ) field ;
/**
Returns the value for the HTTP headers set in the request serializer .
@ param field The HTTP header to retrieve the default value for
@ return The value set as default for the specified header , or ` nil `
*/
- ( nullable NSString * ) valueForHTTPHeaderField : ( NSString * ) field ;
/**
Sets the " Authorization " HTTP header set in request objects made by the HTTP client to a basic authentication value with Base64 - encoded username and password . This overwrites any existing value for this header .
@ param username The HTTP basic auth username
@ param password The HTTP basic auth password
*/
- ( void ) setAuthorizationHeaderFieldWithUsername : ( NSString * ) username
password : ( NSString * ) password ;
/**
Clears any existing value for the " Authorization " HTTP header .
*/
- ( void ) clearAuthorizationHeader ;
///-------------------------------------------------------
/// @name Configuring Query String Parameter Serialization
///-------------------------------------------------------
/**
HTTP methods for which serialized requests will encode parameters as a query string . ` GET ` , ` HEAD ` , and ` DELETE ` by default .
*/
2017-03-09 20:10:44 -08:00
@ property ( nonatomic , strong ) NSSet < NSString * > * HTTPMethodsEncodingParametersInURI ;
2015-09-18 15:02:15 -07:00
/**
Set the method of query string serialization according to one of the pre - defined styles .
@ param style The serialization style .
@ see AFHTTPRequestQueryStringSerializationStyle
*/
- ( void ) setQueryStringSerializationWithStyle : ( AFHTTPRequestQueryStringSerializationStyle ) style ;
/**
Set the a custom method of query string serialization according to the specified block .
@ param block A block that defines a process of encoding parameters into a query string . This block returns the query string and takes three arguments : the request , the parameters to encode , and the error that occurred when attempting to encode parameters for the given request .
*/
- ( void ) setQueryStringSerializationWithBlock : ( nullable NSString * ( ^ ) ( NSURLRequest * request , id parameters , NSError * __autoreleasing * error ) ) block ;
///-------------------------------
/// @name Creating Request Objects
///-------------------------------
/**
Creates an ` NSMutableURLRequest ` object with the specified HTTP method and URL string .
If the HTTP method is ` GET ` , ` HEAD ` , or ` DELETE ` , the parameters will be used to construct a url - encoded query string that is appended to the request ' s URL . Otherwise , the parameters will be encoded according to the value of the ` parameterEncoding ` property , and set as the request body .
@ param method The HTTP method for the request , such as ` GET ` , ` POST ` , ` PUT ` , or ` DELETE ` . This parameter must not be ` nil ` .
@ param URLString The URL string used to create the request URL .
@ param parameters The parameters to be either set as a query string for ` GET ` requests , or the request HTTP body .
@ param error The error that occurred while constructing the request .
@ return An ` NSMutableURLRequest ` object .
*/
- ( NSMutableURLRequest * ) requestWithMethod : ( NSString * ) method
URLString : ( NSString * ) URLString
parameters : ( nullable id ) parameters
2017-03-09 20:10:44 -08:00
error : ( NSError * _Nullable __autoreleasing * ) error ;
2015-09-18 15:02:15 -07:00
/**
Creates an ` NSMutableURLRequest ` object with the specified HTTP method and URLString , and constructs a ` multipart / form - data ` HTTP body , using the specified parameters and multipart form data block . See http : //www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2
Multipart form requests are automatically streamed , reading files directly from disk along with in - memory data in a single HTTP body . The resulting ` NSMutableURLRequest ` object has an ` HTTPBodyStream ` property , so refrain from setting ` HTTPBodyStream ` or ` HTTPBody ` on this request object , as it will clear out the multipart form body stream .
@ param method The HTTP method for the request . This parameter must not be ` GET ` or ` HEAD ` , or ` nil ` .
@ param URLString The URL string used to create the request URL .
@ param parameters The parameters to be encoded and set in the request HTTP body .
@ param block A block that takes a single argument and appends data to the HTTP body . The block argument is an object adopting the ` AFMultipartFormData ` protocol .
@ param error The error that occurred while constructing the request .
@ return An ` NSMutableURLRequest ` object
*/
- ( NSMutableURLRequest * ) multipartFormRequestWithMethod : ( NSString * ) method
URLString : ( NSString * ) URLString
2017-03-09 20:10:44 -08:00
parameters : ( nullable NSDictionary < NSString * , id > * ) parameters
2015-09-18 15:02:15 -07:00
constructingBodyWithBlock : ( nullable void ( ^ ) ( id < AFMultipartFormData > formData ) ) block
2017-03-09 20:10:44 -08:00
error : ( NSError * _Nullable __autoreleasing * ) error ;
2015-09-18 15:02:15 -07:00
/**
Creates an ` NSMutableURLRequest ` by removing the ` HTTPBodyStream ` from a request , and asynchronously writing its contents into the specified file , invoking the completion handler when finished .
@ param request The multipart form request . The ` HTTPBodyStream ` property of ` request ` must not be ` nil ` .
@ param fileURL The file URL to write multipart form contents to .
@ param handler A handler block to execute .
@ discussion There is a bug in ` NSURLSessionTask ` that causes requests to not send a ` Content - Length ` header when streaming contents from an HTTP body , which is notably problematic when interacting with the Amazon S3 webservice . As a workaround , this method takes a request constructed with ` multipartFormRequestWithMethod : URLString : parameters : constructingBodyWithBlock : error : ` , or any other request with an ` HTTPBodyStream ` , writes the contents to the specified file and returns a copy of the original request with the ` HTTPBodyStream ` property set to ` nil ` . From here , the file can either be passed to ` AFURLSessionManager - uploadTaskWithRequest : fromFile : progress : completionHandler : ` , or have its contents read into an ` NSData ` that ' s assigned to the ` HTTPBody ` property of the request .
@ see https : //github.com/AFNetworking/AFNetworking/issues/1398
*/
- ( NSMutableURLRequest * ) requestWithMultipartFormRequest : ( NSURLRequest * ) request
writingStreamContentsToFile : ( NSURL * ) fileURL
2017-03-09 20:10:44 -08:00
completionHandler : ( nullable void ( ^ ) ( NSError * _Nullable error ) ) handler ;
2015-09-18 15:02:15 -07:00
@ end
# pragma mark -
/**
The ` AFMultipartFormData ` protocol defines the methods supported by the parameter in the block argument of ` AFHTTPRequestSerializer - multipartFormRequestWithMethod : URLString : parameters : constructingBodyWithBlock : ` .
*/
@ protocol AFMultipartFormData
/**
Appends the HTTP header ` Content - Disposition : file ; filename = # { generated filename } ; name = # { name } " ` and `Content-Type: #{generated mimeType}`, followed by the encoded file data and the multipart form boundary.
The filename and MIME type for this data in the form will be automatically generated , using the last path component of the ` fileURL ` and system associated MIME type for the ` fileURL ` extension , respectively .
@ param fileURL The URL corresponding to the file whose content will be appended to the form . This parameter must not be ` nil ` .
@ param name The name to be associated with the specified data . This parameter must not be ` nil ` .
@ param error If an error occurs , upon return contains an ` NSError ` object that describes the problem .
@ return ` YES ` if the file data was successfully appended , otherwise ` NO ` .
*/
- ( BOOL ) appendPartWithFileURL : ( NSURL * ) fileURL
name : ( NSString * ) name
2017-03-09 20:10:44 -08:00
error : ( NSError * _Nullable __autoreleasing * ) error ;
2015-09-18 15:02:15 -07:00
/**
Appends the HTTP header ` Content - Disposition : file ; filename = # { filename } ; name = # { name } " ` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary.
@ param fileURL The URL corresponding to the file whose content will be appended to the form . This parameter must not be ` nil ` .
@ param name The name to be associated with the specified data . This parameter must not be ` nil ` .
@ param fileName The file name to be used in the ` Content - Disposition ` header . This parameter must not be ` nil ` .
@ param mimeType The declared MIME type of the file data . This parameter must not be ` nil ` .
@ param error If an error occurs , upon return contains an ` NSError ` object that describes the problem .
@ return ` YES ` if the file data was successfully appended otherwise ` NO ` .
*/
- ( BOOL ) appendPartWithFileURL : ( NSURL * ) fileURL
name : ( NSString * ) name
fileName : ( NSString * ) fileName
mimeType : ( NSString * ) mimeType
2017-03-09 20:10:44 -08:00
error : ( NSError * _Nullable __autoreleasing * ) error ;
2015-09-18 15:02:15 -07:00
/**
Appends the HTTP header ` Content - Disposition : file ; filename = # { filename } ; name = # { name } " ` and `Content-Type: #{mimeType}`, followed by the data from the input stream and the multipart form boundary.
@ param inputStream The input stream to be appended to the form data
@ param name The name to be associated with the specified input stream . This parameter must not be ` nil ` .
@ param fileName The filename to be associated with the specified input stream . This parameter must not be ` nil ` .
@ param length The length of the specified input stream in bytes .
@ param mimeType The MIME type of the specified data . ( For example , the MIME type for a JPEG image is image / jpeg . ) For a list of valid MIME types , see http : //www.iana.org/assignments/media-types/. This parameter must not be `nil`.
*/
- ( void ) appendPartWithInputStream : ( nullable NSInputStream * ) inputStream
name : ( NSString * ) name
fileName : ( NSString * ) fileName
length : ( int64_t ) length
mimeType : ( NSString * ) mimeType ;
/**
Appends the HTTP header ` Content - Disposition : file ; filename = # { filename } ; name = # { name } " ` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary.
@ param data The data to be encoded and appended to the form data .
@ param name The name to be associated with the specified data . This parameter must not be ` nil ` .
@ param fileName The filename to be associated with the specified data . This parameter must not be ` nil ` .
@ param mimeType The MIME type of the specified data . ( For example , the MIME type for a JPEG image is image / jpeg . ) For a list of valid MIME types , see http : //www.iana.org/assignments/media-types/. This parameter must not be `nil`.
*/
- ( void ) appendPartWithFileData : ( NSData * ) data
name : ( NSString * ) name
fileName : ( NSString * ) fileName
mimeType : ( NSString * ) mimeType ;
/**
Appends the HTTP headers ` Content - Disposition : form - data ; name = # { name } " `, followed by the encoded data and the multipart form boundary.
@ param data The data to be encoded and appended to the form data .
@ param name The name to be associated with the specified data . This parameter must not be ` nil ` .
*/
- ( void ) appendPartWithFormData : ( NSData * ) data
name : ( NSString * ) name ;
/**
Appends HTTP headers , followed by the encoded data and the multipart form boundary .
@ param headers The HTTP headers to be appended to the form data .
@ param body The data to be encoded and appended to the form data . This parameter must not be ` nil ` .
*/
2017-03-09 20:10:44 -08:00
- ( void ) appendPartWithHeaders : ( nullable NSDictionary < NSString * , NSString * > * ) headers
2015-09-18 15:02:15 -07:00
body : ( NSData * ) body ;
/**
Throttles request bandwidth by limiting the packet size and adding a delay for each chunk read from the upload stream .
When uploading over a 3 G or EDGE connection , requests may fail with " request body stream exhausted " . Setting a maximum packet size and delay according to the recommended values ( ` kAFUploadStream3GSuggestedPacketSize ` and ` kAFUploadStream3GSuggestedDelay ` ) lowers the risk of the input stream exceeding its allocated bandwidth . Unfortunately , there is no definite way to distinguish between a 3 G , EDGE , or LTE connection over ` NSURLConnection ` . As such , it is not recommended that you throttle bandwidth based solely on network reachability . Instead , you should consider checking for the " request body stream exhausted " in a failure block , and then retrying the request with throttled bandwidth .
@ param numberOfBytes Maximum packet size , in number of bytes . The default packet size for an input stream is 16 kb .
@ param delay Duration of delay each time a packet is read . By default , no delay is set .
*/
- ( void ) throttleBandwidthWithPacketSize : ( NSUInteger ) numberOfBytes
delay : ( NSTimeInterval ) delay ;
@ end
# pragma mark -
/**
` AFJSONRequestSerializer ` is a subclass of ` AFHTTPRequestSerializer ` that encodes parameters as JSON using ` NSJSONSerialization ` , setting the ` Content - Type ` of the encoded request to ` application / json ` .
*/
@ interface AFJSONRequestSerializer : AFHTTPRequestSerializer
/**
Options for writing the request JSON data from Foundation objects . For possible values , see the ` NSJSONSerialization ` documentation section " NSJSONWritingOptions " . ` 0 ` by default .
*/
@ property ( nonatomic , assign ) NSJSONWritingOptions writingOptions ;
/**
Creates and returns a JSON serializer with specified reading and writing options .
@ param writingOptions The specified JSON writing options .
*/
+ ( instancetype ) serializerWithWritingOptions : ( NSJSONWritingOptions ) writingOptions ;
@ end
# pragma mark -
/**
` AFPropertyListRequestSerializer ` is a subclass of ` AFHTTPRequestSerializer ` that encodes parameters as JSON using ` NSPropertyListSerializer ` , setting the ` Content - Type ` of the encoded request to ` application / x - plist ` .
*/
@ interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer
/**
The property list format . Possible values are described in " NSPropertyListFormat " .
*/
@ property ( nonatomic , assign ) NSPropertyListFormat format ;
/**
@ warning The ` writeOptions ` property is currently unused .
*/
@ property ( nonatomic , assign ) NSPropertyListWriteOptions writeOptions ;
/**
Creates and returns a property list serializer with a specified format , read options , and write options .
@ param format The property list format .
@ param writeOptions The property list write options .
@ warning The ` writeOptions ` property is currently unused .
*/
+ ( instancetype ) serializerWithFormat : ( NSPropertyListFormat ) format
writeOptions : ( NSPropertyListWriteOptions ) writeOptions ;
@ end
# pragma mark -
///----------------
/// @name Constants
///----------------
/**
# # Error Domains
The following error domain is predefined .
- ` NSString * const AFURLRequestSerializationErrorDomain `
# ## Constants
` AFURLRequestSerializationErrorDomain `
AFURLRequestSerializer errors . Error codes for ` AFURLRequestSerializationErrorDomain ` correspond to codes in ` NSURLErrorDomain ` .
*/
2017-03-09 20:10:44 -08:00
FOUNDATION_EXPORT NSString * const AFURLRequestSerializationErrorDomain ;
2015-09-18 15:02:15 -07:00
/**
# # User info dictionary keys
These keys may exist in the user info dictionary , in addition to those defined for NSError .
- ` NSString * const AFNetworkingOperationFailingURLRequestErrorKey `
# ## Constants
` AFNetworkingOperationFailingURLRequestErrorKey `
The corresponding value is an ` NSURLRequest ` containing the request of the operation associated with an error . This key is only present in the ` AFURLRequestSerializationErrorDomain ` .
*/
2017-03-09 20:10:44 -08:00
FOUNDATION_EXPORT NSString * const AFNetworkingOperationFailingURLRequestErrorKey ;
2015-09-18 15:02:15 -07:00
/**
# # Throttling Bandwidth for HTTP Request Input Streams
@ see - throttleBandwidthWithPacketSize : delay :
# ## Constants
` kAFUploadStream3GSuggestedPacketSize `
Maximum packet size , in number of bytes . Equal to 16 kb .
` kAFUploadStream3GSuggestedDelay `
Duration of delay each time a packet is read . Equal to 0.2 seconds .
*/
2017-03-09 20:10:44 -08:00
FOUNDATION_EXPORT NSUInteger const kAFUploadStream3GSuggestedPacketSize ;
FOUNDATION_EXPORT NSTimeInterval const kAFUploadStream3GSuggestedDelay ;
2015-09-18 15:02:15 -07:00
NS_ASSUME_NONNULL_END