From a8a8ea10a143d5b061ac7489fc651ca2b344acce Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sun, 20 Dec 2020 22:57:29 -0500 Subject: [PATCH] Fix redirects not being handled Closes #1 --- Gemini-iOS/BrowserWebViewController.swift | 10 +++++----- GeminiProtocol/GeminiProtocol.swift | 12 +++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Gemini-iOS/BrowserWebViewController.swift b/Gemini-iOS/BrowserWebViewController.swift index 769d230..d7c8b42 100644 --- a/Gemini-iOS/BrowserWebViewController.swift +++ b/Gemini-iOS/BrowserWebViewController.swift @@ -154,11 +154,11 @@ class BrowserWebViewController: UIViewController { } case let .success(response): if response.status.isRedirect { - print("Trying to redirect to: '\(response.meta)'") - if let redirect = URL(string: response.meta) { - self.navigator.changeURL(redirect) - } else { - DispatchQueue.main.async { + DispatchQueue.main.async { + print("Trying to redirect to: '\(response.meta)'") + if let redirect = URL(string: response.meta) { + self.navigator.changeURL(redirect) + } else { self.showError(message: "Invalid redirect URL: '\(response.meta)'") } } diff --git a/GeminiProtocol/GeminiProtocol.swift b/GeminiProtocol/GeminiProtocol.swift index 2957a1f..b0f80a8 100644 --- a/GeminiProtocol/GeminiProtocol.swift +++ b/GeminiProtocol/GeminiProtocol.swift @@ -88,11 +88,13 @@ class GeminiProtocol: NWProtocolFramerImplementation { let header = GeminiResponseHeader(status: statusCode, meta: meta) let message = NWProtocolFramer.Message(geminiResponseHeader: header) - while true { - if !framer.deliverInputNoCopy(length: .max, message: message, isComplete: true) { - return 0 - } - } + // What does the return value of deliverInputNoCopy mean, you ask? Why, I have no idea + // It always returns true for a length of zero, so following the sample code and looping + // infinitely until it returns false causes an infinite loop. + // Additionally, calling deliverInput with an empty Data() causes an error inside Network.framework. + // So, we just ignore the result since it doesn't seem to cause any problems ¯\_(ツ)_/¯ + _ = framer.deliverInputNoCopy(length: statusCode.isSuccess ? .max : 0, message: message, isComplete: true) + return 0 } func handleOutput(framer: NWProtocolFramer.Instance, message: NWProtocolFramer.Message, messageLength: Int, isComplete: Bool) {