@@ -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]
17801823fn a_public_grant_on_an_unrelated_origin_is_rejected_before_download ( ) {
17811824 let ( pin, mut responses) = verified_remote_responses ( ) ;
0 commit comments