diff --git a/Evergreen/Favicons/FaviconDownloader.swift b/Evergreen/Favicons/FaviconDownloader.swift index f59a74f52..ef4717d72 100644 --- a/Evergreen/Favicons/FaviconDownloader.swift +++ b/Evergreen/Favicons/FaviconDownloader.swift @@ -61,7 +61,7 @@ final class FaviconDownloader { func favicon(withHomePageURL homePageURL: String) -> NSImage? { - guard let seekingFavicon = seekingFavicon(with: homePageURL) else { + guard let seekingFavicon = seekingFavicon(with: normalizedHomePageURL(homePageURL)) else { return nil } return favicon(withSeekingFavicon: seekingFavicon) @@ -92,6 +92,26 @@ final class FaviconDownloader { private extension FaviconDownloader { + private static let localeForLowercasing = Locale(identifier: "en_US") + + func normalizedHomePageURL(_ url: String) -> String { + + // Many times the homePageURL is missing a trailing /. + // We add one when needed. + + guard !url.hasSuffix("/") else { + return url + } + let lowercasedURL = url.lowercased(with: FaviconDownloader.localeForLowercasing) + guard lowercasedURL.hasPrefix("http://") || lowercasedURL.hasPrefix("https://") else { + return url + } + guard url.components(separatedBy: "/").count < 4 else { + return url + } + return url + "/" + } + @discardableResult func favicon(withSeekingFavicon seekingFavicon: SeekingFavicon) -> NSImage? {