From a59cb3b79b5ecffcce1a90264265ff8ba1a16d87 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 16 Apr 2020 12:07:57 -0500 Subject: [PATCH] Clean up the URL screen name extraction --- .../Twitter/TwitterFeedProvider.swift | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Frameworks/Account/FeedProvider/Twitter/TwitterFeedProvider.swift b/Frameworks/Account/FeedProvider/Twitter/TwitterFeedProvider.swift index 19db50fdd..60102040f 100644 --- a/Frameworks/Account/FeedProvider/Twitter/TwitterFeedProvider.swift +++ b/Frameworks/Account/FeedProvider/Twitter/TwitterFeedProvider.swift @@ -13,6 +13,7 @@ import RSParser // TODO: Beef up error handling... public enum TwitterFeedProviderError: Error { + case screenNameNotFound case unknown } @@ -21,6 +22,9 @@ public struct TwitterFeedProvider: FeedProvider { private static let server = "api.twitter.com" private static let apiBase = "https://api.twitter.com/1.1/" + private static let userPaths = ["/home", "/notifications"] + private static let reservedPaths = ["/search", "/explore", "/messages", "/i", "/compose"] + public var userID: String public var screenName: String @@ -85,8 +89,11 @@ public struct TwitterFeedProvider: FeedProvider { } public func iconURL(_ urlComponents: URLComponents, completion: @escaping (Result) -> Void) { - let screenName = extractScreenName(urlComponents) - fetchIconURL(screenName: screenName, completion: completion) + if let screenName = deriveScreenName(urlComponents) { + fetchIconURL(screenName: screenName, completion: completion) + } else { + completion(.failure(TwitterFeedProviderError.screenNameNotFound)) + } } public func provide(_ urlComponents: URLComponents, completion: @escaping (Result) -> Void) { @@ -119,24 +126,18 @@ extension TwitterFeedProvider: OAuth1SwiftProvider { private extension TwitterFeedProvider { - // TODO: Full parsing routine - func extractScreenName(_ urlComponents: URLComponents) -> String { + func deriveScreenName(_ urlComponents: URLComponents) -> String? { let path = urlComponents.path - if let index = path.firstIndex(of: "?") { - let range = path.index(path.startIndex, offsetBy: 1)...index - return String(path[range]) + guard !Self.reservedPaths.contains(path) else { return nil } + + if path.isEmpty || Self.userPaths.contains(path) { + return screenName } else { return String(path.suffix(from: path.index(path.startIndex, offsetBy: 1))) } } - // TODO: Update to retrieve the full user func fetchIconURL(screenName: String, completion: @escaping (Result) -> Void) { - guard screenName != "search" else { - completion(.failure(TwitterFeedProviderError.unknown)) - return - } - let url = "\(Self.apiBase)users/show.json" let parameters = ["screen_name": screenName]