Handle empty JSON responses

pull/61/head
Richard Körber 2018-03-13 22:14:05 +01:00
parent 3e1cb01fa0
commit 57140adfdb
No known key found for this signature in database
GPG Key ID: AAB9FD19C78AA3E0
8 changed files with 43 additions and 8 deletions

View File

@ -158,7 +158,10 @@ public class Account extends AcmeJsonResource {
conn.sendSignedRequest(newAuthzUrl, claims, getLogin());
Authorization auth = getLogin().bindAuthorization(conn.getLocation());
auth.setJSON(conn.readJsonResponse());
JSON json = conn.readJsonResponse();
if (json != null) {
auth.setJSON(json);
}
return auth;
}
}
@ -224,7 +227,10 @@ public class Account extends AcmeJsonResource {
conn.sendSignedRequest(getLocation(), claims, getLogin());
setJSON(conn.readJsonResponse());
JSON json = conn.readJsonResponse();
if (json != null) {
setJSON(json);
}
}
}
@ -294,7 +300,10 @@ public class Account extends AcmeJsonResource {
conn.sendSignedRequest(getLocation(), claims, getLogin());
setJSON(conn.readJsonResponse());
JSON json = conn.readJsonResponse();
if (json != null) {
setJSON(json);
}
}
}
}

View File

@ -35,6 +35,7 @@ import org.shredzone.acme4j.connector.Connection;
import org.shredzone.acme4j.connector.Resource;
import org.shredzone.acme4j.exception.AcmeException;
import org.shredzone.acme4j.toolbox.AcmeUtils;
import org.shredzone.acme4j.toolbox.JSON;
import org.shredzone.acme4j.toolbox.JSONBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -210,7 +211,10 @@ public class AccountBuilder {
URL location = conn.getLocation();
Login login = new Login(location, keyPair, session);
login.getAccount().setJSON(conn.readJsonResponse());
JSON json = conn.readJsonResponse();
if (json != null) {
login.getAccount().setJSON(json);
}
return login;
}
}

View File

@ -132,7 +132,10 @@ public class Authorization extends AcmeJsonResource {
conn.sendSignedRequest(getLocation(), claims, getLogin());
setJSON(conn.readJsonResponse());
JSON json = conn.readJsonResponse();
if (json != null) {
setJSON(json);
}
}
}

View File

@ -25,6 +25,7 @@ import java.util.Set;
import org.shredzone.acme4j.connector.Connection;
import org.shredzone.acme4j.connector.Resource;
import org.shredzone.acme4j.exception.AcmeException;
import org.shredzone.acme4j.toolbox.JSON;
import org.shredzone.acme4j.toolbox.JSONBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -152,7 +153,10 @@ public class OrderBuilder {
conn.sendSignedRequest(session.resourceUrl(Resource.NEW_ORDER), claims, login);
Order order = new Order(login, conn.getLocation());
order.setJSON(conn.readJsonResponse());
JSON json = conn.readJsonResponse();
if (json != null) {
order.setJSON(json);
}
return order;
}
}

View File

@ -145,7 +145,10 @@ public class Challenge extends AcmeJsonResource {
conn.sendSignedRequest(getLocation(), claims, getLogin());
setJSON(conn.readJsonResponse());
JSON json = conn.readJsonResponse();
if (json != null) {
setJSON(json);
}
}
}

View File

