@@ -69,6 +69,12 @@ pub enum BackendError {
6969
7070 #[ error( "xml parse error: {0}" ) ]
7171 XmlParseError ( String ) ,
72+
73+ #[ error( transparent) ]
74+ AzureError ( #[ from] AzureError ) ,
75+
76+ #[ error( "s3 error: {0}" ) ]
77+ S3Error ( String ) ,
7278}
7379
7480impl error:: ResponseError for BackendError {
@@ -95,6 +101,8 @@ impl error::ResponseError for BackendError {
95101 BackendError :: UnsupportedAuthMethod ( _) => HttpResponse :: BadRequest ( ) . finish ( ) ,
96102 BackendError :: UnsupportedOperation ( _) => HttpResponse :: BadRequest ( ) . finish ( ) ,
97103 BackendError :: XmlParseError ( _) => HttpResponse :: InternalServerError ( ) . finish ( ) ,
104+ BackendError :: AzureError ( _) => HttpResponse :: BadGateway ( ) . finish ( ) ,
105+ BackendError :: S3Error ( _) => HttpResponse :: BadGateway ( ) . finish ( ) ,
98106 }
99107 }
100108
@@ -118,56 +126,83 @@ impl error::ResponseError for BackendError {
118126 BackendError :: UnsupportedAuthMethod ( _) => StatusCode :: BAD_REQUEST ,
119127 BackendError :: UnsupportedOperation ( _) => StatusCode :: BAD_REQUEST ,
120128 BackendError :: XmlParseError ( _) => StatusCode :: INTERNAL_SERVER_ERROR ,
129+ BackendError :: AzureError ( _) => StatusCode :: BAD_GATEWAY ,
130+ BackendError :: S3Error ( _) => StatusCode :: BAD_GATEWAY ,
121131 }
122132 }
123133}
124134
125- // Azure API Errors
126- impl From < AzureError > for BackendError {
127- fn from ( error : AzureError ) -> BackendError {
128- BackendError :: UnexpectedApiError ( error. to_string ( ) )
135+ fn get_rusoto_error_message < T : std:: error:: Error > (
136+ operation : & str ,
137+ error : RusotoError < T > ,
138+ ) -> String {
139+ match error {
140+ RusotoError :: Service ( error) => {
141+ format ! ( "{} Service Error: {}" , operation, error. to_string( ) )
142+ }
143+ RusotoError :: HttpDispatch ( error) => {
144+ format ! ( "{} HttpDispatch Error: {}" , operation, error. to_string( ) )
145+ }
146+ RusotoError :: Credentials ( error) => {
147+ format ! ( "{} Credentials Error: {}" , operation, error. to_string( ) )
148+ }
149+ RusotoError :: Validation ( error) => {
150+ format ! ( "{} Validation Error: {}" , operation, error. to_string( ) )
151+ }
152+ RusotoError :: ParseError ( error) => {
153+ format ! ( "{} Parse Error: {}" , operation, error. to_string( ) )
154+ }
155+ RusotoError :: Unknown ( error) => {
156+ format ! (
157+ "{} Unknown Error: status {}, body {}" ,
158+ operation,
159+ error. status,
160+ error. body_as_str( ) ,
161+ )
162+ }
163+ RusotoError :: Blocking => format ! ( "{} Blocking Error" , operation, ) ,
129164 }
130165}
131166
132167// S3 API Errors
133168impl From < RusotoError < HeadObjectError > > for BackendError {
134169 fn from ( error : RusotoError < HeadObjectError > ) -> BackendError {
135- BackendError :: UnexpectedApiError ( error . to_string ( ) )
170+ BackendError :: S3Error ( get_rusoto_error_message ( "HeadObject" , error ) )
136171 }
137172}
138173impl From < RusotoError < DeleteObjectError > > for BackendError {
139174 fn from ( error : RusotoError < DeleteObjectError > ) -> BackendError {
140- BackendError :: UnexpectedApiError ( error . to_string ( ) )
175+ BackendError :: S3Error ( get_rusoto_error_message ( "DeleteObject" , error ) )
141176 }
142177}
143178impl From < RusotoError < PutObjectError > > for BackendError {
144179 fn from ( error : RusotoError < PutObjectError > ) -> BackendError {
145- BackendError :: UnexpectedApiError ( error . to_string ( ) )
180+ BackendError :: S3Error ( get_rusoto_error_message ( "PutObject" , error ) )
146181 }
147182}
148183impl From < RusotoError < CreateMultipartUploadError > > for BackendError {
149184 fn from ( error : RusotoError < CreateMultipartUploadError > ) -> BackendError {
150- BackendError :: UnexpectedApiError ( error . to_string ( ) )
185+ BackendError :: S3Error ( get_rusoto_error_message ( "CreateMultipartUpload" , error ) )
151186 }
152187}
153188impl From < RusotoError < AbortMultipartUploadError > > for BackendError {
154189 fn from ( error : RusotoError < AbortMultipartUploadError > ) -> BackendError {
155- BackendError :: UnexpectedApiError ( error . to_string ( ) )
190+ BackendError :: S3Error ( get_rusoto_error_message ( "AbortMultipartUpload" , error ) )
156191 }
157192}
158193impl From < RusotoError < CompleteMultipartUploadError > > for BackendError {
159194 fn from ( error : RusotoError < CompleteMultipartUploadError > ) -> BackendError {
160- BackendError :: UnexpectedApiError ( error . to_string ( ) )
195+ BackendError :: S3Error ( get_rusoto_error_message ( "CompleteMultipartUpload" , error ) )
161196 }
162197}
163198impl From < RusotoError < UploadPartError > > for BackendError {
164199 fn from ( error : RusotoError < UploadPartError > ) -> BackendError {
165- BackendError :: UnexpectedApiError ( error . to_string ( ) )
200+ BackendError :: S3Error ( get_rusoto_error_message ( "UploadPart" , error ) )
166201 }
167202}
168203impl From < RusotoError < ListObjectsV2Error > > for BackendError {
169204 fn from ( error : RusotoError < ListObjectsV2Error > ) -> BackendError {
170- BackendError :: UnexpectedApiError ( error . to_string ( ) )
205+ BackendError :: S3Error ( get_rusoto_error_message ( "ListObjectsV2" , error ) )
171206 }
172207}
173208
0 commit comments