12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // 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
- }
|