mirror of https://github.com/shred/acme4j
Handle empty JSON responses
parent
3e1cb01fa0
commit
57140adfdb
|
@ -158,7 +158,10 @@ public class Account extends AcmeJsonResource {
|
||||||
conn.sendSignedRequest(newAuthzUrl, claims, getLogin());
|
conn.sendSignedRequest(newAuthzUrl, claims, getLogin());
|
||||||
|
|
||||||
Authorization auth = getLogin().bindAuthorization(conn.getLocation());
|
Authorization auth = getLogin().bindAuthorization(conn.getLocation());
|
||||||
auth.setJSON(conn.readJsonResponse());
|
JSON json = conn.readJsonResponse();
|
||||||
|
if (json != null) {
|
||||||
|
auth.setJSON(json);
|
||||||
|
}
|
||||||
return auth;
|
return auth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -224,7 +227,10 @@ public class Account extends AcmeJsonResource {
|
||||||
|
|
||||||
conn.sendSignedRequest(getLocation(), claims, getLogin());
|
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());
|
conn.sendSignedRequest(getLocation(), claims, getLogin());
|
||||||
|
|
||||||
setJSON(conn.readJsonResponse());
|
JSON json = conn.readJsonResponse();
|
||||||
|
if (json != null) {
|
||||||
|
setJSON(json);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ import org.shredzone.acme4j.connector.Connection;
|
||||||
import org.shredzone.acme4j.connector.Resource;
|
import org.shredzone.acme4j.connector.Resource;
|
||||||
import org.shredzone.acme4j.exception.AcmeException;
|
import org.shredzone.acme4j.exception.AcmeException;
|
||||||
import org.shredzone.acme4j.toolbox.AcmeUtils;
|
import org.shredzone.acme4j.toolbox.AcmeUtils;
|
||||||
|
import org.shredzone.acme4j.toolbox.JSON;
|
||||||
import org.shredzone.acme4j.toolbox.JSONBuilder;
|
import org.shredzone.acme4j.toolbox.JSONBuilder;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -210,7 +211,10 @@ public class AccountBuilder {
|
||||||
URL location = conn.getLocation();
|
URL location = conn.getLocation();
|
||||||
|
|
||||||
Login login = new Login(location, keyPair, session);
|
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;
|
return login;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,7 +132,10 @@ public class Authorization extends AcmeJsonResource {
|
||||||
|
|
||||||
conn.sendSignedRequest(getLocation(), claims, getLogin());
|
conn.sendSignedRequest(getLocation(), claims, getLogin());
|
||||||
|
|
||||||
setJSON(conn.readJsonResponse());
|
JSON json = conn.readJsonResponse();
|
||||||
|
if (json != null) {
|
||||||
|
setJSON(json);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ import java.util.Set;
|
||||||
import org.shredzone.acme4j.connector.Connection;
|
import org.shredzone.acme4j.connector.Connection;
|
||||||
import org.shredzone.acme4j.connector.Resource;
|
import org.shredzone.acme4j.connector.Resource;
|
||||||
import org.shredzone.acme4j.exception.AcmeException;
|
import org.shredzone.acme4j.exception.AcmeException;
|
||||||
|
import org.shredzone.acme4j.toolbox.JSON;
|
||||||
import org.shredzone.acme4j.toolbox.JSONBuilder;
|
import org.shredzone.acme4j.toolbox.JSONBuilder;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -152,7 +153,10 @@ public class OrderBuilder {
|
||||||
conn.sendSignedRequest(session.resourceUrl(Resource.NEW_ORDER), claims, login);
|
conn.sendSignedRequest(session.resourceUrl(Resource.NEW_ORDER), claims, login);
|
||||||
|
|
||||||
Order order = new Order(login, conn.getLocation());
|
Order order = new Order(login, conn.getLocation());
|
||||||
order.setJSON(conn.readJsonResponse());
|
JSON json = conn.readJsonResponse();
|
||||||
|
if (json != null) {
|
||||||
|
order.setJSON(json);
|
||||||
|
}
|
||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,7 +145,10 @@ public class Challenge extends AcmeJsonResource {
|
||||||
|
|
||||||
conn.sendSignedRequest(getLocation(), claims, getLogin());
|
conn.sendSignedRequest(getLocation(), claims, getLogin());
|
||||||
|
|
||||||
setJSON(conn.readJsonResponse());
|
JSON json = conn.readJsonResponse();
|
||||||
|
if (json != null) {
|
||||||
|
setJSON(json);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ public interface Connection extends AutoCloseable {
|
||||||
/**
|
/**
|
||||||
* Reads a server response as JSON data.
|
* 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;
|
JSON readJsonResponse() throws AcmeException;
|
||||||
|
|
||||||
|
|
|
@ -192,6 +192,10 @@ public class DefaultConnection implements Connection {
|
||||||
public JSON readJsonResponse() throws AcmeException {
|
public JSON readJsonResponse() throws AcmeException {
|
||||||
assertConnectionIsOpen();
|
assertConnectionIsOpen();
|
||||||
|
|
||||||
|
if (conn.getContentLength() == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
String contentType = AcmeUtils.getContentType(conn.getHeaderField(CONTENT_TYPE_HEADER));
|
String contentType = AcmeUtils.getContentType(conn.getHeaderField(CONTENT_TYPE_HEADER));
|
||||||
if (!("application/json".equals(contentType)
|
if (!("application/json".equals(contentType)
|
||||||
|| "application/problem+json".equals(contentType))) {
|
|| "application/problem+json".equals(contentType))) {
|
||||||
|
|
|
@ -427,6 +427,7 @@ public class DefaultConnectionTest {
|
||||||
String jsonData = "{\"type\":\"urn:ietf:params:acme:error:unauthorized\",\"detail\":\"Invalid response: 404\"}";
|
String jsonData = "{\"type\":\"urn:ietf:params:acme:error:unauthorized\",\"detail\":\"Invalid response: 404\"}";
|
||||||
|
|
||||||
when(mockUrlConnection.getHeaderField("Content-Type")).thenReturn("application/problem+json");
|
when(mockUrlConnection.getHeaderField("Content-Type")).thenReturn("application/problem+json");
|
||||||
|
when(mockUrlConnection.getContentLength()).thenReturn(jsonData.length());
|
||||||
when(mockUrlConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_FORBIDDEN);
|
when(mockUrlConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_FORBIDDEN);
|
||||||
when(mockUrlConnection.getOutputStream()).thenReturn(new ByteArrayOutputStream());
|
when(mockUrlConnection.getOutputStream()).thenReturn(new ByteArrayOutputStream());
|
||||||
when(mockUrlConnection.getErrorStream()).thenReturn(new ByteArrayInputStream(jsonData.getBytes("utf-8")));
|
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()).getHeaderField("Content-Type");
|
||||||
verify(mockUrlConnection, atLeastOnce()).getResponseCode();
|
verify(mockUrlConnection, atLeastOnce()).getResponseCode();
|
||||||
|
verify(mockUrlConnection).getContentLength();
|
||||||
verify(mockUrlConnection).getErrorStream();
|
verify(mockUrlConnection).getErrorStream();
|
||||||
verify(mockUrlConnection).getURL();
|
verify(mockUrlConnection).getURL();
|
||||||
}
|
}
|
||||||
|
@ -461,6 +463,7 @@ public class DefaultConnectionTest {
|
||||||
linkHeader.put("Link", Arrays.asList("<https://example.com/tos.pdf>; rel=\"terms-of-service\""));
|
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.getHeaderField("Content-Type")).thenReturn("application/problem+json");
|
||||||
|
when(mockUrlConnection.getContentLength()).thenReturn(jsonData.length());
|
||||||
when(mockUrlConnection.getHeaderFields()).thenReturn(linkHeader);
|
when(mockUrlConnection.getHeaderFields()).thenReturn(linkHeader);
|
||||||
when(mockUrlConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_FORBIDDEN);
|
when(mockUrlConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_FORBIDDEN);
|
||||||
when(mockUrlConnection.getOutputStream()).thenReturn(new ByteArrayOutputStream());
|
when(mockUrlConnection.getOutputStream()).thenReturn(new ByteArrayOutputStream());
|
||||||
|
@ -484,6 +487,7 @@ public class DefaultConnectionTest {
|
||||||
verify(mockUrlConnection, atLeastOnce()).getHeaderFields();
|
verify(mockUrlConnection, atLeastOnce()).getHeaderFields();
|
||||||
verify(mockUrlConnection, atLeastOnce()).getResponseCode();
|
verify(mockUrlConnection, atLeastOnce()).getResponseCode();
|
||||||
verify(mockUrlConnection).getErrorStream();
|
verify(mockUrlConnection).getErrorStream();
|
||||||
|
verify(mockUrlConnection).getContentLength();
|
||||||
verify(mockUrlConnection, atLeastOnce()).getURL();
|
verify(mockUrlConnection, atLeastOnce()).getURL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -500,6 +504,7 @@ public class DefaultConnectionTest {
|
||||||
Instant retryAfter = Instant.now().plusSeconds(30L).truncatedTo(ChronoUnit.MILLIS);
|
Instant retryAfter = Instant.now().plusSeconds(30L).truncatedTo(ChronoUnit.MILLIS);
|
||||||
|
|
||||||
when(mockUrlConnection.getHeaderField("Content-Type")).thenReturn("application/problem+json");
|
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.getHeaderField("Retry-After")).thenReturn(retryAfter.toString());
|
||||||
when(mockUrlConnection.getHeaderFieldDate("Retry-After", 0L)).thenReturn(retryAfter.toEpochMilli());
|
when(mockUrlConnection.getHeaderFieldDate("Retry-After", 0L)).thenReturn(retryAfter.toEpochMilli());
|
||||||
when(mockUrlConnection.getHeaderFields()).thenReturn(linkHeader);
|
when(mockUrlConnection.getHeaderFields()).thenReturn(linkHeader);
|
||||||
|
@ -529,6 +534,7 @@ public class DefaultConnectionTest {
|
||||||
verify(mockUrlConnection).getHeaderFieldDate("Retry-After", 0L);
|
verify(mockUrlConnection).getHeaderFieldDate("Retry-After", 0L);
|
||||||
verify(mockUrlConnection, atLeastOnce()).getHeaderFields();
|
verify(mockUrlConnection, atLeastOnce()).getHeaderFields();
|
||||||
verify(mockUrlConnection, atLeastOnce()).getResponseCode();
|
verify(mockUrlConnection, atLeastOnce()).getResponseCode();
|
||||||
|
verify(mockUrlConnection).getContentLength();
|
||||||
verify(mockUrlConnection).getErrorStream();
|
verify(mockUrlConnection).getErrorStream();
|
||||||
verify(mockUrlConnection, atLeastOnce()).getURL();
|
verify(mockUrlConnection, atLeastOnce()).getURL();
|
||||||
}
|
}
|
||||||
|
@ -833,6 +839,7 @@ public class DefaultConnectionTest {
|
||||||
String jsonData = "{\n\"foo\":123,\n\"bar\":\"a-string\"\n}\n";
|
String jsonData = "{\n\"foo\":123,\n\"bar\":\"a-string\"\n}\n";
|
||||||
|
|
||||||
when(mockUrlConnection.getHeaderField("Content-Type")).thenReturn("application/json");
|
when(mockUrlConnection.getHeaderField("Content-Type")).thenReturn("application/json");
|
||||||
|
when(mockUrlConnection.getContentLength()).thenReturn(jsonData.length());
|
||||||
when(mockUrlConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_OK);
|
when(mockUrlConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_OK);
|
||||||
when(mockUrlConnection.getInputStream()).thenReturn(new ByteArrayInputStream(jsonData.getBytes("utf-8")));
|
when(mockUrlConnection.getInputStream()).thenReturn(new ByteArrayInputStream(jsonData.getBytes("utf-8")));
|
||||||
|
|
||||||
|
@ -845,6 +852,7 @@ public class DefaultConnectionTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
verify(mockUrlConnection).getHeaderField("Content-Type");
|
verify(mockUrlConnection).getHeaderField("Content-Type");
|
||||||
|
verify(mockUrlConnection).getContentLength();
|
||||||
verify(mockUrlConnection).getResponseCode();
|
verify(mockUrlConnection).getResponseCode();
|
||||||
verify(mockUrlConnection).getInputStream();
|
verify(mockUrlConnection).getInputStream();
|
||||||
verifyNoMoreInteractions(mockUrlConnection);
|
verifyNoMoreInteractions(mockUrlConnection);
|
||||||
|
|
Loading…
Reference in New Issue