| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package google |
| |
| import ( |
| "errors" |
| |
| "golang.org/x/oauth2" |
| ) |
| |
| // AuthenticationError indicates there was an error in the authentication flow. |
| // |
| // Use (*AuthenticationError).Temporary to check if the error can be retried. |
| type AuthenticationError struct { |
| err *oauth2.RetrieveError |
| } |
| |
| func newAuthenticationError(err error) error { |
| re := &oauth2.RetrieveError{} |
| if !errors.As(err, &re) { |
| return err |
| } |
| return &AuthenticationError{ |
| err: re, |
| } |
| } |
| |
| // Temporary indicates that the network error has one of the following status codes and may be retried: 500, 503, 408, or 429. |
| func (e *AuthenticationError) Temporary() bool { |
| if e.err.Response == nil { |
| return false |
| } |
| sc := e.err.Response.StatusCode |
| return sc == 500 || sc == 503 || sc == 408 || sc == 429 |
| } |
| |
| func (e *AuthenticationError) Error() string { |
| return e.err.Error() |
| } |
| |
| func (e *AuthenticationError) Unwrap() error { |
| return e.err |
| } |
| |
| type errWrappingTokenSource struct { |
| src oauth2.TokenSource |
| } |
| |
| func newErrWrappingTokenSource(ts oauth2.TokenSource) oauth2.TokenSource { |
| return &errWrappingTokenSource{src: ts} |
| } |
| |
| // Token returns the current token if it's still valid, else will |
| // refresh the current token (using r.Context for HTTP client |
| // information) and return the new one. |
| func (s *errWrappingTokenSource) Token() (*oauth2.Token, error) { |
| t, err := s.src.Token() |
| if err != nil { |
| return nil, newAuthenticationError(err) |
| } |
| return t, nil |
| } |