Skip to content

Commit 0d43a5e

Browse files
neonichutomerd
andauthored
Wrap registry login errors (#6556)
* Wrap registry login errors Similar to all other request types, this will guarantee more consistent diagnostics if there are underlying `URLSession` errors etc. Co-authored-by: tomer doron <tomer@apple.com>
1 parent 0efea68 commit 0d43a5e

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

Sources/PackageRegistry/RegistryClient.swift

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,20 +1319,22 @@ public final class RegistryClient: Cancellable {
13191319
let start = DispatchTime.now()
13201320
observabilityScope.emit(info: "logging-in into \(request.url)")
13211321
self.httpClient.execute(request, observabilityScope: observabilityScope, progress: nil) { result in
1322-
completion(
1323-
result.tryMap { response in
1324-
observabilityScope
1325-
.emit(
1326-
debug: "server response for \(request.url): \(response.statusCode) in \(start.distance(to: .now()).descriptionInSeconds)"
1327-
)
1328-
switch response.statusCode {
1329-
case 200:
1330-
return ()
1331-
default:
1332-
throw self.unexpectedStatusError(response, expectedStatus: [200])
1333-
}
1322+
switch result {
1323+
case .success(let response):
1324+
observabilityScope
1325+
.emit(
1326+
debug: "server response for \(request.url): \(response.statusCode) in \(start.distance(to: .now()).descriptionInSeconds)"
1327+
)
1328+
switch response.statusCode {
1329+
case 200:
1330+
return completion(.success(()))
1331+
default:
1332+
let error = self.unexpectedStatusError(response, expectedStatus: [200])
1333+
return completion(.failure(RegistryError.loginFailed(url: loginURL, error: error)))
13341334
}
1335-
)
1335+
case .failure(let error):
1336+
return completion(.failure(RegistryError.loginFailed(url: loginURL, error: error)))
1337+
}
13361338
}
13371339
}
13381340

@@ -1674,6 +1676,7 @@ public enum RegistryError: Error, CustomStringConvertible {
16741676
case unauthorized
16751677
case authenticationMethodNotSupported
16761678
case forbidden
1679+
case loginFailed(url: URL, error: Error)
16771680
case availabilityCheckFailed(registry: Registry, error: Error)
16781681
case registryNotAvailable(Registry)
16791682
case packageNotFound
@@ -1819,6 +1822,8 @@ public enum RegistryError: Error, CustomStringConvertible {
18191822
let previousVersion
18201823
):
18211824
return "the signing entity '\(String(describing: latest))' from \(registry) for \(package) version \(version) is different from the previously recorded value '\(previous)' for version \(previousVersion)"
1825+
case .loginFailed(let url, let error):
1826+
return "registry login using \(url) failed: \(error.interpolationDescription)"
18221827
}
18231828
}
18241829
}

Tests/PackageRegistryTests/RegistryClientTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3165,7 +3165,7 @@ final class RegistryClientTests: XCTestCase {
31653165
)
31663166

31673167
XCTAssertThrowsError(try registryClient.login(loginURL: loginURL)) { error in
3168-
guard case RegistryError.unauthorized = error else {
3168+
guard case RegistryError.loginFailed(_, _) = error else {
31693169
return XCTFail("Expected RegistryError.unauthorized, got \(error)")
31703170
}
31713171
}
@@ -3210,7 +3210,7 @@ final class RegistryClientTests: XCTestCase {
32103210
)
32113211

32123212
XCTAssertThrowsError(try registryClient.login(loginURL: loginURL)) { error in
3213-
guard case RegistryError.authenticationMethodNotSupported = error else {
3213+
guard case RegistryError.loginFailed = error else {
32143214
return XCTFail("Expected RegistryError.authenticationMethodNotSupported, got \(error)")
32153215
}
32163216
}

0 commit comments

Comments
 (0)