22
22
log:: warn,
23
23
sha2:: Digest ,
24
24
std:: {
25
+ error:: Error ,
25
26
fs:: File ,
26
27
io:: { Read , Seek , SeekFrom , Write } ,
27
28
path:: { Path , PathBuf } ,
@@ -381,27 +382,34 @@ impl Notarizer {
381
382
let start_time = std:: time:: Instant :: now ( ) ;
382
383
383
384
loop {
384
- let status = self . get_submission ( submission_id) ?;
385
-
386
- let elapsed = start_time. elapsed ( ) ;
387
-
388
- warn ! (
389
- "poll state after {}s: {:?}" ,
390
- elapsed. as_secs( ) ,
391
- status. data. attributes. status
392
- ) ;
393
-
394
- if status. data . attributes . status != notary_api:: SubmissionResponseStatus :: InProgress {
395
- warn ! ( "Notary API Server has finished processing the uploaded asset" ) ;
396
-
397
- return Ok ( status) ;
385
+ match self . get_submission ( submission_id) {
386
+ Ok ( status) => {
387
+ let elapsed = start_time. elapsed ( ) ;
388
+
389
+ warn ! (
390
+ "poll state after {}s: {:?}" ,
391
+ elapsed. as_secs( ) ,
392
+ status. data. attributes. status
393
+ ) ;
394
+
395
+ if status. data . attributes . status != notary_api:: SubmissionResponseStatus :: InProgress {
396
+ warn ! ( "Notary API Server has finished processing the uploaded asset" ) ;
397
+
398
+ return Ok ( status) ;
399
+ }
400
+ } ,
401
+ Err ( e) => {
402
+ if !is_transient_error ( & e) {
403
+ return Err ( e)
404
+ }
405
+ }
398
406
}
399
407
408
+ let elapsed = start_time. elapsed ( ) ;
400
409
if elapsed >= wait_limit {
401
410
warn ! ( "reached wait limit after {}s" , elapsed. as_secs( ) ) ;
402
411
return Err ( AppleCodesignError :: NotarizeWaitLimitReached ) ;
403
412
}
404
-
405
413
std:: thread:: sleep ( self . wait_poll_interval ) ;
406
414
}
407
415
}
@@ -441,3 +449,29 @@ impl Notarizer {
441
449
Ok ( self . client ( ) ?. list_submissions ( ) ?)
442
450
}
443
451
}
452
+
453
+ fn is_transient_error ( root : & ( dyn Error + ' static ) ) -> bool {
454
+ if let Some :: < & reqwest:: Error > ( reqwest_error) = root. downcast_ref :: < reqwest:: Error > ( ) {
455
+ if reqwest_error. is_timeout ( ) {
456
+ warn ( reqwest_error, 0 ) ;
457
+ return true ;
458
+ }
459
+ if reqwest_error. is_connect ( ) {
460
+ warn ( reqwest_error, 0 ) ;
461
+ return true ;
462
+ }
463
+ }
464
+
465
+ if let Some ( source) = root. source ( ) {
466
+ return is_transient_error ( source)
467
+ }
468
+
469
+ return false
470
+ }
471
+
472
+ fn warn ( error : & ( dyn Error + ' static ) , indent : usize ) {
473
+ warn ! ( "{}{}" , " " . repeat( indent) , error) ;
474
+ if let Some ( source) = error. source ( ) {
475
+ warn ( source, indent + 1 ) ;
476
+ }
477
+ }
0 commit comments