Skip to content

Commit 2ee0822

Browse files
committed
(133878310) URL.fileSystemPath should drop all trailing slashes (swiftlang#852)
1 parent fe5c618 commit 2ee0822

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

Sources/FoundationEssentials/String/String+Path.swift

+10-5
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ extension String {
364364
return String(cString: output)
365365
}
366366

367-
#if !NO_FILESYSTEM
367+
#if !NO_FILESYSTEM
368368
internal static func homeDirectoryPath(forUser user: String? = nil) -> String {
369369
#if os(Windows)
370370
if let user {
@@ -525,8 +525,10 @@ extension String {
525525
#else
526526
return "/tmp/"
527527
#endif
528-
#endif
528+
#endif // os(Windows)
529529
}
530+
#endif // !NO_FILESYSTEM
531+
530532
/// Replaces any number of sequential `/`
531533
/// characters with /
532534
/// NOTE: Internal so it's testable
@@ -565,7 +567,7 @@ extension String {
565567
}
566568
}
567569

568-
private var _droppingTrailingSlashes: String {
570+
internal var _droppingTrailingSlashes: String {
569571
guard !self.isEmpty else {
570572
return self
571573
}
@@ -575,7 +577,9 @@ extension String {
575577
}
576578
return String(self[...lastNonSlash])
577579
}
578-
580+
581+
#if !NO_FILESYSTEM
582+
579583
static var NETWORK_PREFIX: String { #"\\"# }
580584

581585
private var _standardizingPath: String {
@@ -612,7 +616,8 @@ extension String {
612616
var standardizingPath: String {
613617
expandingTildeInPath._standardizingPath
614618
}
615-
#endif // !NO_FILESYSTEM
619+
620+
#endif // !NO_FILESYSTEM
616621

617622
// _NSPathComponents
618623
var pathComponents: [String] {

Sources/FoundationEssentials/URL/URL.swift

+1-5
Original file line numberDiff line numberDiff line change
@@ -1320,12 +1320,8 @@ public struct URL: Equatable, Sendable, Hashable {
13201320
}
13211321

13221322
private static func fileSystemPath(for urlPath: String) -> String {
1323-
var result = urlPath
1324-
if result.count > 1 && result.utf8.last == UInt8(ascii: "/") {
1325-
_ = result.popLast()
1326-
}
13271323
let charsToLeaveEncoded: Set<UInt8> = [._slash, 0]
1328-
return Parser.percentDecode(result, excluding: charsToLeaveEncoded) ?? ""
1324+
return Parser.percentDecode(urlPath._droppingTrailingSlashes, excluding: charsToLeaveEncoded) ?? ""
13291325
}
13301326

13311327
var fileSystemPath: String {

Tests/FoundationEssentialsTests/URLTests.swift

+15
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,21 @@ final class URLTests : XCTestCase {
571571
XCTAssertEqual(appended.relativePath, "relative/with:slash")
572572
}
573573

574+
func testURLFilePathDropsTrailingSlashes() throws {
575+
var url = URL(filePath: "/path/slashes///")
576+
XCTAssertEqual(url.path(), "/path/slashes///")
577+
// TODO: Update this once .fileSystemPath uses backslashes for Windows
578+
XCTAssertEqual(url.fileSystemPath, "/path/slashes")
579+
580+
url = URL(filePath: "/path/slashes/")
581+
XCTAssertEqual(url.path(), "/path/slashes/")
582+
XCTAssertEqual(url.fileSystemPath, "/path/slashes")
583+
584+
url = URL(filePath: "/path/slashes")
585+
XCTAssertEqual(url.path(), "/path/slashes")
586+
XCTAssertEqual(url.fileSystemPath, "/path/slashes")
587+
}
588+
574589
func testURLHostRetainsIDNAEncoding() throws {
575590
let url = URL(string: "ftp://user:password@*.xn--poema-9qae5a.com.br:4343/cat.txt")!
576591
XCTAssertEqual(url.host, "*.xn--poema-9qae5a.com.br")

0 commit comments

Comments
 (0)