11use jsonwebtoken:: { jwk:: JwkSet , Algorithm } ;
2- use reqwest:: Url ;
2+ use reqwest:: { Client , Url } ;
33use std:: {
44 sync:: Arc ,
55 time:: { Duration , Instant } ,
@@ -51,6 +51,7 @@ impl Default for Refresh {
5151
5252#[ derive( Clone ) ]
5353pub struct KeyStoreManager {
54+ http_client : Client ,
5455 key_url : Url ,
5556 /// in case of fail loading (error or key not found), minimal interval
5657 refresh : Refresh ,
@@ -67,8 +68,9 @@ pub struct KeyStore {
6768}
6869
6970impl KeyStoreManager {
70- pub ( crate ) fn new ( key_url : Url , refresh : Refresh ) -> KeyStoreManager {
71+ pub ( crate ) fn new ( http_client : Client , key_url : Url , refresh : Refresh ) -> KeyStoreManager {
7172 KeyStoreManager {
73+ http_client,
7274 key_url,
7375 refresh,
7476 keystore : Arc :: new ( Mutex :: new ( KeyStore {
@@ -85,7 +87,7 @@ impl KeyStoreManager {
8587 let key = match self . refresh . strategy {
8688 RefreshStrategy :: Interval => {
8789 if ks_gard. can_refresh ( self . refresh . refresh_interval , self . refresh . retry_interval ) {
88- ks_gard. refresh ( & self . key_url , & [ ] ) . await ?;
90+ ks_gard. refresh ( & self . http_client , & self . key_url , & [ ] ) . await ?;
8991 }
9092 ks_gard. get_key ( header) ?
9193 }
@@ -95,7 +97,7 @@ impl KeyStoreManager {
9597 if let Some ( jwk) = jwk_opt {
9698 jwk
9799 } else if ks_gard. can_refresh ( self . refresh . refresh_interval , self . refresh . retry_interval ) {
98- ks_gard. refresh ( & self . key_url , & [ ( "kid" , kid) ] ) . await ?;
100+ ks_gard. refresh ( & self . http_client , & self . key_url , & [ ( "kid" , kid) ] ) . await ?;
99101 ks_gard. find_kid ( kid) . ok_or_else ( || AuthError :: InvalidKid ( kid. to_owned ( ) ) ) ?
100102 } else {
101103 return Err ( AuthError :: InvalidKid ( kid. to_owned ( ) ) ) ;
@@ -107,6 +109,7 @@ impl KeyStoreManager {
107109 } else if ks_gard. can_refresh ( self . refresh . refresh_interval , self . refresh . retry_interval ) {
108110 ks_gard
109111 . refresh (
112+ & self . http_client ,
110113 & self . key_url ,
111114 & [ (
112115 "alg" ,
@@ -127,7 +130,7 @@ impl KeyStoreManager {
127130 // if jwks endpoint is down for the loading, respect retry_interval
128131 && ks_gard. can_refresh ( self . refresh . refresh_interval , self . refresh . retry_interval )
129132 {
130- ks_gard. refresh ( & self . key_url , & [ ] ) . await ?;
133+ ks_gard. refresh ( & self . http_client , & self . key_url , & [ ] ) . await ?;
131134 }
132135 ks_gard. get_key ( header) ?
133136 }
@@ -151,8 +154,8 @@ impl KeyStore {
151154 }
152155 }
153156
154- async fn refresh ( & mut self , key_url : & Url , qparam : & [ ( & str , & str ) ] ) -> Result < ( ) , AuthError > {
155- reqwest :: Client :: new ( )
157+ async fn refresh ( & mut self , http_client : & Client , key_url : & Url , qparam : & [ ( & str , & str ) ] ) -> Result < ( ) , AuthError > {
158+ http_client
156159 . get ( key_url. as_ref ( ) )
157160 . query ( qparam)
158161 . send ( )
0 commit comments