From 882f03a94beaf1be97ca88dde4cf00767b5029d4 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Mon, 14 Jan 2019 13:45:33 -0500 Subject: [PATCH] Better lenient URL parsing --- Pachyderm/Model/Attachment.swift | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Pachyderm/Model/Attachment.swift b/Pachyderm/Model/Attachment.swift index 7543a509..1ab4b980 100644 --- a/Pachyderm/Model/Attachment.swift +++ b/Pachyderm/Model/Attachment.swift @@ -29,15 +29,15 @@ public class Attachment: Decodable { let container = try decoder.container(keyedBy: CodingKeys.self) self.id = try container.decode(String.self, forKey: .id) self.kind = try container.decode(Kind.self, forKey: .kind) - self.url = URL(string: try container.decode(String.self, forKey: .url).replacingOccurrences(of: " ", with: "%20"))! // Pleroma returns spaces in attachment URLs + self.url = URL(lenient: try container.decode(String.self, forKey: .url))! if let remote = try? container.decode(String.self, forKey: .remoteURL) { - self.remoteURL = URL(string: remote.replacingOccurrences(of: " ", with: "%20")) + self.remoteURL = URL(lenient: remote.replacingOccurrences(of: " ", with: "%20")) } else { self.remoteURL = nil } - self.previewURL = URL(string: try container.decode(String.self, forKey: .previewURL).replacingOccurrences(of: " ", with: "%20"))! + self.previewURL = URL(lenient: try container.decode(String.self, forKey: .previewURL).replacingOccurrences(of: " ", with: "%20"))! if let text = try? container.decode(String.self, forKey: .textURL) { - self.textURL = URL(string: text.replacingOccurrences(of: " ", with: "%20")) + self.textURL = URL(lenient: text.replacingOccurrences(of: " ", with: "%20")) } else { self.textURL = nil } @@ -113,3 +113,14 @@ extension Attachment { } } } + +fileprivate extension URL { + private static let allowedChars = CharacterSet.urlHostAllowed.union(.urlPathAllowed) + + init?(lenient string: String) { + guard let escaped = string.addingPercentEncoding(withAllowedCharacters: URL.allowedChars) else { + return nil + } + self.init(string: escaped) + } +}