diff --git a/quartz/src/iosMain/kotlin/com/vitorpamplona/quartz/utils/Rfc3986.ios.kt b/quartz/src/iosMain/kotlin/com/vitorpamplona/quartz/utils/Rfc3986.ios.kt index 1444daffd..db6e844af 100644 --- a/quartz/src/iosMain/kotlin/com/vitorpamplona/quartz/utils/Rfc3986.ios.kt +++ b/quartz/src/iosMain/kotlin/com/vitorpamplona/quartz/utils/Rfc3986.ios.kt @@ -20,12 +20,33 @@ */ package com.vitorpamplona.quartz.utils +import kotlinx.cinterop.ExperimentalForeignApi +import platform.Foundation.NSURLComponents +import swiftbridge.Rfc3986UriBridge + +@OptIn(ExperimentalForeignApi::class) actual object Rfc3986 { - actual fun normalize(uri: String): String = TODO() + private val rfc3986UriBridge = Rfc3986UriBridge() - actual fun isValidUrl(url: String): Boolean = TODO() + actual fun normalize(uri: String): String = rfc3986UriBridge.normalizeUrlWithUrl(uri, null) ?: throw Exception("Could not normalize URL.") - actual fun normalizeAndRemoveFragment(url: String): String = TODO() + actual fun isValidUrl(url: String): Boolean = rfc3986UriBridge.isUrlValidWithUrl(url) - actual fun host(url: String): String = TODO() + actual fun normalizeAndRemoveFragment(url: String): String = + NSURLComponents(url) + .toStringNoFragment() + .internIfPossible() + + actual fun host(url: String): String = rfc3986UriBridge.hostFromUriWithUrl(url, null) ?: throw Exception("Could not retrieve host from URL.") +} + +fun NSURLComponents.toStringNoFragment(): String { + val sb = StringBuilder() + + if (scheme != null) sb.append(scheme).append(":") + if (host != null) sb.append("//").append(host.toString()) + if (path != null) sb.append(path) + if (query != null) sb.append("?").append(query) + + return sb.toString() } diff --git a/quartz/src/swift/swiftbridge/Rfc3986UriBridge.swift b/quartz/src/swift/swiftbridge/Rfc3986UriBridge.swift new file mode 100644 index 000000000..bafd34a5b --- /dev/null +++ b/quartz/src/swift/swiftbridge/Rfc3986UriBridge.swift @@ -0,0 +1,23 @@ +// +// Created by NullDev on 31/12/2025. +// + +import Foundation +import RFC_3986 + +@objcMembers public class Rfc3986UriBridge: NSObject { + public func normalizeUrl(url: String) throws -> String { + let uri = try RFC_3986.URI(url) + let normalized = uri.normalized() + return normalized.value + } + + public func isUrlValid(url: String) -> Bool { + return RFC_3986.isValidURI(url) + } + + public func hostFromUri(url: String) throws -> String { + let actualUri = try RFC_3986.URI(url) + return actualUri.host! + } +}