diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/impl/DefaultConnection.java b/acme4j-client/src/main/java/org/shredzone/acme4j/impl/DefaultConnection.java index c46c333b..b3198cb3 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/impl/DefaultConnection.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/impl/DefaultConnection.java @@ -332,6 +332,14 @@ public class DefaultConnection implements Connection { String type = (String) map.get("type"); String detail = (String) map.get("detail"); + if (detail == null) { + detail = "general problem"; + } + + if (type == null) { + throw new AcmeException(detail); + } + switch (type) { case "urn:acme:error:unauthorized": throw new AcmeUnauthorizedException(type, detail); diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/impl/DefaultConnectionTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/impl/DefaultConnectionTest.java index de0947b4..80912ba6 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/impl/DefaultConnectionTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/impl/DefaultConnectionTest.java @@ -249,6 +249,31 @@ public class DefaultConnectionTest { verifyNoMoreInteractions(mockUrlConnection); } + /** + * Test if an {@link AcmeException} is thrown if there is no error type. + */ + @Test + public void testNoTypeThrowException() { + when(mockUrlConnection.getHeaderField("Content-Type")) + .thenReturn("application/problem+json"); + + try (DefaultConnection conn = new DefaultConnection(mockHttpConnection) { + @Override + public Map readJsonResponse() throws AcmeException { + return new HashMap(); + }; + }) { + conn.conn = mockUrlConnection; + conn.throwAcmeException(); + fail("Expected to fail"); + } catch (AcmeException ex) { + assertThat(ex.getMessage(), not(isEmptyOrNullString())); + } + + verify(mockUrlConnection).getHeaderField("Content-Type"); + verifyNoMoreInteractions(mockUrlConnection); + } + /** * Test GET requests. */