From 3c3132fdd75d32b66ae1cb42b3256f1e723a0780 Mon Sep 17 00:00:00 2001 From: Rob Jonson Date: Wed, 22 Mar 2023 19:07:08 +0000 Subject: [PATCH 1/3] throw errors for non-200 responses --- Sources/OpenAISwift/OpenAISwift.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Sources/OpenAISwift/OpenAISwift.swift b/Sources/OpenAISwift/OpenAISwift.swift index dd4e27c..df168d5 100644 --- a/Sources/OpenAISwift/OpenAISwift.swift +++ b/Sources/OpenAISwift/OpenAISwift.swift @@ -170,7 +170,19 @@ extension OpenAISwift { private func makeRequest(request: URLRequest, completionHandler: @escaping (Result) -> Void) { let session = config.session let task = session.dataTask(with: request) { (data, response, error) in + if let error = error { + completionHandler(.failure(error)) + } else if let response = response as? HTTPURLResponse, + response.statusCode != 200 { + + let domain = "openaiswift" + let code = response.statusCode + let message = String(data:data ?? Data(),encoding: .utf8) ?? "" + let userInfo = [NSLocalizedDescriptionKey: "Error:\(message)"] + + let error = NSError(domain: domain, code: code, userInfo: userInfo) + completionHandler(.failure(error)) } else if let data = data { completionHandler(.success(data)) From 60481df80a69490aef972696dafe4049fbad0baa Mon Sep 17 00:00:00 2001 From: Rob Jonson Date: Fri, 24 Mar 2023 10:40:55 +0000 Subject: [PATCH 2/3] Use a custom error type --- Sources/OpenAISwift/Models/NetworkError.swift | 23 +++++++++++++++++++ Sources/OpenAISwift/OpenAISwift.swift | 9 ++++---- 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 Sources/OpenAISwift/Models/NetworkError.swift diff --git a/Sources/OpenAISwift/Models/NetworkError.swift b/Sources/OpenAISwift/Models/NetworkError.swift new file mode 100644 index 0000000..aa1ddf6 --- /dev/null +++ b/Sources/OpenAISwift/Models/NetworkError.swift @@ -0,0 +1,23 @@ +// +// File.swift +// +// +// Created by Rob Jonson on 24/03/2023. +// + +import Foundation + +public enum OAISNetworkError: Error { + case badResponse(code: Int, response: String?) + + var localizedDescription: String { + switch self { + case .badResponse(let code, let contents): + if let contents { + return "Networking error. Response Code: \(code), Message\n\(contents)" + } else { + return "Networking error. Response Code: \(code)" + } + } + } +} diff --git a/Sources/OpenAISwift/OpenAISwift.swift b/Sources/OpenAISwift/OpenAISwift.swift index df168d5..c497440 100644 --- a/Sources/OpenAISwift/OpenAISwift.swift +++ b/Sources/OpenAISwift/OpenAISwift.swift @@ -176,12 +176,13 @@ extension OpenAISwift { } else if let response = response as? HTTPURLResponse, response.statusCode != 200 { - let domain = "openaiswift" let code = response.statusCode - let message = String(data:data ?? Data(),encoding: .utf8) ?? "" - let userInfo = [NSLocalizedDescriptionKey: "Error:\(message)"] + var responseString:String? + if let data { + responseString = String(data:data,encoding: .utf8) + } - let error = NSError(domain: domain, code: code, userInfo: userInfo) + let error = OAISNetworkError.badResponse(code: code, response: responseString) completionHandler(.failure(error)) } else if let data = data { From e49657a1b84541d480ef722b920a73e2937e9239 Mon Sep 17 00:00:00 2001 From: Rob Jonson Date: Fri, 24 Mar 2023 10:51:13 +0000 Subject: [PATCH 3/3] use existing error struct --- Sources/OpenAISwift/Models/NetworkError.swift | 23 ------------------- Sources/OpenAISwift/OpenAISwift.swift | 10 ++++---- 2 files changed, 5 insertions(+), 28 deletions(-) delete mode 100644 Sources/OpenAISwift/Models/NetworkError.swift diff --git a/Sources/OpenAISwift/Models/NetworkError.swift b/Sources/OpenAISwift/Models/NetworkError.swift deleted file mode 100644 index aa1ddf6..0000000 --- a/Sources/OpenAISwift/Models/NetworkError.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// File.swift -// -// -// Created by Rob Jonson on 24/03/2023. -// - -import Foundation - -public enum OAISNetworkError: Error { - case badResponse(code: Int, response: String?) - - var localizedDescription: String { - switch self { - case .badResponse(let code, let contents): - if let contents { - return "Networking error. Response Code: \(code), Message\n\(contents)" - } else { - return "Networking error. Response Code: \(code)" - } - } - } -} diff --git a/Sources/OpenAISwift/OpenAISwift.swift b/Sources/OpenAISwift/OpenAISwift.swift index c497440..e07083a 100644 --- a/Sources/OpenAISwift/OpenAISwift.swift +++ b/Sources/OpenAISwift/OpenAISwift.swift @@ -7,6 +7,7 @@ import FoundationXML public enum OpenAIError: Error { case genericError(error: Error) case decodingError(error: Error) + case badResponse(code: Int, response: String?) } public class OpenAISwift { @@ -174,17 +175,16 @@ extension OpenAISwift { if let error = error { completionHandler(.failure(error)) } else if let response = response as? HTTPURLResponse, - response.statusCode != 200 { - + !(200...299).contains(response.statusCode) { + //Responses outside the 2xx range don't necessarily throw errors, but we should treat them as errors + //E.g. a rejected api key will generate a 401 and a helpful message, but no error let code = response.statusCode var responseString:String? if let data { responseString = String(data:data,encoding: .utf8) } - let error = OAISNetworkError.badResponse(code: code, response: responseString) - - completionHandler(.failure(error)) + completionHandler(.failure(OpenAIError.badResponse(code: code, response: responseString))) } else if let data = data { completionHandler(.success(data)) }