Skip to content

Commit 86ec2fd

Browse files
committed
feat(oauth2_http): fail fast on all 4xx client errors during GCE ping
1 parent b5f6618 commit 86ec2fd

2 files changed

Lines changed: 44 additions & 11 deletions

File tree

google-auth-library-java/oauth2_http/java/com/google/auth/oauth2/ComputeEngineCredentials.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -673,9 +673,11 @@ private static boolean pingComputeEngineMetadata(
673673
} catch (SocketTimeoutException expected) {
674674
// Ignore logging timeouts which is the expected failure mode in non GCE environments.
675675
} catch (IOException e) {
676-
if (e instanceof HttpResponseException
677-
&& ((HttpResponseException) e).getStatusCode() == 403) {
678-
return false;
676+
if (e instanceof HttpResponseException) {
677+
int statusCode = ((HttpResponseException) e).getStatusCode();
678+
if (statusCode >= 400 && statusCode < 500) {
679+
return false;
680+
}
679681
}
680682
LOGGER.log(
681683
Level.FINE,

google-auth-library-java/oauth2_http/javatests/com/google/auth/oauth2/ComputeEngineCredentialsTest.java

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,20 +1178,51 @@ void getProjectId_explicitSet_noMDsCall() {
11781178
}
11791179

11801180
@Test
1181-
void isOnGce_forbidden_doesNotRetry() {
1181+
void isOnGce_clientError_doesNotRetry_returnsFalseOnUnknownOs() {
11821182
MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory();
1183-
transportFactory.transport.setStatusCode(HttpStatusCodes.STATUS_CODE_FORBIDDEN);
1184-
UnknownOsCredentialsProvider provider = new UnknownOsCredentialsProvider();
1183+
transportFactory.transport.setStatusCode(HttpStatusCodes.STATUS_CODE_NOT_FOUND);
1184+
DefaultCredentialsProvider provider = new DefaultCredentialsProvider() {
1185+
@Override
1186+
String getEnv(String name) {
1187+
if (DefaultCredentialsProvider.NO_GCE_CHECK_ENV_VAR.equals(name)) {
1188+
return "false";
1189+
}
1190+
return super.getEnv(name);
1191+
}
1192+
@Override
1193+
String getOsName() {
1194+
return "Unknown";
1195+
}
1196+
};
11851197
boolean isOnGce = ComputeEngineCredentials.isOnGce(transportFactory, provider);
11861198
assertFalse(isOnGce);
11871199
assertEquals(1, transportFactory.transport.getRequestCount());
11881200
}
11891201

1190-
static class UnknownOsCredentialsProvider extends DefaultCredentialsProvider {
1191-
@Override
1192-
String getOsName() {
1193-
return "Unknown";
1194-
}
1202+
@Test
1203+
void isOnGce_clientError_doesNotRetry_returnsTrueOnLinuxGce() {
1204+
MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory();
1205+
transportFactory.transport.setStatusCode(HttpStatusCodes.STATUS_CODE_FORBIDDEN);
1206+
DefaultCredentialsProvider provider = new DefaultCredentialsProvider() {
1207+
@Override
1208+
String getEnv(String name) {
1209+
if (DefaultCredentialsProvider.NO_GCE_CHECK_ENV_VAR.equals(name)) {
1210+
return "false";
1211+
}
1212+
return super.getEnv(name);
1213+
}
1214+
@Override
1215+
String getOsName() {
1216+
return "Linux";
1217+
}
1218+
@Override
1219+
java.io.InputStream readStream(java.io.File file) throws java.io.FileNotFoundException {
1220+
return new java.io.ByteArrayInputStream("Google Compute Engine".getBytes(java.nio.charset.StandardCharsets.UTF_8));
1221+
}
1222+
};
1223+
boolean isOnGce = ComputeEngineCredentials.isOnGce(transportFactory, provider);
1224+
assertTrue(isOnGce);
1225+
assertEquals(1, transportFactory.transport.getRequestCount());
11951226
}
11961227

11971228
static class MockMetadataServerTransportFactory implements HttpTransportFactory {

0 commit comments

Comments
 (0)