@@ -176,15 +176,25 @@ await Parallel.ForEachAsync(localObjects, ctx, async (localFile, token) =>
176
176
MaxKeys = 1000
177
177
} ;
178
178
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
+
179
186
var readToCompletion = true ;
180
187
ListObjectsV2Response response ;
181
188
do
182
189
{
183
190
response = await s3Client . ListObjectsV2Async ( listBucketRequest , ctx ) ;
184
191
if ( response is null or { S3Objects : null } )
185
192
{
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
+ }
188
198
break ;
189
199
}
190
200
objects . AddRange ( response . S3Objects ) ;
@@ -193,4 +203,21 @@ await Parallel.ForEachAsync(localObjects, ctx, async (localFile, token) =>
193
203
194
204
return ( readToCompletion , objects . ToDictionary ( o => o . Key ) ) ;
195
205
}
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
+ }
196
223
}
0 commit comments