@@ -4,7 +4,7 @@ use anyhow::{Context as _, Error};
4
4
use aws_config:: BehaviorVersion ;
5
5
use aws_sdk_s3:: {
6
6
config:: { retry:: RetryConfig , Region } ,
7
- error:: SdkError ,
7
+ error:: { ProvideErrorMetadata , SdkError } ,
8
8
operation:: { get_object:: GetObjectError , head_object:: HeadObjectError } ,
9
9
types:: { Delete , ObjectIdentifier , Tag , Tagging } ,
10
10
Client ,
@@ -21,6 +21,19 @@ use tracing::{error, warn};
21
21
const PUBLIC_ACCESS_TAG : & str = "static-cloudfront-access" ;
22
22
const PUBLIC_ACCESS_VALUE : & str = "allow" ;
23
23
24
+ fn err_is_not_found < E > ( err : & SdkError < E > ) -> bool
25
+ where
26
+ E : ProvideErrorMetadata ,
27
+ {
28
+ match err {
29
+ SdkError :: ServiceError ( err) => {
30
+ err. raw ( ) . status ( ) . as_u16 ( ) == http:: StatusCode :: NOT_FOUND . as_u16 ( )
31
+ }
32
+ e if e. code ( ) == Some ( "KeyTooLongError" ) => true ,
33
+ _ => false ,
34
+ }
35
+ }
36
+
24
37
pub ( super ) struct S3Backend {
25
38
client : Client ,
26
39
bucket : String ,
@@ -78,11 +91,11 @@ impl S3Backend {
78
91
{
79
92
Ok ( _) => Ok ( true ) ,
80
93
Err ( SdkError :: ServiceError ( err) )
81
- if ( matches ! ( err. err( ) , HeadObjectError :: NotFound ( _) )
82
- || err. raw ( ) . status ( ) . as_u16 ( ) == http:: StatusCode :: NOT_FOUND . as_u16 ( ) ) =>
94
+ if matches ! ( err. err( ) , HeadObjectError :: NotFound ( _) ) =>
83
95
{
84
96
Ok ( false )
85
97
}
98
+ Err ( err) if err_is_not_found ( & err) => Ok ( false ) ,
86
99
Err ( other) => Err ( other. into ( ) ) ,
87
100
}
88
101
}
@@ -101,13 +114,7 @@ impl S3Backend {
101
114
. iter ( )
102
115
. filter ( |tag| tag. key ( ) == PUBLIC_ACCESS_TAG )
103
116
. any ( |tag| tag. value ( ) == PUBLIC_ACCESS_VALUE ) ) ,
104
- Err ( SdkError :: ServiceError ( err) ) => {
105
- if err. raw ( ) . status ( ) . as_u16 ( ) == http:: StatusCode :: NOT_FOUND . as_u16 ( ) {
106
- Err ( super :: PathNotFoundError . into ( ) )
107
- } else {
108
- Err ( err. into_err ( ) . into ( ) )
109
- }
110
- }
117
+ Err ( err) if err_is_not_found ( & err) => Err ( super :: PathNotFoundError . into ( ) ) ,
111
118
Err ( other) => Err ( other. into ( ) ) ,
112
119
}
113
120
}
@@ -139,13 +146,7 @@ impl S3Backend {
139
146
. await
140
147
{
141
148
Ok ( _) => Ok ( ( ) ) ,
142
- Err ( SdkError :: ServiceError ( err) ) => {
143
- if err. raw ( ) . status ( ) . as_u16 ( ) == http:: StatusCode :: NOT_FOUND . as_u16 ( ) {
144
- Err ( super :: PathNotFoundError . into ( ) )
145
- } else {
146
- Err ( err. into_err ( ) . into ( ) )
147
- }
148
- }
149
+ Err ( err) if err_is_not_found ( & err) => Err ( super :: PathNotFoundError . into ( ) ) ,
149
150
Err ( other) => Err ( other. into ( ) ) ,
150
151
}
151
152
}
@@ -163,16 +164,16 @@ impl S3Backend {
163
164
. key ( path)
164
165
. set_range ( range. map ( |r| format ! ( "bytes={}-{}" , r. start( ) , r. end( ) ) ) )
165
166
. send ( )
167
+ . await
166
168
. map_err ( |err| match err {
167
169
SdkError :: ServiceError ( err)
168
- if ( matches ! ( err. err( ) , GetObjectError :: NoSuchKey ( _) )
169
- || err. raw ( ) . status ( ) . as_u16 ( ) == http:: StatusCode :: NOT_FOUND . as_u16 ( ) ) =>
170
+ if matches ! ( err. err( ) , GetObjectError :: NoSuchKey ( _) ) =>
170
171
{
171
172
super :: PathNotFoundError . into ( )
172
173
}
174
+ err if err_is_not_found ( & err) => super :: PathNotFoundError . into ( ) ,
173
175
err => Error :: from ( err) ,
174
- } )
175
- . await ?;
176
+ } ) ?;
176
177
177
178
let mut content = crate :: utils:: sized_buffer:: SizedBuffer :: new ( max_size) ;
178
179
content. reserve (
0 commit comments