Skip to content

Commit 48ab58a

Browse files
authored
Added response of Data on parse errors (#13)
1 parent a123a8d commit 48ab58a

File tree

2 files changed

+18
-13
lines changed

2 files changed

+18
-13
lines changed

Sources/Endpoints/Extensions/URLSession+Combine.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ extension URLSession {
107107
do {
108108
return try T.responseDecoder.decode(T.Response.self, from: data)
109109
} catch {
110-
throw T.TaskError.responseParseError(error)
110+
throw T.TaskError.responseParseError(data: data, error: error)
111111
}
112112
}
113113
// swiftlint:disable:next force_cast

Sources/Endpoints/Extensions/URLSession+Endpoints.swift

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import Foundation
1111
/// A error when creating or requesting an Endpoint
1212
public enum EndpointTaskError<ErrorResponseType>: Error {
1313
case endpointError(EndpointError)
14-
case responseParseError(Error)
14+
case responseParseError(data: Data, error: Error)
1515

16-
case unexpectedResponse(code: Int)
16+
case unexpectedResponse(httpResponse: HTTPURLResponse)
1717

18-
case errorResponse(code: Int, response: ErrorResponseType)
19-
case errorResponseParseError(Error)
18+
case errorResponse(httpResponse: HTTPURLResponse, response: ErrorResponseType)
19+
case errorResponseParseError(httpResponse: HTTPURLResponse, data: Data, error: Error)
2020

2121
case urlLoadError(Error)
2222
case internetConnectionOffline
@@ -29,30 +29,35 @@ extension RequestType {
2929

3030
extension Endpoint {
3131
func response(data: Data?, response: URLResponse?, error: Error?) -> Result<Data, T.TaskError> {
32-
let responseCode = (response as? HTTPURLResponse)?.statusCode ?? 0
33-
3432
if let error = error {
3533
guard (error as NSError).code != URLError.Code.notConnectedToInternet.rawValue else {
3634
return .failure(.internetConnectionOffline)
3735
}
3836

3937
return .failure(.urlLoadError(error))
40-
} else if responseCode == 204 {
38+
}
39+
40+
// if we don't have an `error`, we must have an `HTTPURLResponse`
41+
guard let httpResponse = response as? HTTPURLResponse else {
42+
return .failure(.urlLoadError(URLError(.badServerResponse)))
43+
}
44+
45+
if httpResponse.statusCode == 204 {
4146
// handle empty response
4247
return .success(Data())
43-
} else if (200..<300).contains(responseCode), let data = data {
48+
} else if (200..<300).contains(httpResponse.statusCode), let data = data {
4449
return .success(data)
4550
} else if let data = data {
4651
let decoded: T.ErrorResponse
4752
do {
4853
decoded = try T.errorDecoder.decode(T.ErrorResponse.self, from: data)
4954
} catch {
50-
return .failure(.errorResponseParseError(error))
55+
return .failure(.errorResponseParseError(httpResponse: httpResponse, data: data, error: error))
5156
}
5257

53-
return .failure(.errorResponse(code: responseCode, response: decoded))
58+
return .failure(.errorResponse(httpResponse: httpResponse, response: decoded))
5459
} else {
55-
return .failure(.unexpectedResponse(code: responseCode))
60+
return .failure(.unexpectedResponse(httpResponse: httpResponse))
5661
}
5762
}
5863
}
@@ -116,7 +121,7 @@ extension URLSession {
116121
do {
117122
decoded = try T.responseDecoder.decode(T.Response.self, from: data)
118123
} catch {
119-
completion(.failure(.responseParseError(error)))
124+
completion(.failure(.responseParseError(data: data, error: error)))
120125
return
121126
}
122127
completion(.success(decoded))

0 commit comments

Comments
 (0)