@ -94,7 +94,7 @@ public interface Connection extends AutoCloseable {
/**
* Reads a server response as JSON data.
*
* @return The JSON response
* @return The JSON response, or {@code null} if the server did not provide any data.
*/
JSON readJsonResponse() throws AcmeException;

View File

@ -192,6 +192,10 @@ public class DefaultConnection implements Connection {
public JSON readJsonResponse() throws AcmeException {
assertConnectionIsOpen();
if (conn.getContentLength() == 0) {
return null;
}
String contentType = AcmeUtils.getContentType(conn.getHeaderField(CONTENT_TYPE_HEADER));
if (!("application/json".equals(contentType)
|| "application/problem+json".equals(contentType))) {

View File

@ -427,6 +427,7 @@ public class DefaultConnectionTest {
String jsonData = "{\"type\":\"urn:ietf:params:acme:error:unauthorized\",\"detail\":\"Invalid response: 404\"}";
when(mockUrlConnection.getHeaderField("Content-Type")).thenReturn("application/problem+json");
when(mockUrlConnection.getContentLength()).thenReturn(jsonData.length());
when(mockUrlConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_FORBIDDEN);
when(mockUrlConnection.getOutputStream()).thenReturn(new ByteArrayOutputStream());
when(mockUrlConnection.getErrorStream()).thenReturn(new ByteArrayInputStream(jsonData.getBytes("utf-8")));
@ -446,6 +447,7 @@ public class DefaultConnectionTest {
verify(mockUrlConnection, atLeastOnce()).getHeaderField("Content-Type");
verify(mockUrlConnection, atLeastOnce()).getResponseCode();
verify(mockUrlConnection).getContentLength();
verify(mockUrlConnection).getErrorStream();
verify(mockUrlConnection).getURL();
}
@ -461,6 +463,7 @@ public class DefaultConnectionTest {
linkHeader.put("Link", Arrays.asList("<https://example.com/tos.pdf>; rel=\"terms-of-service\""));
when(mockUrlConnection.getHeaderField("Content-Type")).thenReturn("application/problem+json");
when(mockUrlConnection.getContentLength()).thenReturn(jsonData.length());
when(mockUrlConnection.getHeaderFields()).thenReturn(linkHeader);
when(mockUrlConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_FORBIDDEN);
when(mockUrlConnection.getOutputStream()).thenReturn(new ByteArrayOutputStream());
@ -484,6 +487,7 @@ public class DefaultConnectionTest {
verify(mockUrlConnection, atLeastOnce()).getHeaderFields();
verify(mockUrlConnection, atLeastOnce()).getResponseCode();
verify(mockUrlConnection).getErrorStream();
verify(mockUrlConnection).getContentLength();
verify(mockUrlConnection, atLeastOnce()).getURL();
}
@ -500,6 +504,7 @@ public class DefaultConnectionTest {
Instant retryAfter = Instant.now().plusSeconds(30L).truncatedTo(ChronoUnit.MILLIS);
when(mockUrlConnection.getHeaderField("Content-Type")).thenReturn("application/problem+json");
when(mockUrlConnection.getContentLength()).thenReturn(jsonData.length());
when(mockUrlConnection.getHeaderField("Retry-After")).thenReturn(retryAfter.toString());
when(mockUrlConnection.getHeaderFieldDate("Retry-After", 0L)).thenReturn(retryAfter.toEpochMilli());
when(mockUrlConnection.getHeaderFields()).thenReturn(linkHeader);
@ -529,6 +534,7 @@ public class DefaultConnectionTest {
verify(mockUrlConnection).getHeaderFieldDate("Retry-After", 0L);
verify(mockUrlConnection, atLeastOnce()).getHeaderFields();
verify(mockUrlConnection, atLeastOnce()).getResponseCode();
verify(mockUrlConnection).getContentLength();
verify(mockUrlConnection).getErrorStream();
verify(mockUrlConnection, atLeastOnce()).getURL();
}
@ -833,6 +839,7 @@ public class DefaultConnectionTest {
String jsonData = "{\n\"foo\":123,\n\"bar\":\"a-string\"\n}\n";
when(mockUrlConnection.getHeaderField("Content-Type")).thenReturn("application/json");
when(mockUrlConnection.getContentLength()).thenReturn(jsonData.length());
when(mockUrlConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_OK);
when(mockUrlConnection.getInputStream()).thenReturn(new ByteArrayInputStream(jsonData.getBytes("utf-8")));
@ -845,6 +852,7 @@ public class DefaultConnectionTest {
}
verify(mockUrlConnection).getHeaderField("Content-Type");
verify(mockUrlConnection).getContentLength();
verify(mockUrlConnection).getResponseCode();
verify(mockUrlConnection).getInputStream();
verifyNoMoreInteractions(mockUrlConnection);