@@ -148,9 +148,11 @@ func (a *dockerAuthorizer) AddResponses(ctx context.Context, responses []*http.R
148148 defer a .mu .Unlock ()
149149 for _ , c := range auth .ParseAuthHeader (last .Header ) {
150150 if c .Scheme == auth .BearerAuth {
151- if err := invalidAuthorization (c , responses ); err != nil {
151+ if retry , err := invalidAuthorization (ctx , c , responses ); err != nil {
152152 delete (a .handlers , host )
153153 return err
154+ } else if retry {
155+ delete (a .handlers , host )
154156 }
155157
156158 // reuse existing handler
@@ -328,18 +330,24 @@ func (ah *authHandler) doBearerAuth(ctx context.Context) (token, refreshToken st
328330 return resp .Token , resp .RefreshToken , nil
329331}
330332
331- func invalidAuthorization (c auth.Challenge , responses []* http.Response ) error {
333+ func invalidAuthorization (ctx context. Context , c auth.Challenge , responses []* http.Response ) ( retry bool , _ error ) {
332334 errStr := c .Parameters ["error" ]
333335 if errStr == "" {
334- return nil
336+ return retry , nil
335337 }
336338
337339 n := len (responses )
338340 if n == 1 || (n > 1 && ! sameRequest (responses [n - 2 ].Request , responses [n - 1 ].Request )) {
339- return nil
341+ limitedErr := errStr
342+ errLenghLimit := 64
343+ if len (limitedErr ) > errLenghLimit {
344+ limitedErr = limitedErr [:errLenghLimit ] + "..."
345+ }
346+ log .G (ctx ).WithField ("error" , limitedErr ).Debug ("authorization error using bearer token, retrying" )
347+ return true , nil
340348 }
341349
342- return fmt .Errorf ("server message: %s: %w" , errStr , ErrInvalidAuthorization )
350+ return retry , fmt .Errorf ("server message: %s: %w" , errStr , ErrInvalidAuthorization )
343351}
344352
345353func sameRequest (r1 , r2 * http.Request ) bool {
0 commit comments