Skip to content

Instantly share code, notes, and snippets.

@pedromancheno
Created February 21, 2017 11:44
Show Gist options
  • Save pedromancheno/7092a9f706a1df71ce2bf64fbd2884a9 to your computer and use it in GitHub Desktop.
Save pedromancheno/7092a9f706a1df71ce2bf64fbd2884a9 to your computer and use it in GitHub Desktop.
Wrapper for URLSession for making HTTP Requests.
import Foundation
enum Result<T> {
case success(T?)
case failure(Error)
}
enum HTTPError: Error {
case noResponse
case unsuccesfulStatusCode(Int)
}
typealias HTTPCompletion = ((Result<[String:Any]>) -> Void)
struct HTTP {
private static var successCodes: Range<Int> = 200..<299
static func execute(request: URLRequest, completion: @escaping HTTPCompletion) {
let session = URLSession.shared
var task: URLSessionDataTask?
debugPrint(request)
task = session.dataTask(with: request) { (data: Data?, response:URLResponse?, error:Error?) in
guard let error = error else {
self.evaluate(data: data, response: response, completion: completion)
return
}
completion(.failure(error))
}
task?.resume()
}
fileprivate static func evaluate(data: Data?, response: URLResponse?, completion: HTTPCompletion) {
guard let httpResponse = response as? HTTPURLResponse else {
completion(.failure(HTTPError.noResponse))
return
}
debugPrint(httpResponse)
validateStatusCodes(data: data, httpResponse: httpResponse, completion: completion)
}
fileprivate static func validateStatusCodes(data: Data?, httpResponse: HTTPURLResponse, completion: HTTPCompletion) {
guard successCodes.contains(httpResponse.statusCode) else {
completion(.failure(HTTPError.unsuccesfulStatusCode(httpResponse.statusCode)))
return
}
makeJSON(data: data, completion: completion)
}
fileprivate static func makeJSON(data: Data?, completion: HTTPCompletion) {
guard let data = data else {
completion(.success(nil))
return
}
let json = dataToJSON(data: data)
completion(.success(json))
}
fileprivate static func dataToJSON(data: Data) -> [String:Any]? {
do {
return try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any]
} catch let jsonError {
debugPrint(jsonError)
}
return nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment