41 lines
1.6 KiB
Swift
41 lines
1.6 KiB
Swift
import Foundation
|
|
|
|
struct SettingsHostPort: Equatable {
|
|
var host: String
|
|
var port: Int
|
|
}
|
|
|
|
enum SettingsNetworkingHelpers {
|
|
static func parseHostPort(from address: String) -> SettingsHostPort? {
|
|
let trimmed = address.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
guard !trimmed.isEmpty else { return nil }
|
|
|
|
if trimmed.hasPrefix("["),
|
|
let close = trimmed.firstIndex(of: "]"),
|
|
close < trimmed.endIndex
|
|
{
|
|
let host = String(trimmed[trimmed.index(after: trimmed.startIndex)..<close])
|
|
let portStart = trimmed.index(after: close)
|
|
guard portStart < trimmed.endIndex, trimmed[portStart] == ":" else { return nil }
|
|
let portString = String(trimmed[trimmed.index(after: portStart)...])
|
|
guard let port = Int(portString) else { return nil }
|
|
return SettingsHostPort(host: host, port: port)
|
|
}
|
|
|
|
guard let colon = trimmed.lastIndex(of: ":") else { return nil }
|
|
let host = String(trimmed[..<colon])
|
|
let portString = String(trimmed[trimmed.index(after: colon)...])
|
|
guard !host.isEmpty, let port = Int(portString) else { return nil }
|
|
return SettingsHostPort(host: host, port: port)
|
|
}
|
|
|
|
static func httpURLString(host: String?, port: Int?, fallback: String) -> String {
|
|
if let host, let port {
|
|
let needsBrackets = host.contains(":") && !host.hasPrefix("[") && !host.hasSuffix("]")
|
|
let hostPart = needsBrackets ? "[\(host)]" : host
|
|
return "http://\(hostPart):\(port)"
|
|
}
|
|
return "http://\(fallback)"
|
|
}
|
|
}
|