4444import com .google .api .client .json .GenericJson ;
4545import com .google .api .client .json .JsonObjectParser ;
4646import com .google .api .client .util .GenericData ;
47+ import com .google .api .core .InternalApi ;
4748import com .google .auth .CredentialTypeForMetrics ;
4849import com .google .auth .ServiceAccountSigner ;
4950import com .google .auth .http .HttpCredentialsAdapter ;
@@ -117,6 +118,9 @@ public class ImpersonatedCredentials extends GoogleCredentials
117118
118119 private transient Calendar calendar ;
119120
121+ private int connectTimeout ;
122+ private int readTimeout ;
123+
120124 /**
121125 * @param sourceCredentials the source credential used to acquire the impersonated credentials. It
122126 * should be either a user account credential or a service account credential.
@@ -559,6 +563,8 @@ private ImpersonatedCredentials(Builder builder) throws IOException {
559563 + "does not match %s universe domain set for impersonated credentials." ,
560564 this .sourceCredentials .getUniverseDomain (), builder .getUniverseDomain ()));
561565 }
566+ this .connectTimeout = builder .connectTimeout ;
567+ this .readTimeout = builder .readTimeout ;
562568 }
563569
564570 /**
@@ -587,6 +593,12 @@ public AccessToken refreshAccessToken() throws IOException {
587593 || (isDefaultUniverseDomain ()
588594 && ((ServiceAccountCredentials ) this .sourceCredentials )
589595 .shouldUseAssertionFlowForGdu ())) {
596+ if (this .sourceCredentials instanceof IdentityPoolCredentials ) {
597+ this .sourceCredentials =
598+ ((IdentityPoolCredentials ) this .sourceCredentials )
599+ .toBuilder ().setConnectTimeout (connectTimeout ).setReadTimeout (readTimeout ).build ();
600+ }
601+
590602 try {
591603 this .sourceCredentials .refreshIfExpired ();
592604 } catch (IOException e ) {
@@ -616,6 +628,8 @@ public AccessToken refreshAccessToken() throws IOException {
616628
617629 HttpContent requestContent = new JsonHttpContent (parser .getJsonFactory (), body );
618630 HttpRequest request = requestFactory .buildPostRequest (url , requestContent );
631+ request .setConnectTimeout (connectTimeout );
632+ request .setReadTimeout (readTimeout );
619633 adapter .initialize (request );
620634 request .setParser (parser );
621635 MetricsUtils .setMetricsHeader (
@@ -746,6 +760,9 @@ public static class Builder extends GoogleCredentials.Builder {
746760 private String iamEndpointOverride ;
747761 private Calendar calendar = Calendar .getInstance ();
748762
763+ private int connectTimeout = 20000 ; // Default to 20000ms = 20s
764+ private int readTimeout = 20000 ; // Default to 20000ms = 20s
765+
749766 protected Builder () {}
750767
751768 /**
@@ -769,6 +786,8 @@ protected Builder(ImpersonatedCredentials credentials) {
769786 this .lifetime = credentials .lifetime ;
770787 this .transportFactory = credentials .transportFactory ;
771788 this .iamEndpointOverride = credentials .iamEndpointOverride ;
789+ this .connectTimeout = credentials .connectTimeout ;
790+ this .readTimeout = credentials .readTimeout ;
772791 }
773792
774793 @ CanIgnoreReturnValue
@@ -860,6 +879,20 @@ public Builder setCalendar(Calendar calendar) {
860879 return this ;
861880 }
862881
882+ /** Warning: Not for public use and can be removed at any time. */
883+ @ InternalApi
884+ public Builder setConnectTimeout (int connectTimeout ) {
885+ this .connectTimeout = connectTimeout ;
886+ return this ;
887+ }
888+
889+ /** Warning: Not for public use and can be removed at any time. */
890+ @ InternalApi
891+ public Builder setReadTimeout (int readTimeout ) {
892+ this .readTimeout = readTimeout ;
893+ return this ;
894+ }
895+
863896 public Calendar getCalendar () {
864897 return this .calendar ;
865898 }
0 commit comments