@@ -258,7 +258,13 @@ public extension HubApi {
258258 /// - Throws: HubClientError if the repository cannot be accessed or parsed
259259 func getFilenames( from repo: Repo , revision: String = " main " , matching globs: [ String ] = [ ] ) async throws -> [ String ] {
260260 // Read repo info and only parse "siblings"
261- let url = URL ( string: " \( endpoint) /api/ \( repo. type) / \( repo. id) /revision/ \( revision) " ) !
261+ // Using appendingPathComponent ensures proper URL encoding of each path segment
262+ let url = URL ( string: endpoint) !
263+ . appendingPathComponent ( " api " )
264+ . appendingPathComponent ( repo. type. rawValue)
265+ . appendingPathComponent ( repo. id)
266+ . appendingPathComponent ( " revision " )
267+ . appendingPathComponent ( revision)
262268 let ( data, _) = try await httpGet ( for: url)
263269 let response = try JSONDecoder ( ) . decode ( SiblingsResponse . self, from: data)
264270 let filenames = response. siblings. map { $0. rfilename }
@@ -333,7 +339,9 @@ public extension HubApi {
333339 func whoami( ) async throws -> Config {
334340 guard hfToken != nil else { throw Hub . HubClientError. authorizationRequired }
335341
336- let url = URL ( string: " \( endpoint) /api/whoami-v2 " ) !
342+ let url = URL ( string: endpoint) !
343+ . appendingPathComponent ( " api " )
344+ . appendingPathComponent ( " whoami-v2 " )
337345 let ( data, _) = try await httpGet ( for: url)
338346
339347 let parsed = try JSONSerialization . jsonObject ( with: data, options: [ ] )
@@ -460,13 +468,15 @@ public extension HubApi {
460468
461469 var source : URL {
462470 // https://huggingface.co/coreml-projects/Llama-2-7b-chat-coreml/resolve/main/tokenizer.json?download=true
471+ // Using appendingPathComponent ensures proper URL encoding of each path segment
463472 var url = URL ( string: endpoint ?? " https://huggingface.co " ) !
464473 if repo. type != . models {
465- url = url. appending ( component : repo. type. rawValue)
474+ url = url. appendingPathComponent ( repo. type. rawValue)
466475 }
467- url = url. appending ( path: repo. id)
468- url = url. appending ( path: " resolve/ \( revision) " )
469- url = url. appending ( path: relativeFilename)
476+ url = url. appendingPathComponent ( repo. id)
477+ url = url. appendingPathComponent ( " resolve " )
478+ url = url. appendingPathComponent ( revision)
479+ url = url. appendingPathComponent ( relativeFilename)
470480 return url
471481 }
472482
@@ -792,7 +802,11 @@ public extension HubApi {
792802
793803 func getFileMetadata( from repo: Repo , revision: String = " main " , matching globs: [ String ] = [ ] ) async throws -> [ FileMetadata ] {
794804 let files = try await getFilenames ( from: repo, matching: globs)
795- let url = URL ( string: " \( endpoint) / \( repo. id) /resolve/ \( revision) " ) !
805+ // Using appendingPathComponent ensures proper URL encoding of each path segment
806+ let url = URL ( string: endpoint) !
807+ . appendingPathComponent ( repo. id)
808+ . appendingPathComponent ( " resolve " )
809+ . appendingPathComponent ( revision)
796810 var selectedMetadata : [ FileMetadata ] = [ ]
797811 for file in files {
798812 let fileURL = url. appending ( path: file)
0 commit comments