Skip to content

Commit fde6255

Browse files
committed
Fix Hub API URL construction
1 parent 18ccbd2 commit fde6255

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

Sources/Hub/HubApi.swift

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)