From 5583f561183d63b42eef550affe9b5af63bda36e Mon Sep 17 00:00:00 2001 From: Nico Date: Thu, 20 Apr 2023 12:56:15 +0100 Subject: [PATCH 1/3] using queryItems instead of self build strings --- .../DeeplApi/DeepLApi.swift | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Sources/BartyCrouchTranslator/DeeplApi/DeepLApi.swift b/Sources/BartyCrouchTranslator/DeeplApi/DeepLApi.swift index eb8e607..114b752 100644 --- a/Sources/BartyCrouchTranslator/DeeplApi/DeepLApi.swift +++ b/Sources/BartyCrouchTranslator/DeeplApi/DeepLApi.swift @@ -57,13 +57,21 @@ extension DeepLApi: Endpoint { var method: HttpMethod { switch self { case .translate(let texts, let sourceLanguage, let targetLanguage, let authKey): - let textEntries = texts.map { "text=\($0.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)" } - .joined(separator: "&") - let authKeyEntry = "auth_key=\(authKey)" - let sourceLanguageEntry = "source_lang=\(sourceLanguage.deepLParameterValue)" - let targetLanguageEntry = "target_lang=\(targetLanguage.deepLParameterValue)" - let bodyString = [authKeyEntry, sourceLanguageEntry, targetLanguageEntry, textEntries].joined(separator: "&") - return .post(body: bodyString.data(using: .utf8)!) + + let authKeyItem = URLQueryItem(name: "auth_key", value: authKey) + let textItem = URLQueryItem(name: "text", value: text) + let targetLangItem = URLQueryItem(name: "target_lang", value: targetLanguage.deepLParameterValue) + let sourceLangItem = URLQueryItem(name: "source_lang", value: sourceLang.deepLParameterValue) + let formalityItem = URLQueryItem(name: "formality", value: "prefer_less") + + var components = URLComponents() + components.queryItems = [authKeyItem, textItem, targetLangItem, sourceLangItem, formalityItem].compactMap { $0 } + + guard let queryItemsString = comp.string else { + fatalError("Invalid arguments.") + } + + return .post(body: queryItemsString.suffix(queryItemsString.count - 1).data(using: .utf8)!) } } From e0ec154c057b611c9f7f154b5654a3c5903cc7de Mon Sep 17 00:00:00 2001 From: Nicolo Stanciu Date: Thu, 20 Apr 2023 14:20:33 +0100 Subject: [PATCH 2/3] change DeepL translate handling using URLQueryItem instead of self built strings --- .../BartyCrouchTranslator/DeeplApi/DeepLApi.swift | 15 +++++++++------ .../DeepLTranslatorApiTests.swift | 3 ++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Sources/BartyCrouchTranslator/DeeplApi/DeepLApi.swift b/Sources/BartyCrouchTranslator/DeeplApi/DeepLApi.swift index 114b752..b6a98c4 100644 --- a/Sources/BartyCrouchTranslator/DeeplApi/DeepLApi.swift +++ b/Sources/BartyCrouchTranslator/DeeplApi/DeepLApi.swift @@ -59,19 +59,22 @@ extension DeepLApi: Endpoint { case .translate(let texts, let sourceLanguage, let targetLanguage, let authKey): let authKeyItem = URLQueryItem(name: "auth_key", value: authKey) - let textItem = URLQueryItem(name: "text", value: text) + let textItems = texts.map { URLQueryItem(name: "text", value: $0) } let targetLangItem = URLQueryItem(name: "target_lang", value: targetLanguage.deepLParameterValue) - let sourceLangItem = URLQueryItem(name: "source_lang", value: sourceLang.deepLParameterValue) - let formalityItem = URLQueryItem(name: "formality", value: "prefer_less") + let sourceLangItem = URLQueryItem(name: "source_lang", value: sourceLanguage.deepLParameterValue) var components = URLComponents() - components.queryItems = [authKeyItem, textItem, targetLangItem, sourceLangItem, formalityItem].compactMap { $0 } + components.queryItems = ([authKeyItem, targetLangItem, sourceLangItem] + textItems).compactMap { $0 } - guard let queryItemsString = comp.string else { + guard var queryItemsString = components.string else { fatalError("Invalid arguments.") } + // queryItemsString starts with a ? but post API expects the query string without leading ? + if queryItemsString.hasPrefix("?") { + queryItemsString.removeFirst() + } - return .post(body: queryItemsString.suffix(queryItemsString.count - 1).data(using: .utf8)!) + return .post(body: queryItemsString.data(using: .utf8)!) } } diff --git a/Tests/BartyCrouchTranslatorTests/DeepLTranslatorApiTests.swift b/Tests/BartyCrouchTranslatorTests/DeepLTranslatorApiTests.swift index 4f8c4f8..d2f60c0 100644 --- a/Tests/BartyCrouchTranslatorTests/DeepLTranslatorApiTests.swift +++ b/Tests/BartyCrouchTranslatorTests/DeepLTranslatorApiTests.swift @@ -19,7 +19,8 @@ class DeepLTranslatorApiTests: XCTestCase { switch apiProvider.performRequestAndWait(on: endpoint, decodeBodyTo: DeepLTranslateResponse.self) { case let .success(translateResponses): - XCTAssertEqual(translateResponses.translations[0].text, "Wie alt sind Sie?") + XCTAssertEqual(translateResponses.translations[0].text, "Wie alt bist du?") + XCTAssertEqual(translateResponses.translations[1].text, "Liebe") case let .failure(failure): XCTFail(failure.localizedDescription) From 4acb3574ec6b3e1411a0f5be5e0c908700063d75 Mon Sep 17 00:00:00 2001 From: Nicolo Stanciu Date: Thu, 20 Apr 2023 14:34:12 +0100 Subject: [PATCH 3/3] fix test --- Tests/BartyCrouchTranslatorTests/DeepLTranslatorApiTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/BartyCrouchTranslatorTests/DeepLTranslatorApiTests.swift b/Tests/BartyCrouchTranslatorTests/DeepLTranslatorApiTests.swift index d2f60c0..e5fcb27 100644 --- a/Tests/BartyCrouchTranslatorTests/DeepLTranslatorApiTests.swift +++ b/Tests/BartyCrouchTranslatorTests/DeepLTranslatorApiTests.swift @@ -19,7 +19,7 @@ class DeepLTranslatorApiTests: XCTestCase { switch apiProvider.performRequestAndWait(on: endpoint, decodeBodyTo: DeepLTranslateResponse.self) { case let .success(translateResponses): - XCTAssertEqual(translateResponses.translations[0].text, "Wie alt bist du?") + XCTAssertEqual(translateResponses.translations[0].text, "Wie alt sind Sie?") XCTAssertEqual(translateResponses.translations[1].text, "Liebe") case let .failure(failure):