Skip to content

PackageRegistry: improve error handling of availability check #6506

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 1, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 35 additions & 24 deletions Sources/PackageRegistry/RegistryClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -361,12 +361,13 @@ public final class RegistryClient: Cancellable {
}

SignatureValidation.extractSigningEntity(
signature: [UInt8](signatureData),
signatureFormat: signatureFormat,
configuration: configuration,
fileSystem: fileSystem,
completion: wrappedCompletion
) }
signature: [UInt8](signatureData),
signatureFormat: signatureFormat,
configuration: configuration,
fileSystem: fileSystem,
completion: wrappedCompletion
)
}
}
)
},
Expand Down Expand Up @@ -1534,25 +1535,26 @@ public final class RegistryClient: Cancellable {
let start = DispatchTime.now()
observabilityScope.emit(info: "checking availability of \(registry.url) using \(request.url)")
self.httpClient.execute(request, observabilityScope: observabilityScope, progress: nil) { result in
completion(
result.tryMap { response in
observabilityScope
.emit(
debug: "server response for \(request.url): \(response.statusCode) in \(start.distance(to: .now()).descriptionInSeconds)"
)
switch response.statusCode {
case 200:
return .available
case let value where AvailabilityStatus.unavailableStatusCodes.contains(value):
return .unavailable
default:
if let error = try? response.parseError(decoder: self.jsonDecoder) {
return .error(error.detail)
}
return .error("unknown server error (\(response.statusCode))")
switch result {
case .success(let response):
observabilityScope
.emit(
debug: "server response for \(request.url): \(response.statusCode) in \(start.distance(to: .now()).descriptionInSeconds)"
)
switch response.statusCode {
case 200:
return completion(.success(.available))
case let value where AvailabilityStatus.unavailableStatusCodes.contains(value):
return completion(.success(.unavailable))
default:
if let error = try? response.parseError(decoder: self.jsonDecoder) {
return completion(.success(.error(error.detail)))
}
return completion(.success(.error("unknown server error (\(response.statusCode))")))
}
)
case .failure(let error):
return completion(.failure(RegistryError.availabilityCheckFailed(registry: registry, error: error)))
}
}
}

Expand Down Expand Up @@ -1671,6 +1673,7 @@ public enum RegistryError: Error, CustomStringConvertible {
case unauthorized
case authenticationMethodNotSupported
case forbidden
case availabilityCheckFailed(registry: Registry, error: Error)
case registryNotAvailable(Registry)
case packageNotFound
case packageVersionNotFound
Expand Down Expand Up @@ -1770,6 +1773,8 @@ public enum RegistryError: Error, CustomStringConvertible {
return "authentication method not supported"
case .forbidden:
return "forbidden"
case .availabilityCheckFailed(let registry, let error):
return "failed checking availability of registry at '\(registry.url)': \(error.interpolationDescription)"
case .registryNotAvailable(let registry):
return "registry at '\(registry.url)' is not available at this time, please try again later"
case .packageNotFound:
Expand Down Expand Up @@ -1870,7 +1875,13 @@ extension RegistryClient {
public let signing: Signing?
public let signingEntity: SigningEntity?

public init(name: String, type: String, checksum: String?, signing: Signing?, signingEntity: SigningEntity?) {
public init(
name: String,
type: String,
checksum: String?,
signing: Signing?,
signingEntity: SigningEntity?
) {
self.name = name
self.type = type
self.checksum = checksum
Expand Down