Skip to content

Instantly share code, notes, and snippets.

@amadeu01
Created May 11, 2019 20:09
Show Gist options
  • Save amadeu01/7f4d60dd35e875d2f2d34a06e957a50b to your computer and use it in GitHub Desktop.
Save amadeu01/7f4d60dd35e875d2f2d34a06e957a50b to your computer and use it in GitHub Desktop.
extension URLSession {
func load(_ request: URLRequest,
_ completionHandler: @escaping (Result<(Data, HTTPURLResponse), ErrorEnvelope>) -> Void) {
dataTask(request) { result in
DispatchQueue.main.async { completionHandler(transformDataTask(result)) }
}
}
func dataTask(_ request: URLRequest,
_ completionHandler: @escaping (Result<(Data, HTTPURLResponse), AnyError>) -> Void) {
dataTask(with: request) { data, response, error in
guard let response = response as? HTTPURLResponse,
let data = data else {
completionHandler(.failure(AnyError(error ?? defaultSessionError)))
return
}
completionHandler(.success((data, response)))
}.resume()
}
}
private func transformDataTask(_ result: Result<(Data, HTTPURLResponse), AnyError>)
-> Result<(Data, HTTPURLResponse), ErrorEnvelope> {
return result
.mapError { error in
if let error = error.error as NSError?,
error.domain == NSURLErrorDomain,
error.code == NSURLErrorNotConnectedToInternet {
return ErrorEnvelope.couldNotConnectedToInternet(error)
}
if let error = error.error as NSError?,
error.domain == NSURLErrorDomain,
error.code == NSURLErrorTimedOut {
return ErrorEnvelope.couldNotConnectedToInternet(error)
}
return ErrorEnvelope.couldNotParseErrorEnvelope
}
.flatMap { (data, response) -> Result<(Data, HTTPURLResponse), ErrorEnvelope> in
guard (200..<300).contains(response.statusCode) else {
let rdError = try? decode(RDError.self, from: data)
return .failure(ErrorEnvelope(decodable: rdError, data: data, urlResponse: response))
}
return .success((data, response))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment