diff --git a/modules/openapi-generator/src/main/resources/swift5/Extensions.mustache b/modules/openapi-generator/src/main/resources/swift5/Extensions.mustache index e20d8bf3e52..311b4bf3b31 100644 --- a/modules/openapi-generator/src/main/resources/swift5/Extensions.mustache +++ b/modules/openapi-generator/src/main/resources/swift5/Extensions.mustache @@ -173,6 +173,12 @@ extension KeyedDecodingContainerProtocol { } +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} + {{#usePromiseKit}}extension RequestBuilder { {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} func execute() -> Promise> { let deferred = Promise>.pending() diff --git a/modules/openapi-generator/src/main/resources/swift5/Models.mustache b/modules/openapi-generator/src/main/resources/swift5/Models.mustache index cf561f12e95..97ea6459774 100644 --- a/modules/openapi-generator/src/main/resources/swift5/Models.mustache +++ b/modules/openapi-generator/src/main/resources/swift5/Models.mustache @@ -25,6 +25,7 @@ protocol JSONEncodable { {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/modules/openapi-generator/src/main/resources/swift5/libraries/urlsession/URLSessionImplementations.mustache b/modules/openapi-generator/src/main/resources/swift5/libraries/urlsession/URLSessionImplementations.mustache index 3bdcc13331e..c1e6e80b9fb 100644 --- a/modules/openapi-generator/src/main/resources/swift5/libraries/urlsession/URLSessionImplementations.mustache +++ b/modules/openapi-generator/src/main/resources/swift5/libraries/urlsession/URLSessionImplementations.mustache @@ -181,20 +181,25 @@ private var urlSessionStore = SynchronizedDictionary() } fileprivate func processRequestResponse(urlRequest: URLRequest, data: Data?, response: URLResponse?, error: Error?, completion: @escaping (_ result: Result, Error>) -> Void) { - + guard let httpResponse = response as? HTTPURLResponse else { completion(.failure(ErrorResponse.error(-2, nil, DecodableRequestBuilderError.nilHTTPResponse))) return } - + + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ private var urlSessionStore = SynchronizedDictionary() case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -323,44 +318,34 @@ private var urlSessionStore = SynchronizedDictionary() completion(.failure(ErrorResponse.error(-2, nil, DecodableRequestBuilderError.nilHTTPResponse))) return } - + + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return diff --git a/samples/client/petstore/swift5/alamofireLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift b/samples/client/petstore/swift5/alamofireLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift index 74fcfcf2ad4..93ed6b90b37 100644 --- a/samples/client/petstore/swift5/alamofireLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/petstore/swift5/alamofireLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift @@ -171,3 +171,9 @@ extension KeyedDecodingContainerProtocol { } } + +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} diff --git a/samples/client/petstore/swift5/alamofireLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/alamofireLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift index b9757b6cbc1..41997535f82 100644 --- a/samples/client/petstore/swift5/alamofireLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/alamofireLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ public enum DownloadException: Error { public enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift b/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift index 74fcfcf2ad4..93ed6b90b37 100644 --- a/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift @@ -171,3 +171,9 @@ extension KeyedDecodingContainerProtocol { } } + +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} diff --git a/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift index b9757b6cbc1..41997535f82 100644 --- a/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ public enum DownloadException: Error { public enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift index f0a59876722..339f484cd9d 100644 --- a/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/petstore/swift5/combineLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -187,14 +187,19 @@ open class URLSessionRequestBuilder: RequestBuilder { return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ open class URLSessionRequestBuilder: RequestBuilder { case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -324,43 +319,33 @@ open class URLSessionDecodableRequestBuilder: URLSessionRequestBui return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return diff --git a/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/Extensions.swift b/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/Extensions.swift index 74fcfcf2ad4..93ed6b90b37 100644 --- a/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/Extensions.swift @@ -171,3 +171,9 @@ extension KeyedDecodingContainerProtocol { } } + +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} diff --git a/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/Models.swift index b9757b6cbc1..41997535f82 100644 --- a/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ public enum DownloadException: Error { public enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift index f0a59876722..339f484cd9d 100644 --- a/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/petstore/swift5/default/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -187,14 +187,19 @@ open class URLSessionRequestBuilder: RequestBuilder { return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ open class URLSessionRequestBuilder: RequestBuilder { case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -324,43 +319,33 @@ open class URLSessionDecodableRequestBuilder: URLSessionRequestBui return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return diff --git a/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/Extensions.swift b/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/Extensions.swift index 66f407c1c5f..e5511b3aa37 100644 --- a/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/Extensions.swift @@ -171,3 +171,9 @@ extension KeyedDecodingContainerProtocol { } } + +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} diff --git a/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/Models.swift index b5f1df522b5..65c14f85267 100644 --- a/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ internal enum DownloadException: Error { internal enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift index 5282c1d239d..7128797f067 100644 --- a/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/petstore/swift5/nonPublicApi/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -187,14 +187,19 @@ internal class URLSessionRequestBuilder: RequestBuilder { return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ internal class URLSessionRequestBuilder: RequestBuilder { case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -324,43 +319,33 @@ internal class URLSessionDecodableRequestBuilder: URLSessionReques return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return diff --git a/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/Extensions.swift b/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/Extensions.swift index 74fcfcf2ad4..93ed6b90b37 100644 --- a/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/Extensions.swift @@ -171,3 +171,9 @@ extension KeyedDecodingContainerProtocol { } } + +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} diff --git a/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/Models.swift index b9757b6cbc1..41997535f82 100644 --- a/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ public enum DownloadException: Error { public enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift index f0a59876722..339f484cd9d 100644 --- a/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/petstore/swift5/objcCompatible/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -187,14 +187,19 @@ open class URLSessionRequestBuilder: RequestBuilder { return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ open class URLSessionRequestBuilder: RequestBuilder { case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -324,43 +319,33 @@ open class URLSessionDecodableRequestBuilder: URLSessionRequestBui return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return diff --git a/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift b/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift index 4bfdc722770..736702ea5dd 100644 --- a/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift @@ -173,6 +173,12 @@ extension KeyedDecodingContainerProtocol { } +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} + extension RequestBuilder { public func execute() -> Promise> { let deferred = Promise>.pending() diff --git a/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift index b9757b6cbc1..41997535f82 100644 --- a/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ public enum DownloadException: Error { public enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift index f0a59876722..339f484cd9d 100644 --- a/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/petstore/swift5/promisekitLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -187,14 +187,19 @@ open class URLSessionRequestBuilder: RequestBuilder { return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ open class URLSessionRequestBuilder: RequestBuilder { case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -324,43 +319,33 @@ open class URLSessionDecodableRequestBuilder: URLSessionRequestBui return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift index 74fcfcf2ad4..93ed6b90b37 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift @@ -171,3 +171,9 @@ extension KeyedDecodingContainerProtocol { } } + +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift index b9757b6cbc1..41997535f82 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ public enum DownloadException: Error { public enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift index f0a59876722..339f484cd9d 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -187,14 +187,19 @@ open class URLSessionRequestBuilder: RequestBuilder { return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ open class URLSessionRequestBuilder: RequestBuilder { case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -324,43 +319,33 @@ open class URLSessionDecodableRequestBuilder: URLSessionRequestBui return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return diff --git a/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift b/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift index 74fcfcf2ad4..93ed6b90b37 100644 --- a/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift @@ -171,3 +171,9 @@ extension KeyedDecodingContainerProtocol { } } + +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} diff --git a/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift index b9757b6cbc1..41997535f82 100644 --- a/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ public enum DownloadException: Error { public enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift index f0a59876722..339f484cd9d 100644 --- a/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/petstore/swift5/rxswiftLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -187,14 +187,19 @@ open class URLSessionRequestBuilder: RequestBuilder { return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ open class URLSessionRequestBuilder: RequestBuilder { case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -324,43 +319,33 @@ open class URLSessionDecodableRequestBuilder: URLSessionRequestBui return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return diff --git a/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift b/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift index 74fcfcf2ad4..93ed6b90b37 100644 --- a/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/Extensions.swift @@ -171,3 +171,9 @@ extension KeyedDecodingContainerProtocol { } } + +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} diff --git a/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift index b9757b6cbc1..41997535f82 100644 --- a/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ public enum DownloadException: Error { public enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift index f0a59876722..339f484cd9d 100644 --- a/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -187,14 +187,19 @@ open class URLSessionRequestBuilder: RequestBuilder { return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ open class URLSessionRequestBuilder: RequestBuilder { case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -324,43 +319,33 @@ open class URLSessionDecodableRequestBuilder: URLSessionRequestBui return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return diff --git a/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/Extensions.swift b/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/Extensions.swift index 74fcfcf2ad4..93ed6b90b37 100644 --- a/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/Extensions.swift +++ b/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/Extensions.swift @@ -171,3 +171,9 @@ extension KeyedDecodingContainerProtocol { } } + +extension HTTPURLResponse { + var isStatusCodeSuccessful: Bool { + return Array(200 ..< 300).contains(statusCode) + } +} diff --git a/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/Models.swift b/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/Models.swift index b9757b6cbc1..41997535f82 100644 --- a/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/Models.swift @@ -25,6 +25,7 @@ public enum DownloadException: Error { public enum DecodableRequestBuilderError: Error { case emptyDataResponse case nilHTTPResponse + case unsuccessfulHTTPStatusCode(Error?) case jsonDecoding(DecodingError) case generalError(Error) } diff --git a/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/URLSessionImplementations.swift index 4ed152fdd63..762ea264b2f 100644 --- a/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/test/swift5/default/TestClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -187,14 +187,19 @@ open class URLSessionRequestBuilder: RequestBuilder { return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) @@ -236,20 +241,10 @@ open class URLSessionRequestBuilder: RequestBuilder { case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) } @@ -324,43 +319,33 @@ open class URLSessionDecodableRequestBuilder: URLSessionRequestBui return } + guard httpResponse.isStatusCodeSuccessful else { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode(error)))) + return + } + + if let error = error { + completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) + return + } + switch T.self { case is String.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" completion(.success(Response(response: httpResponse, body: body as? T))) case is Void.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: nil))) case is Data.Type: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - completion(.success(Response(response: httpResponse, body: data as? T))) default: - if let error = error { - completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, error))) - return - } - guard let data = data, !data.isEmpty else { completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, DecodableRequestBuilderError.emptyDataResponse))) return