From 272799d9c59d6cea4756efb69f0b5c68ea44afe9 Mon Sep 17 00:00:00 2001 From: alasclar <156718015+alasclar@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:42:10 +0100 Subject: [PATCH] Use http by default on ConnectToServerView (#971) --- Shared/Extensions/String.swift | 15 ++++++++++ .../ViewModels/ConnectToServerViewModel.swift | 30 +++++++++++++++++-- Swiftfin tvOS/Views/ConnectToServerView.swift | 5 +++- Swiftfin/Views/ConnectToServerView.swift | 5 +++- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/Shared/Extensions/String.swift b/Shared/Extensions/String.swift index 2a47a5a0..1c1b4a2b 100644 --- a/Shared/Extensions/String.swift +++ b/Shared/Extensions/String.swift @@ -99,6 +99,21 @@ extension String { let characters = Self.alphanumeric.randomSample(count: Int.random(in: range)) return String(characters) } + + func trimmingSuffix(_ suffix: String) -> String { + + guard suffix.count <= count else { return self } + + var s = self + var suffix = suffix + + while s.last == suffix.last { + s.removeLast() + suffix.removeLast() + } + + return s + } } extension CharacterSet { diff --git a/Shared/ViewModels/ConnectToServerViewModel.swift b/Shared/ViewModels/ConnectToServerViewModel.swift index ab4faaf0..808a1806 100644 --- a/Shared/ViewModels/ConnectToServerViewModel.swift +++ b/Shared/ViewModels/ConnectToServerViewModel.swift @@ -48,6 +48,7 @@ final class ConnectToServerViewModel: ViewModel { let formattedURL = url.trimmingCharacters(in: .whitespacesAndNewlines) .trimmingCharacters(in: .objectReplacement) + .prepending("http://", if: !url.contains("://")) guard let url = URL(string: formattedURL) else { throw JellyfinAPIError("Invalid URL") } @@ -66,9 +67,13 @@ final class ConnectToServerViewModel: ViewModel { throw JellyfinAPIError("Missing server data from network call") } + // in case of redirects, we must process the new URL + + let connectionURL = processConnectionURL(initial: url, response: response.response.url) + let newServerState = ServerState( - urls: [url], - currentURL: url, + urls: [connectionURL], + currentURL: connectionURL, name: name, id: id, os: os, @@ -79,6 +84,27 @@ final class ConnectToServerViewModel: ViewModel { return (newServerState, url) } + // TODO: this probably isn't the best way to properly handle this, fix if necessary + private func processConnectionURL(initial url: URL, response: URL?) -> URL { + + guard let response else { return url } + + if url.scheme != response.scheme || + url.host != response.host + { + var newURL = response.absoluteString.trimmingSuffix(Paths.getPublicSystemInfo.url?.absoluteString ?? "") + + // if ended in a "/" + if url.absoluteString.last == "/" { + newURL.append("/") + } + + return URL(string: newURL) ?? url + } + + return url + } + func isDuplicate(server: ServerState) -> Bool { if let _ = try? SwiftfinStore.dataStack.fetchOne( From(), diff --git a/Swiftfin tvOS/Views/ConnectToServerView.swift b/Swiftfin tvOS/Views/ConnectToServerView.swift index baaa522a..bc515108 100644 --- a/Swiftfin tvOS/Views/ConnectToServerView.swift +++ b/Swiftfin tvOS/Views/ConnectToServerView.swift @@ -33,7 +33,7 @@ struct ConnectToServerView: View { @State private var isPresentingError: Bool = false @State - private var url = "http://" + private var url = "" private func connectToServer(at url: String) { let task = Task { @@ -87,6 +87,9 @@ struct ConnectToServerView: View { .buttonStyle(.card) } else { Button { + if !url.contains("://") { + url = "http://" + url + } connectToServer(at: url) } label: { L10n.connect.text diff --git a/Swiftfin/Views/ConnectToServerView.swift b/Swiftfin/Views/ConnectToServerView.swift index 42a4fea1..15e062cd 100644 --- a/Swiftfin/Views/ConnectToServerView.swift +++ b/Swiftfin/Views/ConnectToServerView.swift @@ -33,7 +33,7 @@ struct ConnectToServerView: View { @State private var isPresentingError: Bool = false @State - private var url = "http://" + private var url = "" private func connectToServer() { let task = Task { @@ -78,6 +78,9 @@ struct ConnectToServerView: View { } } else { Button { + if !url.contains("://") { + url = "http://" + url + } connectToServer() } label: { L10n.connect.text