@@ -11,12 +11,12 @@ import Foundation
1111/// A error when creating or requesting an Endpoint
1212public 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
3030extension 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