@@ -193,15 +193,17 @@ impl HttpClient {
193193        Ok ( ( ) ) 
194194    } 
195195
196-     /// Authenticate  the request by filling  token. 
196+     /// Authenticates  the request by adding a bearer  token to the authorization header . 
197197/// 
198- /// - If neither token nor credential is provided, this method will do nothing. 
199- /// - If only credential is provided, this method will try to fetch token from the server. 
200- /// - If token is provided, this method will use the token directly. 
198+ /// This method supports three authentication modes: 
201199/// 
202- /// # TODO 
200+ /// 1. **No authentication** - Skip authentication when both `credential` and `token` are missing. 
201+ /// 2. **Token authentication** - Use the provided `token` directly for authentication. 
202+ /// 3. **OAuth authentication** - Exchange `credential` for a token, cache it, then use it for authentication. 
203203/// 
204- /// Support refreshing token while needed. 
204+ /// When both `credential` and `token` are present, `token` takes precedence. 
205+ /// 
206+ /// # TODO: Support automatic token refreshing. 
205207async  fn  authenticate ( & self ,  req :  & mut  Request )  -> Result < ( ) >  { 
206208        // Clone the token from lock without holding the lock for entire function. 
207209        let  token = self . token . lock ( ) . await . clone ( ) ; 
@@ -210,24 +212,18 @@ impl HttpClient {
210212            return  Ok ( ( ) ) ; 
211213        } 
212214
213-         // Use token if provided. 
214-         if  let  Some ( token)  = & token { 
215-             req. headers_mut ( ) . insert ( 
216-                 http:: header:: AUTHORIZATION , 
217-                 format ! ( "Bearer {token}" ) . parse ( ) . map_err ( |e| { 
218-                     Error :: new ( 
219-                         ErrorKind :: DataInvalid , 
220-                         "Invalid token received from catalog server!" , 
221-                     ) 
222-                     . with_source ( e) 
223-                 } ) ?, 
224-             ) ; 
225-             return  Ok ( ( ) ) ; 
226-         } 
215+         // Either use the provided token or exchange credential for token, cache and use that 
216+         let  token = match  token { 
217+             Some ( token)  => token, 
218+             None  => { 
219+                 let  token = self . exchange_credential_for_token ( ) . await ?; 
220+                 // Update token so that we use it for next request instead of 
221+                 // exchanging credential for token from the server again 
222+                 * self . token . lock ( ) . await  = Some ( token. clone ( ) ) ; 
223+                 token
224+             } 
225+         } ; 
227226
228-         let  token = self . exchange_credential_for_token ( ) . await ?; 
229-         // Update token. 
230-         * self . token . lock ( ) . await  = Some ( token. clone ( ) ) ; 
231227        // Insert token in request. 
232228        req. headers_mut ( ) . insert ( 
233229            http:: header:: AUTHORIZATION , 
0 commit comments