@@ -8,6 +8,7 @@ use std::io::Cursor;
88
99use curl:: easy:: { Easy , List } ;
1010use failure:: bail;
11+ use http:: status:: StatusCode ;
1112use serde:: { Deserialize , Serialize } ;
1213use serde_json;
1314use url:: percent_encoding:: { percent_encode, QUERY_ENCODE_SET } ;
@@ -323,30 +324,31 @@ fn handle(handle: &mut Easy, read: &mut dyn FnMut(&mut [u8]) -> usize) -> Result
323324 handle. perform ( ) ?;
324325 }
325326
326- match handle. response_code ( ) ? {
327- 0 => { } // file upload url sometimes
328- 200 => { }
329- 403 => bail ! ( "received 403 unauthorized response code" ) ,
330- 404 => bail ! ( "received 404 not found response code" ) ,
331- code => bail ! (
327+ let body = match String :: from_utf8 ( body) {
328+ Ok ( body) => body,
329+ Err ( ..) => bail ! ( "response body was not valid utf-8" ) ,
330+ } ;
331+ let errors = serde_json:: from_str :: < ApiErrorList > ( & body) . ok ( ) . map ( |s| {
332+ s. errors . into_iter ( ) . map ( |s| s. detail ) . collect :: < Vec < _ > > ( )
333+ } ) ;
334+
335+ match ( handle. response_code ( ) ?, errors) {
336+ ( 0 , None ) | ( 200 , None ) => { } ,
337+ ( code, Some ( errors) ) => {
338+ let code = StatusCode :: from_u16 ( code as _ ) ?;
339+ bail ! ( "api errors (status {}): {}" , code, errors. join( ", " ) )
340+ }
341+ ( code, None ) => bail ! (
332342 "failed to get a 200 OK response, got {}\n \
333343 headers:\n \
334344 \t {}\n \
335345 body:\n \
336346 {}",
337- code,
338- headers. join( "\n \t " ) ,
339- String :: from_utf8_lossy ( & body)
347+ code,
348+ headers. join( "\n \t " ) ,
349+ body,
340350 ) ,
341351 }
342352
343- let body = match String :: from_utf8 ( body) {
344- Ok ( body) => body,
345- Err ( ..) => bail ! ( "response body was not valid utf-8" ) ,
346- } ;
347- if let Ok ( errors) = serde_json:: from_str :: < ApiErrorList > ( & body) {
348- let errors = errors. errors . into_iter ( ) . map ( |s| s. detail ) ;
349- bail ! ( "api errors: {}" , errors. collect:: <Vec <_>>( ) . join( ", " ) ) ;
350- }
351353 Ok ( body)
352354}
0 commit comments