|
|
@@ -32,10 +32,9 @@ public protocol ResponseSerializer {
|
|
|
typealias SerializedObject
|
|
|
|
|
|
/**
|
|
|
- A closure used by response handlers that takes a request, response, and data and returns a serialized object and
|
|
|
- any error that occured in the process.
|
|
|
+ A closure used by response handlers that takes a request, response, and data and returns a result.
|
|
|
*/
|
|
|
- var serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> (SerializedObject?, NSError?) { get }
|
|
|
+ var serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> Result<SerializedObject> { get }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -46,10 +45,9 @@ public struct GenericResponseSerializer<T>: ResponseSerializer {
|
|
|
public typealias SerializedObject = T
|
|
|
|
|
|
/**
|
|
|
- A closure used by response handlers that takes a request, response, and data and returns a serialized object and
|
|
|
- any error that occured in the process.
|
|
|
+ A closure used by response handlers that takes a request, response, and data and returns a result.
|
|
|
*/
|
|
|
- public var serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> (SerializedObject?, NSError?)
|
|
|
+ public var serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> Result<SerializedObject>
|
|
|
|
|
|
/**
|
|
|
Initializes the `GenericResponseSerializer` instance with the given serialize response closure.
|
|
|
@@ -58,7 +56,7 @@ public struct GenericResponseSerializer<T>: ResponseSerializer {
|
|
|
|
|
|
- returns: The new generic response serializer instance.
|
|
|
*/
|
|
|
- public init(serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> (SerializedObject?, NSError?)) {
|
|
|
+ public init(serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> Result<SerializedObject>) {
|
|
|
self.serializeResponse = serializeResponse
|
|
|
}
|
|
|
}
|
|
|
@@ -67,6 +65,28 @@ public struct GenericResponseSerializer<T>: ResponseSerializer {
|
|
|
|
|
|
extension Request {
|
|
|
|
|
|
+ /**
|
|
|
+ Adds a handler to be called once the request has finished.
|
|
|
+
|
|
|
+ - parameter queue: The queue on which the completion handler is dispatched.
|
|
|
+ - parameter completionHandler: The code to be executed once the request has finished.
|
|
|
+
|
|
|
+ - returns: The request.
|
|
|
+ */
|
|
|
+ public func response(
|
|
|
+ queue: dispatch_queue_t? = nil,
|
|
|
+ completionHandler: (NSURLRequest?, NSHTTPURLResponse?, NSData?, NSError?) -> Void)
|
|
|
+ -> Self
|
|
|
+ {
|
|
|
+ delegate.queue.addOperationWithBlock {
|
|
|
+ dispatch_async(queue ?? dispatch_get_main_queue()) {
|
|
|
+ completionHandler(self.request, self.response, self.delegate.data, self.delegate.error)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return self
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
Adds a handler to be called once the request has finished.
|
|
|
|
|
|
@@ -80,17 +100,18 @@ extension Request {
|
|
|
public func response<T: ResponseSerializer, V where T.SerializedObject == V>(
|
|
|
queue: dispatch_queue_t? = nil,
|
|
|
responseSerializer: T,
|
|
|
- completionHandler: (NSURLRequest?, NSHTTPURLResponse?, V?, NSError?) -> Void)
|
|
|
+ completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<V>) -> Void)
|
|
|
-> Self
|
|
|
{
|
|
|
delegate.queue.addOperationWithBlock {
|
|
|
- let result: V?
|
|
|
- let error: NSError?
|
|
|
+ var result = responseSerializer.serializeResponse(self.request, self.response, self.delegate.data)
|
|
|
|
|
|
- (result, error) = responseSerializer.serializeResponse(self.request, self.response, self.delegate.data)
|
|
|
+ if let error = self.delegate.error {
|
|
|
+ result = .Failure(self.delegate.data, error)
|
|
|
+ }
|
|
|
|
|
|
dispatch_async(queue ?? dispatch_get_main_queue()) {
|
|
|
- completionHandler(self.request, self.response, result, self.delegate.error ?? error)
|
|
|
+ completionHandler(self.request, self.response, result)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -109,7 +130,13 @@ extension Request {
|
|
|
*/
|
|
|
public static func dataResponseSerializer() -> GenericResponseSerializer<NSData> {
|
|
|
return GenericResponseSerializer { request, response, data in
|
|
|
- return (data, nil)
|
|
|
+ guard let validData = data else {
|
|
|
+ let failureReason = "Data could not be serialized. Input data was nil."
|
|
|
+ let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason)
|
|
|
+ return .Failure(data, error)
|
|
|
+ }
|
|
|
+
|
|
|
+ return .Success(validData)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -120,7 +147,7 @@ extension Request {
|
|
|
|
|
|
- returns: The request.
|
|
|
*/
|
|
|
- public func response(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, NSData?, NSError?) -> Void) -> Self {
|
|
|
+ public func responseData(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<NSData>) -> Void) -> Self {
|
|
|
return response(responseSerializer: Request.dataResponseSerializer(), completionHandler: completionHandler)
|
|
|
}
|
|
|
}
|
|
|
@@ -143,8 +170,10 @@ extension Request {
|
|
|
-> GenericResponseSerializer<String>
|
|
|
{
|
|
|
return GenericResponseSerializer { _, response, data in
|
|
|
- guard let data = data where data.length > 0 else {
|
|
|
- return (nil, nil)
|
|
|
+ guard let validData = data where validData.length > 0 else {
|
|
|
+ let failureReason = "String could not be serialized. Input data was nil or contained zero bytes."
|
|
|
+ let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason)
|
|
|
+ return .Failure(data, error)
|
|
|
}
|
|
|
|
|
|
if let encodingName = response?.textEncodingName where encoding == nil {
|
|
|
@@ -153,9 +182,15 @@ extension Request {
|
|
|
)
|
|
|
}
|
|
|
|
|
|
- let string = NSString(data: data, encoding: encoding ?? NSISOLatin1StringEncoding) as? String
|
|
|
+ let actualEncoding = encoding ?? NSISOLatin1StringEncoding
|
|
|
|
|
|
- return (string, nil)
|
|
|
+ if let string = NSString(data: validData, encoding: actualEncoding) as? String {
|
|
|
+ return .Success(string)
|
|
|
+ } else {
|
|
|
+ let failureReason = "String could not be serialized with encoding: \(actualEncoding)"
|
|
|
+ let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason)
|
|
|
+ return .Failure(data, error)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -165,16 +200,15 @@ extension Request {
|
|
|
- parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the
|
|
|
server response, falling back to the default HTTP default character set,
|
|
|
ISO-8859-1.
|
|
|
- - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4
|
|
|
- arguments: the URL request, the URL response, if one was received, the string,
|
|
|
- if one could be created from the URL response and data, and any error produced
|
|
|
- while creating the string.
|
|
|
+ - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 3
|
|
|
+ arguments: the URL request, the URL response and the result produced while
|
|
|
+ creating the string.
|
|
|
|
|
|
- returns: The request.
|
|
|
*/
|
|
|
public func responseString(
|
|
|
encoding encoding: NSStringEncoding? = nil,
|
|
|
- completionHandler: (NSURLRequest?, NSHTTPURLResponse?, String?, NSError?) -> Void)
|
|
|
+ completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<String>) -> Void)
|
|
|
-> Self
|
|
|
{
|
|
|
return response(
|
|
|
@@ -201,20 +235,18 @@ extension Request {
|
|
|
-> GenericResponseSerializer<AnyObject>
|
|
|
{
|
|
|
return GenericResponseSerializer { request, response, data in
|
|
|
- guard let data = data where data.length > 0 else {
|
|
|
- return (nil, nil)
|
|
|
+ guard let validData = data where validData.length > 0 else {
|
|
|
+ let failureReason = "JSON could not be serialized. Input data was nil or contained zero bytes."
|
|
|
+ let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason)
|
|
|
+ return .Failure(data, error)
|
|
|
}
|
|
|
|
|
|
- var JSON: AnyObject?
|
|
|
- var serializationError: NSError?
|
|
|
-
|
|
|
do {
|
|
|
- JSON = try NSJSONSerialization.JSONObjectWithData(data, options: options)
|
|
|
+ let JSON = try NSJSONSerialization.JSONObjectWithData(validData, options: options)
|
|
|
+ return .Success(JSON)
|
|
|
} catch {
|
|
|
- serializationError = error as NSError
|
|
|
+ return .Failure(data, error as NSError)
|
|
|
}
|
|
|
-
|
|
|
- return (JSON, serializationError)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -222,16 +254,15 @@ extension Request {
|
|
|
Adds a handler to be called once the request has finished.
|
|
|
|
|
|
- parameter options: The JSON serialization reading options. `.AllowFragments` by default.
|
|
|
- - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4
|
|
|
- arguments: the URL request, the URL response, if one was received, the JSON
|
|
|
- object, if one could be created from the URL response and data, and any error
|
|
|
- produced while creating the JSON object.
|
|
|
+ - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 3
|
|
|
+ arguments: the URL request, the URL response and the result produced while
|
|
|
+ creating the JSON object.
|
|
|
|
|
|
- returns: The request.
|
|
|
*/
|
|
|
public func responseJSON(
|
|
|
options options: NSJSONReadingOptions = .AllowFragments,
|
|
|
- completionHandler: (NSURLRequest?, NSHTTPURLResponse?, AnyObject?, NSError?) -> Void)
|
|
|
+ completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<AnyObject>) -> Void)
|
|
|
-> Self
|
|
|
{
|
|
|
return response(
|
|
|
@@ -249,7 +280,7 @@ extension Request {
|
|
|
Creates a response serializer that returns an object constructed from the response data using
|
|
|
`NSPropertyListSerialization` with the specified reading options.
|
|
|
|
|
|
- - parameter options: The property list reading options. `0` by default.
|
|
|
+ - parameter options: The property list reading options. `NSPropertyListReadOptions()` by default.
|
|
|
|
|
|
- returns: A property list object response serializer.
|
|
|
*/
|
|
|
@@ -258,20 +289,18 @@ extension Request {
|
|
|
-> GenericResponseSerializer<AnyObject>
|
|
|
{
|
|
|
return GenericResponseSerializer { request, response, data in
|
|
|
- guard let data = data where data.length > 0 else {
|
|
|
- return (nil, nil)
|
|
|
+ guard let validData = data where validData.length > 0 else {
|
|
|
+ let failureReason = "Property list could not be serialized. Input data was nil or contained zero bytes."
|
|
|
+ let error = Error.errorWithCode(.PropertyListSerializationFailed, failureReason: failureReason)
|
|
|
+ return .Failure(data, error)
|
|
|
}
|
|
|
|
|
|
- var plist: AnyObject?
|
|
|
- var propertyListSerializationError: NSError?
|
|
|
-
|
|
|
do {
|
|
|
- plist = try NSPropertyListSerialization.propertyListWithData(data, options: options, format: nil)
|
|
|
+ let plist = try NSPropertyListSerialization.propertyListWithData(validData, options: options, format: nil)
|
|
|
+ return .Success(plist)
|
|
|
} catch {
|
|
|
- propertyListSerializationError = error as NSError
|
|
|
+ return .Failure(data, error as NSError)
|
|
|
}
|
|
|
-
|
|
|
- return (plist, propertyListSerializationError)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -279,16 +308,15 @@ extension Request {
|
|
|
Adds a handler to be called once the request has finished.
|
|
|
|
|
|
- parameter options: The property list reading options. `0` by default.
|
|
|
- - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4
|
|
|
- arguments: the URL request, the URL response, if one was received, the property
|
|
|
- list, if one could be created from the URL response and data, and any error
|
|
|
- produced while creating the property list.
|
|
|
+ - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 3
|
|
|
+ arguments: the URL request, the URL response and the result produced while
|
|
|
+ creating the property list.
|
|
|
|
|
|
- returns: The request.
|
|
|
*/
|
|
|
public func responsePropertyList(
|
|
|
options options: NSPropertyListReadOptions = NSPropertyListReadOptions(),
|
|
|
- completionHandler: (NSURLRequest?, NSHTTPURLResponse?, AnyObject?, NSError?) -> Void)
|
|
|
+ completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<AnyObject>) -> Void)
|
|
|
-> Self
|
|
|
{
|
|
|
return response(
|