11#![ warn( clippy:: all, rust_2018_idioms) ]
22
3- extern crate base64;
4- extern crate chrono;
5- extern crate openssl;
6- extern crate reqwest;
7-
83use base64:: encode;
94use chrono:: prelude:: Utc ;
5+ use openssl:: error:: ErrorStack ;
106use openssl:: hash:: MessageDigest ;
117use openssl:: pkey:: PKey ;
128use openssl:: sign:: Signer ;
13- use reqwest:: header;
9+ use reqwest:: { header, Body , Client , Response } ;
10+
11+ mod error;
12+ pub use error:: Error ;
1413
1514#[ derive( Clone , Debug ) ]
1615pub struct Bucket {
@@ -40,20 +39,20 @@ impl Bucket {
4039
4140 pub fn put < R : std:: io:: Read + Send + ' static > (
4241 & self ,
43- client : & reqwest :: Client ,
42+ client : & Client ,
4443 path : & str ,
4544 content : R ,
4645 content_length : u64 ,
4746 content_type : & str ,
4847 extra_headers : header:: HeaderMap ,
49- ) -> reqwest :: Result < reqwest :: Response > {
48+ ) -> Result < Response , Error > {
5049 let path = if path. starts_with ( '/' ) {
5150 & path[ 1 ..]
5251 } else {
5352 path
5453 } ;
5554 let date = Utc :: now ( ) . to_rfc2822 ( ) ;
56- let auth = self . auth ( "PUT" , & date, path, "" , content_type) ;
55+ let auth = self . auth ( "PUT" , & date, path, "" , content_type) ? ;
5756 let url = self . url ( path) ;
5857
5958 client
@@ -62,23 +61,20 @@ impl Bucket {
6261 . header ( header:: CONTENT_TYPE , content_type)
6362 . header ( header:: DATE , date)
6463 . headers ( extra_headers)
65- . body ( reqwest :: Body :: sized ( content, content_length) )
64+ . body ( Body :: sized ( content, content_length) )
6665 . send ( ) ?
6766 . error_for_status ( )
67+ . map_err ( Into :: into)
6868 }
6969
70- pub fn delete (
71- & self ,
72- client : & reqwest:: Client ,
73- path : & str ,
74- ) -> reqwest:: Result < reqwest:: Response > {
70+ pub fn delete ( & self , client : & Client , path : & str ) -> Result < Response , Error > {
7571 let path = if path. starts_with ( '/' ) {
7672 & path[ 1 ..]
7773 } else {
7874 path
7975 } ;
8076 let date = Utc :: now ( ) . to_rfc2822 ( ) ;
81- let auth = self . auth ( "DELETE" , & date, path, "" , "" ) ;
77+ let auth = self . auth ( "DELETE" , & date, path, "" , "" ) ? ;
8278 let url = self . url ( path) ;
8379
8480 client
@@ -87,6 +83,7 @@ impl Bucket {
8783 . header ( header:: AUTHORIZATION , auth)
8884 . send ( ) ?
8985 . error_for_status ( )
86+ . map_err ( Into :: into)
9087 }
9188
9289 pub fn host ( & self ) -> String {
@@ -101,7 +98,14 @@ impl Bucket {
10198 )
10299 }
103100
104- fn auth ( & self , verb : & str , date : & str , path : & str , md5 : & str , content_type : & str ) -> String {
101+ fn auth (
102+ & self ,
103+ verb : & str ,
104+ date : & str ,
105+ path : & str ,
106+ md5 : & str ,
107+ content_type : & str ,
108+ ) -> Result < String , ErrorStack > {
105109 let string = format ! (
106110 "{verb}\n {md5}\n {ty}\n {date}\n {headers}{resource}" ,
107111 verb = verb,
@@ -112,12 +116,12 @@ impl Bucket {
112116 resource = format!( "/{}/{}" , self . name, path)
113117 ) ;
114118 let signature = {
115- let key = PKey :: hmac ( self . secret_key . as_bytes ( ) ) . unwrap ( ) ;
116- let mut signer = Signer :: new ( MessageDigest :: sha1 ( ) , & key) . unwrap ( ) ;
117- signer. update ( string. as_bytes ( ) ) . unwrap ( ) ;
118- encode ( & signer. sign_to_vec ( ) . unwrap ( ) [ ..] )
119+ let key = PKey :: hmac ( self . secret_key . as_bytes ( ) ) ? ;
120+ let mut signer = Signer :: new ( MessageDigest :: sha1 ( ) , & key) ? ;
121+ signer. update ( string. as_bytes ( ) ) ? ;
122+ encode ( & signer. sign_to_vec ( ) ? [ ..] )
119123 } ;
120- format ! ( "AWS {}:{}" , self . access_key, signature)
124+ Ok ( format ! ( "AWS {}:{}" , self . access_key, signature) )
121125 }
122126
123127 fn url ( & self , path : & str ) -> String {
0 commit comments