@@ -176,15 +176,25 @@ await Parallel.ForEachAsync(localObjects, ctx, async (localFile, token) =>
176176 MaxKeys = 1000
177177 } ;
178178 var objects = new List < S3Object > ( ) ;
179+ var bucketExists = await S3BucketExists ( ctx ) ;
180+ if ( ! bucketExists )
181+ {
182+ context . Collector . EmitGlobalError ( "Bucket does not exist, cannot list objects" ) ;
183+ return ( false , objects . ToDictionary ( o => o . Key ) ) ;
184+ }
185+
179186 var readToCompletion = true ;
180187 ListObjectsV2Response response ;
181188 do
182189 {
183190 response = await s3Client . ListObjectsV2Async ( listBucketRequest , ctx ) ;
184191 if ( response is null or { S3Objects : null } )
185192 {
186- context . Collector . EmitGlobalError ( "Failed to list objects in S3 to completion" ) ;
187- readToCompletion = false ;
193+ if ( response ? . IsTruncated == true )
194+ {
195+ context . Collector . EmitGlobalError ( "Failed to list objects in S3 to completion" ) ;
196+ readToCompletion = false ;
197+ }
188198 break ;
189199 }
190200 objects . AddRange ( response . S3Objects ) ;
@@ -193,4 +203,21 @@ await Parallel.ForEachAsync(localObjects, ctx, async (localFile, token) =>
193203
194204 return ( readToCompletion , objects . ToDictionary ( o => o . Key ) ) ;
195205 }
206+
207+ private async Task < bool > S3BucketExists ( Cancel ctx )
208+ {
209+ //https://docs.aws.amazon.com/code-library/latest/ug/s3_example_s3_Scenario_DoesBucketExist_section.html
210+ try
211+ {
212+ _ = await s3Client . GetBucketAclAsync ( new GetBucketAclRequest
213+ {
214+ BucketName = bucketName
215+ } , ctx ) ;
216+ return true ;
217+ }
218+ catch
219+ {
220+ return false ;
221+ }
222+ }
196223}
0 commit comments