From bd3d9618b303af50b6ef9f9ede9c6aa3cdca0610 Mon Sep 17 00:00:00 2001 From: Dimitri Bouniol Date: Thu, 11 Jan 2024 03:41:25 -0800 Subject: [PATCH] Improved parsing of subdomains so IP-like domains get properly parsed --- Sources/HostRouter/HostComponent.swift | 13 +++++++++++-- Sources/HostRouter/HostRoutesGroup.swift | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Sources/HostRouter/HostComponent.swift b/Sources/HostRouter/HostComponent.swift index 51b5f00..551da32 100644 --- a/Sources/HostRouter/HostComponent.swift +++ b/Sources/HostRouter/HostComponent.swift @@ -38,12 +38,20 @@ extension HostComponent: CustomStringConvertible { extension StringProtocol { /// Converts a host (either a domain or an IP address) into a reversed collection of ``HostComponent``s. + @inlinable public var reversedDomainComponents: [HostComponent] { guard !self.isIPAddress else { return [.constant(String(self))] } - return self.split(separator: ".").reversed().map { .init(stringLiteral: $0.lowercased()) } + return reversedSubDomainComponents + } + + /// Converts a subdomain into a reversed collection of ``HostComponent``s. + @inlinable + public var reversedSubDomainComponents: [HostComponent] { + self.split(separator: ".").reversed().map { .init(stringLiteral: $0.lowercased()) } } /// Retrieve the port and domain from the receiving Host string. + @usableFromInline var hostComponents: (port: String?, reverseDomain: [String]) { let baseComponents = self.split(separator: ":") let (host, port) = baseComponents.count == 2 ? (String(baseComponents[0]), String(baseComponents[1])) : (String(self), nil) @@ -52,7 +60,8 @@ extension StringProtocol { } /// Check if the string is an IP address. - private var isIPAddress: Bool { + @usableFromInline + var isIPAddress: Bool { // TODO: This was unused in Vapor, and NIO may have a better helper for this. /// We need some scratch space to let inet_pton write into. diff --git a/Sources/HostRouter/HostRoutesGroup.swift b/Sources/HostRouter/HostRoutesGroup.swift index 3e8d7fa..c92b709 100644 --- a/Sources/HostRouter/HostRoutesGroup.swift +++ b/Sources/HostRouter/HostRoutesGroup.swift @@ -40,7 +40,7 @@ extension TopLevelHostRoutesBuilder { extension HostRoutesBuilder { public func grouped(subDomain: some StringProtocol) -> some HostRoutesBuilder { - HostRoutesGroup(root: self, port: nil, domainPath: subDomain.reversedDomainComponents) + HostRoutesGroup(root: self, port: nil, domainPath: subDomain.reversedSubDomainComponents) } public func grouped(reverseDomain: HostComponent...) -> some HostRoutesBuilder { @@ -52,7 +52,7 @@ extension HostRoutesBuilder { } public func group(subDomain: some StringProtocol, configure: (HostRoutesBuilder) throws -> ()) rethrows { - try configure(HostRoutesGroup(root: self, port: nil, domainPath: subDomain.reversedDomainComponents)) + try configure(HostRoutesGroup(root: self, port: nil, domainPath: subDomain.reversedSubDomainComponents)) } public func group(reverseDomain: HostComponent..., configure: (HostRoutesBuilder) throws -> ()) rethrows {