11use prost:: Message ;
2- use reqwest;
32use reqwest:: header:: CONTENT_TYPE ;
43use reqwest:: Client ;
4+ use std:: collections:: HashMap ;
55use std:: default:: Default ;
6+ use std:: sync:: Arc ;
67
78use crate :: error:: VssError ;
9+ use crate :: headers:: get_headermap;
10+ use crate :: headers:: FixedHeaders ;
11+ use crate :: headers:: VssHeaderProvider ;
812use crate :: types:: {
913 DeleteObjectRequest , DeleteObjectResponse , GetObjectRequest , GetObjectResponse , ListKeyVersionsRequest ,
1014 ListKeyVersionsResponse , PutObjectRequest , PutObjectResponse ,
2327 base_url : String ,
2428 client : Client ,
2529 retry_policy : R ,
30+ header_provider : Arc < dyn VssHeaderProvider > ,
2631}
2732
2833impl < R : RetryPolicy < E = VssError > > VssClient < R > {
@@ -34,7 +39,19 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {
3439
3540 /// Constructs a [`VssClient`] from a given [`reqwest::Client`], using `base_url` as the VSS server endpoint.
3641 pub fn from_client ( base_url : & str , client : Client , retry_policy : R ) -> Self {
37- Self { base_url : String :: from ( base_url) , client, retry_policy }
42+ Self {
43+ base_url : String :: from ( base_url) ,
44+ client,
45+ retry_policy,
46+ header_provider : Arc :: new ( FixedHeaders :: new ( HashMap :: new ( ) ) ) ,
47+ }
48+ }
49+
50+ /// Constructs a [`VssClient`] using `base_url` as the VSS server endpoint.
51+ /// HTTP headers will be provided by the given `header_provider`.
52+ pub fn new_with_headers ( base_url : & str , retry_policy : R , header_provider : Arc < dyn VssHeaderProvider > ) -> Self {
53+ let client = Client :: new ( ) ;
54+ Self { base_url : String :: from ( base_url) , client, retry_policy, header_provider }
3855 }
3956
4057 /// Returns the underlying base URL.
@@ -111,10 +128,17 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {
111128
112129 async fn post_request < Rq : Message , Rs : Message + Default > ( & self , request : & Rq , url : & str ) -> Result < Rs , VssError > {
113130 let request_body = request. encode_to_vec ( ) ;
131+ let headermap = self
132+ . header_provider
133+ . get_headers ( & request_body)
134+ . await
135+ . and_then ( get_headermap)
136+ . map_err ( |e| VssError :: AuthError ( e. to_string ( ) ) ) ?;
114137 let response_raw = self
115138 . client
116139 . post ( url)
117140 . header ( CONTENT_TYPE , APPLICATION_OCTET_STREAM )
141+ . headers ( headermap)
118142 . body ( request_body)
119143 . send ( )
120144 . await ?;
0 commit comments