From 21c2787f906f32a9c9bd0f5a48e35238c4234430 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 12 Nov 2020 03:44:54 -0500 Subject: [PATCH 1/2] =?UTF-8?q?Handle=20+=E2=80=99s=20in=20the=20query=20i?= =?UTF-8?q?tems?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +’s in query items can be treated as spaces by services. We want to encode them properly (via URLComponents.enhancedPercentEncodedQuery) This private entension might be worth moving into RSWeb. Fixes #2544 --- .../FeedWrangler/FeedWranglerAPICaller.swift | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/Account/Sources/Account/FeedWrangler/FeedWranglerAPICaller.swift b/Account/Sources/Account/FeedWrangler/FeedWranglerAPICaller.swift index 1c525e63c..5a8cecdb0 100644 --- a/Account/Sources/Account/FeedWrangler/FeedWranglerAPICaller.swift +++ b/Account/Sources/Account/FeedWrangler/FeedWranglerAPICaller.swift @@ -111,13 +111,17 @@ final class FeedWranglerAPICaller: NSObject { } func renameSubscription(feedID: String, newName: String, completion: @escaping (Result) -> Void) { - let url = FeedWranglerConfig.clientURL - .appendingPathComponent("subscriptions/rename_feed") - .appendingQueryItems([ - URLQueryItem(name: "feed_id", value: feedID), - URLQueryItem(name: "feed_name", value: newName), - ]) - + var postData = URLComponents(url: FeedWranglerConfig.clientURL, resolvingAgainstBaseURL: false) + postData?.path += "subscriptions/rename_feed" + postData?.queryItems = [ + URLQueryItem(name: "feed_id", value: feedID), + URLQueryItem(name: "feed_name", value: newName), + ] + + guard let url = postData?.urlWithEnhancedPercentEncodedQuery else { + fatalError() // something has gone terribly wrong + } + standardSend(url: url, resultType: FeedWranglerSubscriptionsRequest.self) { result in switch result { case .success: @@ -290,3 +294,16 @@ final class FeedWranglerAPICaller: NSObject { } } + +private extension URLComponents { + + var urlWithEnhancedPercentEncodedQuery: URL? { + guard let tempQueryItems = self.queryItems, !tempQueryItems.isEmpty else { + return self.url + } + + var tempComponents = self + tempComponents.percentEncodedQuery = self.enhancedPercentEncodedQuery + return tempComponents.url + } +} From c594878cf59f3776c08717cb5b7de79b2e396651 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 12 Nov 2020 23:09:36 -0500 Subject: [PATCH 2/2] Throw an error if encoding fails --- .../Sources/Account/FeedWrangler/FeedWranglerAPICaller.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Account/Sources/Account/FeedWrangler/FeedWranglerAPICaller.swift b/Account/Sources/Account/FeedWrangler/FeedWranglerAPICaller.swift index 5a8cecdb0..0a947ccac 100644 --- a/Account/Sources/Account/FeedWrangler/FeedWranglerAPICaller.swift +++ b/Account/Sources/Account/FeedWrangler/FeedWranglerAPICaller.swift @@ -119,7 +119,8 @@ final class FeedWranglerAPICaller: NSObject { ] guard let url = postData?.urlWithEnhancedPercentEncodedQuery else { - fatalError() // something has gone terribly wrong + completion(.failure(FeedWranglerError.general(message: "Could not encode name"))) + return } standardSend(url: url, resultType: FeedWranglerSubscriptionsRequest.self) { result in