@@ -438,7 +438,8 @@ public <T> TokenResponse refreshToken(
438438 : entry .getValue ())));
439439
440440 // Put in the cache
441- TokenResponse token = JsonUtils .fromJson (responseWrapper .response (), TokenResponse .class );
441+ TokenResponse token = JsonUtils .fromJson (responseWrapper .response (), TokenResponse .class )
442+ .forService (service );
442443 TokenCache .put (newScopes , token );
443444 return token ;
444445 }
@@ -501,7 +502,7 @@ private <T> ResponseWrapper<T> executeRequest(
501502 if (cachedToken == null ) {
502503 LOG .trace ("No cached token found for scopes: {}" , newScopes );
503504 } else {
504- LOG .trace ("Cached token for scopes: {}" , newScopes );
505+ LOG .trace ("Found cached token for scopes: {}" , newScopes . withService ( cachedToken . service ()) );
505506 }
506507
507508 // Add authentication header if any (from provider or cached token)
@@ -568,22 +569,17 @@ private <T> ResponseWrapper<T> redoRequest(
568569 AuthProvider authProvider ) {
569570 if ((response .statusCode () == 401 || response .statusCode () == 403 )) {
570571 LOG .debug ("Requesting new token..." );
571- HttpClient .TokenResponse token = refreshToken (toResponseWrapper (response ), scopes , authProvider );
572+ HttpClient .TokenResponse token =
573+ refreshToken (toResponseWrapper (response , scopes .getService ()), scopes , authProvider );
572574 if (token .issued_at () != null && token .expires_in () != null ) {
573575 LOG .debug (
574- "Found token issued_at {}, expire_id {} and expiring at {} " ,
576+ "Received token issued_at {}, expire_id {} and expiring at {} " ,
575577 token .issued_at (),
576578 token .expires_in (),
577579 token .issued_at ().plusSeconds (token .expires_in ()));
578580 }
579- String bearerToken = token .token ();
580- if (bearerToken == null ) {
581- // Docker registry auth spec allows either token or auth_token (or both if they are the same)
582- bearerToken = token .access_token ();
583- }
584- if (bearerToken == null ) {
585- throw new OrasException ("No Bearer token received" );
586- }
581+ String bearerToken = token .getEffectiveToken ();
582+ String service = token .service ();
587583 try {
588584 builder = builder .setHeader (Const .AUTHORIZATION_HEADER , "Bearer " + bearerToken );
589585 HttpResponse <T > newResponse = client .send (builder .build (), handler );
@@ -601,25 +597,26 @@ private <T> ResponseWrapper<T> redoRequest(
601597 }
602598
603599 return toResponseWrapper (
604- client .send (builder .uri (URI .create (location )).build (), handler ));
600+ client .send (builder .uri (URI .create (location )).build (), handler ), service );
605601 }
606- return toResponseWrapper (newResponse );
602+ return toResponseWrapper (newResponse , service );
607603
608604 } catch (Exception e ) {
609605 LOG .error ("Failed to redo request" , e );
610606 throw new OrasException ("Unable to redo HTTP request" , e );
611607 }
612608 }
613- return toResponseWrapper (response );
609+ return toResponseWrapper (response , scopes . getService () );
614610 }
615611
616- private <T > ResponseWrapper <T > toResponseWrapper (HttpResponse <T > response ) {
612+ private <T > ResponseWrapper <T > toResponseWrapper (HttpResponse <T > response , @ Nullable String service ) {
617613 return new ResponseWrapper <>(
618614 response .body (),
619615 response .statusCode (),
620616 response .headers ().map ().entrySet ().stream ()
621617 .collect (Collectors .toMap (
622- Map .Entry ::getKey , e -> e .getValue ().get (0 ))));
618+ Map .Entry ::getKey , e -> e .getValue ().get (0 ))),
619+ service );
623620 }
624621
625622 /**
@@ -649,8 +646,10 @@ private void logRequest(HttpRequest request, byte[] body) {
649646 * @param response The response
650647 * @param statusCode The status code
651648 * @param headers The headers
649+ * @param service The service (not on response but on HTTP headers)
652650 */
653- public record ResponseWrapper <T >(T response , int statusCode , Map <String , String > headers ) {}
651+ public record ResponseWrapper <T >(
652+ T response , int statusCode , Map <String , String > headers , @ Nullable String service ) {}
654653
655654 /**
656655 * Insecure trust manager when skipping TLS verification
@@ -697,6 +696,16 @@ public record TokenResponse(
697696 @ Nullable ZonedDateTime issued_at ) {
698697
699698 /**
699+ * Create a new token response with the service field set
700+ * @param service The service
701+ * @return A new token response with the service field set
702+ */
703+ public TokenResponse forService (String service ) {
704+ return new TokenResponse (token , access_token , service , expires_in , issued_at );
705+ }
706+
707+ /**
708+ * >>>>>>> 6379975 (Store token into caffeine cache (#631))
700709 * Get the effective token
701710 * @return The effective token, which is either the access_token or the token field depending on which one is present
702711 */
0 commit comments