diff --git a/core/src/main/java/google/registry/rdap/UpdateRegistrarRdapBaseUrlsAction.java b/core/src/main/java/google/registry/rdap/UpdateRegistrarRdapBaseUrlsAction.java index 7f8325dd0..f38f11128 100644 --- a/core/src/main/java/google/registry/rdap/UpdateRegistrarRdapBaseUrlsAction.java +++ b/core/src/main/java/google/registry/rdap/UpdateRegistrarRdapBaseUrlsAction.java @@ -92,27 +92,23 @@ public final class UpdateRegistrarRdapBaseUrlsAction implements Runnable { @Inject UpdateRegistrarRdapBaseUrlsAction() {} - private String loginAndGetId(HttpRequestFactory requestFactory, String tld) { - try { - logger.atInfo().log("Logging in to MoSAPI"); - HttpRequest request = - requestFactory.buildGetRequest(new GenericUrl(String.format(LOGIN_URL, tld))); - request.getHeaders().setBasicAuthentication(String.format("%s_ry", tld), password); - HttpResponse response = request.execute(); + private String loginAndGetId(HttpRequestFactory requestFactory, String tld) throws IOException { + logger.atInfo().log("Logging in to MoSAPI"); + HttpRequest request = + requestFactory.buildGetRequest(new GenericUrl(String.format(LOGIN_URL, tld))); + request.getHeaders().setBasicAuthentication(String.format("%s_ry", tld), password); + HttpResponse response = request.execute(); - Optional idCookie = - HttpCookie.parse(response.getHeaders().getFirstHeaderStringValue("Set-Cookie")).stream() - .filter(cookie -> cookie.getName().equals(COOKIE_ID)) - .findAny(); - checkState( - idCookie.isPresent(), - "Didn't get the ID cookie from the login response. Code: %s, headers: %s", - response.getStatusCode(), - response.getHeaders()); - return idCookie.get().getValue(); - } catch (IOException e) { - throw new UncheckedIOException("Error logging in to MoSAPI server: " + e.getMessage(), e); - } + Optional idCookie = + HttpCookie.parse(response.getHeaders().getFirstHeaderStringValue("Set-Cookie")).stream() + .filter(cookie -> cookie.getName().equals(COOKIE_ID)) + .findAny(); + checkState( + idCookie.isPresent(), + "Didn't get the ID cookie from the login response. Code: %s, headers: %s", + response.getStatusCode(), + response.getHeaders()); + return idCookie.get().getValue(); } private void logout(HttpRequestFactory requestFactory, String id, String tld) { @@ -128,9 +124,8 @@ public final class UpdateRegistrarRdapBaseUrlsAction implements Runnable { } } - private ImmutableSetMultimap getRdapBaseUrlsPerIanaIdWithTld(String tld) { - HttpRequestFactory requestFactory = httpTransport.createRequestFactory(); - String id = loginAndGetId(requestFactory, tld); + private ImmutableSetMultimap getRdapBaseUrlsPerIanaIdWithTld( + String tld, String id, HttpRequestFactory requestFactory) { String content; try { HttpRequest request = @@ -173,11 +168,22 @@ public final class UpdateRegistrarRdapBaseUrlsAction implements Runnable { checkArgument(!tlds.isEmpty(), "There must exist at least one REAL TLD."); Throwable finalThrowable = null; for (String tld : tlds) { + HttpRequestFactory requestFactory = httpTransport.createRequestFactory(); + String id; try { - return getRdapBaseUrlsPerIanaIdWithTld(tld); + id = loginAndGetId(requestFactory, tld); + } catch (Throwable e) { + // Login failures are bad but not unexpected for certain TLDs. We shouldn't store those + // but rather should only store useful Throwables. + logger.atWarning().log("Error logging in to MoSAPI server: " + e.getMessage(), e); + continue; + } + try { + return getRdapBaseUrlsPerIanaIdWithTld(tld, id, requestFactory); } catch (Throwable throwable) { - logger.atWarning().log(String - .format("Error retrieving RDAP urls with TLD %s: %s", tld, throwable.getMessage())); + logger.atWarning().log( + String.format( + "Error retrieving RDAP urls with TLD %s: %s", tld, throwable.getMessage())); finalThrowable = throwable; } } diff --git a/core/src/test/java/google/registry/rdap/UpdateRegistrarRdapBaseUrlsActionTest.java b/core/src/test/java/google/registry/rdap/UpdateRegistrarRdapBaseUrlsActionTest.java index fae5e8bd3..8a76ba40c 100644 --- a/core/src/test/java/google/registry/rdap/UpdateRegistrarRdapBaseUrlsActionTest.java +++ b/core/src/test/java/google/registry/rdap/UpdateRegistrarRdapBaseUrlsActionTest.java @@ -29,6 +29,7 @@ import com.google.api.client.testing.http.MockLowLevelHttpRequest; import com.google.api.client.testing.http.MockLowLevelHttpResponse; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonSyntaxException; import google.registry.model.registrar.Registrar; import google.registry.model.registrar.RegistrarAddress; import google.registry.model.registry.Registry; @@ -276,6 +277,44 @@ public final class UpdateRegistrarRdapBaseUrlsActionTest extends ShardableTestCa .isEqualTo("Error contacting MosAPI server. Tried TLDs [secondtld, tld]"); } + @Test + public void testFailureCause_ignoresLoginFailure() { + // Login failures aren't particularly interesting so we should log them, but the final + // throwable should be some other failure if one existed + createTld("secondtld"); + httpTransport = new TestHttpTransport(); + action.httpTransport = httpTransport; + + MockLowLevelHttpResponse loginResponse = new MockLowLevelHttpResponse(); + loginResponse.addHeader( + "Set-Cookie", + "id=myAuthenticationId; " + + "Expires=Tue, 11-Jun-2019 16:34:21 GMT; Path=/mosapi/v1/app; Secure; HttpOnly"); + + MockLowLevelHttpResponse badListResponse = new MockLowLevelHttpResponse(); + String badListReply = JSON_LIST_REPLY.substring(50); + badListResponse.setContent(badListReply); + + MockLowLevelHttpResponse logoutResponse = new MockLowLevelHttpResponse(); + logoutResponse.addHeader( + "Set-Cookie", + "id=id; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/mosapi/v1/app; Secure; HttpOnly"); + + MockLowLevelHttpResponse badLoginResponse = new MockLowLevelHttpResponse(); + badLoginResponse.addHeader( + "Set-Cookie", + "Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/mosapi/v1/app; Secure; HttpOnly"); + + httpTransport.addNextResponse(loginResponse); + httpTransport.addNextResponse(badListResponse); + httpTransport.addNextResponse(logoutResponse); + httpTransport.addNextResponse(badLoginResponse); + + assertThat(assertThrows(RuntimeException.class, action::run)) + .hasCauseThat() + .isInstanceOf(JsonSyntaxException.class); + } + private static void addValidResponses(TestHttpTransport httpTransport) { MockLowLevelHttpResponse loginResponse = new MockLowLevelHttpResponse(); loginResponse.addHeader(