From 94d8d7ebc2ea2bf48c483136a25ca0c1e09d032e Mon Sep 17 00:00:00 2001 From: Pocket7878 Date: Thu, 21 May 2015 17:15:18 +0900 Subject: [PATCH 1/2] Avoid parsing when status is 204. --- APIKit/API.swift | 30 ++++++++++++++++++++++-------- Cartfile.resolved | 4 ++-- Carthage/Checkouts/OHHTTPStubs | 2 +- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/APIKit/API.swift b/APIKit/API.swift index 1f178ece..8afcea32 100644 --- a/APIKit/API.swift +++ b/APIKit/API.swift @@ -96,17 +96,31 @@ public class API { return } - let mappedResponse: Result = self.responseBodyParser.parseData(data).flatMap { rawResponse in - if let response = T.responseFromObject(rawResponse) { - return .success(response) - } else { - let userInfo = [NSLocalizedDescriptionKey: "failed to create model object from raw object."] - let error = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo) - return .failure(error) + if statusCode == 204 { + let noContentResponse: Result = { + if let response = T.responseFromObject([:]) { + return .success(response) + } else { + let userInfo = [NSLocalizedDescriptionKey: "failed to create no content response."] + let error = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo) + return .failure(error) + } + }() + dispatch_async(mainQueue) { handler(noContentResponse) } + } else { + let mappedResponse: Result = self.responseBodyParser.parseData(data).flatMap { rawResponse in + if let response = T.responseFromObject(rawResponse) { + return .success(response) + } else { + let userInfo = [NSLocalizedDescriptionKey: "failed to create model object from raw object."] + let error = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo) + return .failure(error) + } } + + dispatch_async(mainQueue) { handler(mappedResponse) } } - dispatch_async(mainQueue) { handler(mappedResponse) } } task.resume() diff --git a/Cartfile.resolved b/Cartfile.resolved index eb5b1e55..5131ddfe 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,4 +1,4 @@ github "antitypical/Assertions" "1.1" github "robrix/Box" "1.2.2" -github "AliSoftware/OHHTTPStubs" "4.0.1" -github "antitypical/Result" "0.4.1" +github "AliSoftware/OHHTTPStubs" "4.0.2" +github "antitypical/Result" "0.4.3" diff --git a/Carthage/Checkouts/OHHTTPStubs b/Carthage/Checkouts/OHHTTPStubs index eadda22c..2e38ee3e 160000 --- a/Carthage/Checkouts/OHHTTPStubs +++ b/Carthage/Checkouts/OHHTTPStubs @@ -1 +1 @@ -Subproject commit eadda22ca4e47dcf160b95ba0d4b951898ed8a9d +Subproject commit 2e38ee3e7a3e1dd01be31edb94368c2f4a840915 From 48f37efbb3eaed53155a46df2747ed50ff11dc30 Mon Sep 17 00:00:00 2001 From: Pocket7878 Date: Sat, 23 May 2015 11:38:21 +0900 Subject: [PATCH 2/2] Handling empty data on .JSON parseData. --- APIKit/API.swift | 32 +++++++++----------------------- APIKit/ResponseBodyParser.swift | 3 +++ 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/APIKit/API.swift b/APIKit/API.swift index 8afcea32..ae20e196 100644 --- a/APIKit/API.swift +++ b/APIKit/API.swift @@ -96,31 +96,17 @@ public class API { return } - if statusCode == 204 { - let noContentResponse: Result = { - if let response = T.responseFromObject([:]) { - return .success(response) - } else { - let userInfo = [NSLocalizedDescriptionKey: "failed to create no content response."] - let error = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo) - return .failure(error) - } - }() - dispatch_async(mainQueue) { handler(noContentResponse) } - } else { - let mappedResponse: Result = self.responseBodyParser.parseData(data).flatMap { rawResponse in - if let response = T.responseFromObject(rawResponse) { - return .success(response) - } else { - let userInfo = [NSLocalizedDescriptionKey: "failed to create model object from raw object."] - let error = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo) - return .failure(error) - } + let mappedResponse: Result = self.responseBodyParser.parseData(data).flatMap { rawResponse in + if let response = T.responseFromObject(rawResponse) { + return .success(response) + } else { + let userInfo = [NSLocalizedDescriptionKey: "failed to create model object from raw object."] + let error = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo) + return .failure(error) } - - dispatch_async(mainQueue) { handler(mappedResponse) } } - + + dispatch_async(mainQueue) { handler(mappedResponse) } } task.resume() diff --git a/APIKit/ResponseBodyParser.swift b/APIKit/ResponseBodyParser.swift index fee1ec2f..62fb3e2a 100644 --- a/APIKit/ResponseBodyParser.swift +++ b/APIKit/ResponseBodyParser.swift @@ -25,6 +25,9 @@ public enum ResponseBodyParser { public func parseData(data: NSData) -> Result { switch self { case .JSON(let readingOptions): + if data.length == 0 { + return .success([:]) + } return try { error in return NSJSONSerialization.JSONObjectWithData(data, options: readingOptions, error: error) }