diff --git a/Sources/FoundationEssentials/String/String+Path.swift b/Sources/FoundationEssentials/String/String+Path.swift index e1dd7930a..31c12e902 100644 --- a/Sources/FoundationEssentials/String/String+Path.swift +++ b/Sources/FoundationEssentials/String/String+Path.swift @@ -366,7 +366,7 @@ extension String { return String(cString: output) } - #if !NO_FILESYSTEM +#if !NO_FILESYSTEM internal static func homeDirectoryPath(forUser user: String? = nil) -> String { #if os(Windows) func GetUserProfile() -> String? { @@ -529,8 +529,10 @@ extension String { #else return "/tmp/" #endif -#endif +#endif // os(Windows) } +#endif // !NO_FILESYSTEM + /// Replaces any number of sequential `/` /// characters with / /// NOTE: Internal so it's testable @@ -569,7 +571,7 @@ extension String { } } - private var _droppingTrailingSlashes: String { + internal var _droppingTrailingSlashes: String { guard !self.isEmpty else { return self } @@ -579,7 +581,9 @@ extension String { } return String(self[...lastNonSlash]) } - + +#if !NO_FILESYSTEM + static var NETWORK_PREFIX: String { #"\\"# } private var _standardizingPath: String { @@ -616,7 +620,8 @@ extension String { var standardizingPath: String { expandingTildeInPath._standardizingPath } - #endif // !NO_FILESYSTEM + +#endif // !NO_FILESYSTEM // _NSPathComponents var pathComponents: [String] { diff --git a/Sources/FoundationEssentials/URL/URL.swift b/Sources/FoundationEssentials/URL/URL.swift index 69c28f66b..a325979e9 100644 --- a/Sources/FoundationEssentials/URL/URL.swift +++ b/Sources/FoundationEssentials/URL/URL.swift @@ -1320,12 +1320,8 @@ public struct URL: Equatable, Sendable, Hashable { } private static func fileSystemPath(for urlPath: String) -> String { - var result = urlPath - if result.count > 1 && result.utf8.last == UInt8(ascii: "/") { - _ = result.popLast() - } let charsToLeaveEncoded: Set = [._slash, 0] - return Parser.percentDecode(result, excluding: charsToLeaveEncoded) ?? "" + return Parser.percentDecode(urlPath._droppingTrailingSlashes, excluding: charsToLeaveEncoded) ?? "" } var fileSystemPath: String { diff --git a/Tests/FoundationEssentialsTests/URLTests.swift b/Tests/FoundationEssentialsTests/URLTests.swift index a1f7c6b49..135462cea 100644 --- a/Tests/FoundationEssentialsTests/URLTests.swift +++ b/Tests/FoundationEssentialsTests/URLTests.swift @@ -571,6 +571,21 @@ final class URLTests : XCTestCase { XCTAssertEqual(appended.relativePath, "relative/with:slash") } + func testURLFilePathDropsTrailingSlashes() throws { + var url = URL(filePath: "/path/slashes///") + XCTAssertEqual(url.path(), "/path/slashes///") + // TODO: Update this once .fileSystemPath uses backslashes for Windows + XCTAssertEqual(url.fileSystemPath, "/path/slashes") + + url = URL(filePath: "/path/slashes/") + XCTAssertEqual(url.path(), "/path/slashes/") + XCTAssertEqual(url.fileSystemPath, "/path/slashes") + + url = URL(filePath: "/path/slashes") + XCTAssertEqual(url.path(), "/path/slashes") + XCTAssertEqual(url.fileSystemPath, "/path/slashes") + } + func testURLComponentsPercentEncodedUnencodedProperties() throws { var comp = URLComponents()