From de68ecbe4b243648e485f0a05b54588af460da94 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Thu, 17 Jun 2021 22:20:02 -0400 Subject: [PATCH] Don't assume character encoding when loading in fallback mode --- Gemini-iOS/BrowserWebViewController.swift | 3 +-- GeminiProtocol/GeminiResponse.swift | 11 +++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Gemini-iOS/BrowserWebViewController.swift b/Gemini-iOS/BrowserWebViewController.swift index 979d26a..6517959 100644 --- a/Gemini-iOS/BrowserWebViewController.swift +++ b/Gemini-iOS/BrowserWebViewController.swift @@ -258,8 +258,7 @@ class BrowserWebViewController: UIViewController { self.loadedFallback = true - // todo: probably shouldn't assume this is UTF-8 - self.webView.load(body, mimeType: mimeType, characterEncodingName: "utf-8", baseURL: self.url) + self.webView.load(body, mimeType: mimeType, characterEncodingName: response.encodingName ?? "utf-8", baseURL: self.url) // When showing an image, the safe area insets seem to be ignored. This isn't perfect // (there's a little extra space between the bottom of the nav bar and the top of the image), // but it's better than the image being obscured. diff --git a/GeminiProtocol/GeminiResponse.swift b/GeminiProtocol/GeminiResponse.swift index 902b50a..7682999 100644 --- a/GeminiProtocol/GeminiResponse.swift +++ b/GeminiProtocol/GeminiResponse.swift @@ -38,10 +38,17 @@ public struct GeminiResponse { return UTType.types(tag: mimeType, tagClass: .mimeType, conformingTo: nil).first } + public var encodingName: String? { + guard let parameters = mimeTypeParameters else { + return nil + } + return parameters["charset"] + } + public var bodyText: String? { - guard let body = body, let parameters = mimeTypeParameters else { return nil } + guard let body = body else { return nil } let encoding: String.Encoding - switch parameters["charset"]?.lowercased() { + switch encodingName?.lowercased() { case nil, "utf-8": // The Gemini spec defines UTF-8 to be the default charset. encoding = .utf8