@@ -10,8 +10,8 @@ use log::warn;
10
10
use rusoto_core:: { region:: Region , RusotoError } ;
11
11
use rusoto_credential:: DefaultCredentialsProvider ;
12
12
use rusoto_s3:: {
13
- DeleteObjectsRequest , GetObjectError , GetObjectRequest , ListObjectsV2Request , ObjectIdentifier ,
14
- PutObjectRequest , S3Client , S3 ,
13
+ DeleteObjectsRequest , GetObjectError , GetObjectRequest , HeadObjectError , HeadObjectRequest ,
14
+ ListObjectsV2Request , ObjectIdentifier , PutObjectRequest , S3Client , S3 ,
15
15
} ;
16
16
use std:: { convert:: TryInto , io:: Write } ;
17
17
use tokio:: runtime:: Runtime ;
@@ -56,15 +56,18 @@ impl S3Backend {
56
56
57
57
pub ( super ) fn exists ( & self , path : & str ) -> Result < bool , Error > {
58
58
self . runtime . handle ( ) . block_on ( async {
59
- let resp = self
60
- . client
61
- . list_objects_v2 ( ListObjectsV2Request {
62
- bucket : self . bucket . clone ( ) ,
63
- prefix : Some ( path. into ( ) ) ,
64
- ..Default :: default ( )
65
- } )
66
- . await ?;
67
- Ok ( resp. key_count . unwrap ( ) > 0 )
59
+ let req = HeadObjectRequest {
60
+ bucket : self . bucket . clone ( ) ,
61
+ key : path. into ( ) ,
62
+ ..Default :: default ( )
63
+ } ;
64
+ let resp = self . client . head_object ( req) . await ;
65
+ match resp {
66
+ Ok ( _) => Ok ( true ) ,
67
+ Err ( RusotoError :: Service ( HeadObjectError :: NoSuchKey ( _) ) ) => Ok ( false ) ,
68
+ Err ( RusotoError :: Unknown ( resp) ) if resp. status == 404 => Ok ( false ) ,
69
+ Err ( other) => Err ( other. into ( ) ) ,
70
+ }
68
71
} )
69
72
}
70
73
0 commit comments