Skip to content

Commit e83bb44

Browse files
committed
fix(command): handle artifact HTTP errors
1 parent dc7a326 commit e83bb44

2 files changed

Lines changed: 46 additions & 1 deletion

File tree

crates/skilld-command/src/remote.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,9 @@ impl SkilldRemote {
854854
if !(200..300).contains(&response.status) {
855855
return Err(match allowed {
856856
AllowedOrigin::Github => github_error(&response),
857-
AllowedOrigin::Service(_) => problem_error(&response),
857+
AllowedOrigin::Service(_) | AllowedOrigin::Artifact(_) => {
858+
problem_error(&response)
859+
}
858860
});
859861
}
860862
return Ok(response);

crates/skilld-command/tests/remote.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1776,6 +1776,49 @@ fn a_public_grant_may_serve_content_from_a_service_subdomain() {
17761776
);
17771777
}
17781778

1779+
#[test]
1780+
fn artifact_download_errors_preserve_problem_details_and_http_fallbacks() {
1781+
for (body, code, message) in [
1782+
(
1783+
serde_json::to_vec(&json!({
1784+
"type": "about:blank",
1785+
"title": "Artifact revoked",
1786+
"status": 410,
1787+
"code": "ARTIFACT_REVOKED",
1788+
"detail": "The artifact was revoked."
1789+
}))
1790+
.unwrap(),
1791+
"ARTIFACT_REVOKED",
1792+
"The artifact was revoked.",
1793+
),
1794+
(
1795+
b"Gone".to_vec(),
1796+
"SERVICE_UNAVAILABLE",
1797+
"the remote service returned HTTP 410",
1798+
),
1799+
] {
1800+
let (pin, mut responses) = verified_remote_responses();
1801+
let mut grant: serde_json::Value = serde_json::from_slice(&responses[2].body).unwrap();
1802+
grant["contentUrl"] = json!("https://artifacts.skilld.dev/sha256/example");
1803+
responses[2] = response(200, serde_json::to_vec(&grant).unwrap());
1804+
responses[3] = response(410, body);
1805+
let remote = SkilldRemote::new(
1806+
Arc::new(FakeHttp::with(responses)),
1807+
Arc::new(NoTokenProvider),
1808+
NativeRemoteConfig::Pinned(pin),
1809+
)
1810+
.with_endpoint("https://skilld.dev")
1811+
.unwrap()
1812+
.with_sleeper(Arc::new(NoSleep));
1813+
1814+
let selector = RemoteSelector::parse("skilld:skilld-dev/skills/example").unwrap();
1815+
let error = remote.prepare(&selector, false).unwrap_err();
1816+
1817+
assert_eq!(error.code, code);
1818+
assert_eq!(error.message, message);
1819+
}
1820+
}
1821+
17791822
#[test]
17801823
fn a_public_grant_on_an_unrelated_origin_is_rejected_before_download() {
17811824
let (pin, mut responses) = verified_remote_responses();

0 commit comments

Comments
 (0)