From 1488377e287e45542e0185fca4af6fffc11d3f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20K=C3=B6rber?= Date: Wed, 5 Oct 2016 00:14:53 +0200 Subject: [PATCH] Add support for Accept-Language header --- .../org/shredzone/acme4j/Authorization.java | 2 +- .../java/org/shredzone/acme4j/Certificate.java | 4 ++-- .../main/java/org/shredzone/acme4j/Session.java | 17 +++++++++++++++++ .../shredzone/acme4j/challenge/Challenge.java | 4 ++-- .../shredzone/acme4j/connector/Connection.java | 4 +++- .../acme4j/connector/DefaultConnection.java | 8 +++++++- .../acme4j/connector/ResourceIterator.java | 2 +- .../acme4j/provider/AbstractAcmeProvider.java | 2 +- .../org/shredzone/acme4j/AuthorizationTest.java | 6 +++--- .../org/shredzone/acme4j/CertificateTest.java | 4 ++-- .../org/shredzone/acme4j/RegistrationTest.java | 4 ++-- .../acme4j/challenge/ChallengeTest.java | 6 +++--- .../acme4j/challenge/HttpChallengeTest.java | 1 + .../acme4j/connector/DefaultConnectionTest.java | 6 +++++- .../acme4j/connector/DummyConnection.java | 2 +- .../acme4j/connector/ResourceIteratorTest.java | 2 +- .../provider/AbstractAcmeProviderTest.java | 4 ++-- 17 files changed, 54 insertions(+), 24 deletions(-) diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/Authorization.java b/acme4j-client/src/main/java/org/shredzone/acme4j/Authorization.java index e8ac8956..69f85be5 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/Authorization.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/Authorization.java @@ -178,7 +178,7 @@ public class Authorization extends AcmeResource { public void update() throws AcmeException { LOG.debug("update"); try (Connection conn = getSession().provider().connect()) { - int rc = conn.sendRequest(getLocation()); + int rc = conn.sendRequest(getLocation(), getSession()); if (rc != HttpURLConnection.HTTP_OK && rc != HttpURLConnection.HTTP_ACCEPTED) { conn.throwAcmeException(); } diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/Certificate.java b/acme4j-client/src/main/java/org/shredzone/acme4j/Certificate.java index b5e117a8..6280ed7e 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/Certificate.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/Certificate.java @@ -90,7 +90,7 @@ public class Certificate extends AcmeResource { if (cert == null) { LOG.debug("download"); try (Connection conn = getSession().provider().connect()) { - int rc = conn.sendRequest(getLocation()); + int rc = conn.sendRequest(getLocation(), getSession()); if (rc == HttpURLConnection.HTTP_ACCEPTED) { Date retryAfter = conn.getRetryAfterHeader(); if (retryAfter != null) { @@ -139,7 +139,7 @@ public class Certificate extends AcmeResource { URI link = chainCertUri; while (link != null && certChain.size() < MAX_CHAIN_LENGTH) { try (Connection conn = getSession().provider().connect()) { - int rc = conn.sendRequest(chainCertUri); + int rc = conn.sendRequest(chainCertUri, getSession()); if (rc != HttpURLConnection.HTTP_OK) { conn.throwAcmeException(); } diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/Session.java b/acme4j-client/src/main/java/org/shredzone/acme4j/Session.java index 22f9da86..56b04f76 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/Session.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/Session.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.EnumMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.ServiceLoader; @@ -46,6 +47,7 @@ public class Session { private byte[] nonce; private Map directoryMap; private Metadata metadata; + private Locale locale = Locale.getDefault(); protected Date directoryCacheExpiry; /** @@ -116,6 +118,21 @@ public class Session { this.nonce = nonce; } + /** + * Gets the current locale of this session. + */ + public Locale getLocale() { + return locale; + } + + /** + * Sets the locale used in this session. The locale is passed to the server as + * Accept-Language header. The server may respond with localized messages. + */ + public void setLocale(Locale locale) { + this.locale = locale; + } + /** * Returns the {@link AcmeProvider} that is used for this session. *

diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/challenge/Challenge.java b/acme4j-client/src/main/java/org/shredzone/acme4j/challenge/Challenge.java index 3078a363..0ab16b87 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/challenge/Challenge.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/challenge/Challenge.java @@ -77,7 +77,7 @@ public class Challenge extends AcmeResource { LOG.debug("bind"); try (Connection conn = session.provider().connect()) { - int rc = conn.sendRequest(location); + int rc = conn.sendRequest(location, session); if (rc != HttpURLConnection.HTTP_ACCEPTED) { conn.throwAcmeException(); } @@ -238,7 +238,7 @@ public class Challenge extends AcmeResource { public void update() throws AcmeException { LOG.debug("update"); try (Connection conn = getSession().provider().connect()) { - int rc = conn.sendRequest(getLocation()); + int rc = conn.sendRequest(getLocation(), getSession()); if (rc != HttpURLConnection.HTTP_OK && rc != HttpURLConnection.HTTP_ACCEPTED) { conn.throwAcmeException(); } diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/Connection.java b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/Connection.java index 77e6810c..ae42ab48 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/Connection.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/Connection.java @@ -35,9 +35,11 @@ public interface Connection extends AutoCloseable { * * @param uri * {@link URI} to send the request to. + * @param session + * {@link Session} instance to be used for tracking * @return HTTP response code */ - int sendRequest(URI uri) throws IOException; + int sendRequest(URI uri, Session session) throws IOException; /** * Sends a signed POST request. diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/DefaultConnection.java b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/DefaultConnection.java index 54eca085..f4165804 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/DefaultConnection.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/DefaultConnection.java @@ -77,10 +77,13 @@ public class DefaultConnection implements Connection { } @Override - public int sendRequest(URI uri) throws IOException { + public int sendRequest(URI uri, Session session) throws IOException { if (uri == null) { throw new NullPointerException("uri must not be null"); } + if (session == null) { + throw new NullPointerException("session must not be null"); + } assertConnectionIsClosed(); LOG.debug("GET {}", uri); @@ -88,6 +91,7 @@ public class DefaultConnection implements Connection { conn = httpConnector.openConnection(uri); conn.setRequestMethod("GET"); conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("Accept-Language", session.getLocale().toLanguageTag()); conn.setDoOutput(false); conn.connect(); @@ -117,6 +121,7 @@ public class DefaultConnection implements Connection { LOG.debug("Getting initial nonce, HEAD {}", uri); conn = httpConnector.openConnection(uri); conn.setRequestMethod("HEAD"); + conn.setRequestProperty("Accept-Language", session.getLocale().toLanguageTag()); conn.connect(); updateSession(session); conn = null; @@ -132,6 +137,7 @@ public class DefaultConnection implements Connection { conn.setRequestMethod("POST"); conn.setRequestProperty("Accept", "application/json"); conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("Accept-Language", session.getLocale().toLanguageTag()); conn.setRequestProperty("Content-Type", "application/json"); conn.setDoOutput(true); diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/ResourceIterator.java b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/ResourceIterator.java index ba287d18..21a51fbe 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/ResourceIterator.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/ResourceIterator.java @@ -147,7 +147,7 @@ public abstract class ResourceIterator implements Iterat @SuppressWarnings("unchecked") private void readAndQueue() throws AcmeException { try (Connection conn = session.provider().connect()) { - int rc = conn.sendRequest(nextUri); + int rc = conn.sendRequest(nextUri, session); if (rc != HttpURLConnection.HTTP_OK) { conn.throwAcmeException(); } diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/provider/AbstractAcmeProvider.java b/acme4j-client/src/main/java/org/shredzone/acme4j/provider/AbstractAcmeProvider.java index 4e5975ba..2661eed2 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/provider/AbstractAcmeProvider.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/provider/AbstractAcmeProvider.java @@ -47,7 +47,7 @@ public abstract class AbstractAcmeProvider implements AcmeProvider { @Override public Map directory(Session session, URI serverUri) throws AcmeException { try (Connection conn = connect()) { - int rc = conn.sendRequest(resolve(serverUri)); + int rc = conn.sendRequest(resolve(serverUri), session); if (rc != HttpURLConnection.HTTP_OK) { conn.throwAcmeException(); } diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/AuthorizationTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/AuthorizationTest.java index 1ee640a3..d9eeaaff 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/AuthorizationTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/AuthorizationTest.java @@ -119,7 +119,7 @@ public class AuthorizationTest { public void testUpdate() throws Exception { TestableConnectionProvider provider = new TestableConnectionProvider() { @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { assertThat(uri, is(locationUri)); return HttpURLConnection.HTTP_OK; } @@ -166,7 +166,7 @@ public class AuthorizationTest { TestableConnectionProvider provider = new TestableConnectionProvider() { @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { requestWasSent.set(true); assertThat(uri, is(locationUri)); return HttpURLConnection.HTTP_OK; @@ -209,7 +209,7 @@ public class AuthorizationTest { TestableConnectionProvider provider = new TestableConnectionProvider() { @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { assertThat(uri, is(locationUri)); return HttpURLConnection.HTTP_ACCEPTED; } diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/CertificateTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/CertificateTest.java index 32297d4a..b7f37fcf 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/CertificateTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/CertificateTest.java @@ -52,7 +52,7 @@ public class CertificateTest { private boolean isLocationUri; @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { assertThat(uri, isOneOf(locationUri, chainUri)); isLocationUri = uri.equals(locationUri); return HttpURLConnection.HTTP_OK; @@ -93,7 +93,7 @@ public class CertificateTest { TestableConnectionProvider provider = new TestableConnectionProvider() { @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { assertThat(uri, is(locationUri)); return HttpURLConnection.HTTP_ACCEPTED; } diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/RegistrationTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/RegistrationTest.java index 7268ae8a..110e88cb 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/RegistrationTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/RegistrationTest.java @@ -73,7 +73,7 @@ public class RegistrationTest { } @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { if (URI.create("https://example.com/acme/reg/1/authz").equals(uri)) { jsonResponse = new HashMap<>(); jsonResponse.put("authorizations", @@ -250,7 +250,7 @@ public class RegistrationTest { TestableConnectionProvider provider = new TestableConnectionProvider() { @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { fail("Attempted to download the certificate. Should be downloaded already!"); return HttpURLConnection.HTTP_OK; } diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/challenge/ChallengeTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/challenge/ChallengeTest.java index ee7497bc..92e53dfd 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/challenge/ChallengeTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/challenge/ChallengeTest.java @@ -62,7 +62,7 @@ public class ChallengeTest { public void testChallenge() throws Exception { TestableConnectionProvider provider = new TestableConnectionProvider() { @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { assertThat(uri, is(locationUri)); return HttpURLConnection.HTTP_ACCEPTED; } @@ -175,7 +175,7 @@ public class ChallengeTest { public void testUpdate() throws Exception { TestableConnectionProvider provider = new TestableConnectionProvider() { @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { assertThat(uri, is(locationUri)); return HttpURLConnection.HTTP_OK; } @@ -208,7 +208,7 @@ public class ChallengeTest { TestableConnectionProvider provider = new TestableConnectionProvider() { @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { assertThat(uri, is(locationUri)); return HttpURLConnection.HTTP_ACCEPTED; } diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/challenge/HttpChallengeTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/challenge/HttpChallengeTest.java index a4115f4d..eefbc410 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/challenge/HttpChallengeTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/challenge/HttpChallengeTest.java @@ -67,6 +67,7 @@ public class HttpChallengeTest { * Test that {@link Http01Challenge} uses the given address. */ @Test + @Deprecated public void testAddress() throws IOException { Http01Challenge challenge = new Http01Challenge(session); challenge.unmarshall(TestUtils.getJsonAsMap("httpChallenge")); diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DefaultConnectionTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DefaultConnectionTest.java index 31076bda..6d79e1e1 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DefaultConnectionTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DefaultConnectionTest.java @@ -30,6 +30,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import org.jose4j.base64url.Base64Url; @@ -62,6 +63,7 @@ public class DefaultConnectionTest { when(mockHttpConnection.openConnection(requestUri)).thenReturn(mockUrlConnection); session = TestUtils.session(); + session.setLocale(Locale.JAPAN); } /** @@ -400,11 +402,12 @@ public class DefaultConnectionTest { @Test public void testSendRequest() throws Exception { try (DefaultConnection conn = new DefaultConnection(mockHttpConnection)) { - conn.sendRequest(requestUri); + conn.sendRequest(requestUri, session); } verify(mockUrlConnection).setRequestMethod("GET"); verify(mockUrlConnection).setRequestProperty("Accept-Charset", "utf-8"); + verify(mockUrlConnection).setRequestProperty("Accept-Language", "ja-JP"); verify(mockUrlConnection).setDoOutput(false); verify(mockUrlConnection).connect(); verify(mockUrlConnection).getResponseCode(); @@ -441,6 +444,7 @@ public class DefaultConnectionTest { } verify(mockUrlConnection).setRequestMethod("HEAD"); + verify(mockUrlConnection, times(2)).setRequestProperty("Accept-Language", "ja-JP"); verify(mockUrlConnection, times(2)).connect(); verify(mockUrlConnection).setRequestMethod("POST"); diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DummyConnection.java b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DummyConnection.java index e356e794..4bf5bdd5 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DummyConnection.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DummyConnection.java @@ -30,7 +30,7 @@ import org.shredzone.acme4j.util.ClaimBuilder; public class DummyConnection implements Connection { @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { throw new UnsupportedOperationException(); } diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/ResourceIteratorTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/ResourceIteratorTest.java index bdcfc88c..5fe5b9c3 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/ResourceIteratorTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/ResourceIteratorTest.java @@ -133,7 +133,7 @@ public class ResourceIteratorTest { private int ix; @Override - public int sendRequest(URI uri) { + public int sendRequest(URI uri, Session session) { ix = pageURIs.indexOf(uri); assertThat(ix, is(greaterThanOrEqualTo(0))); return HttpURLConnection.HTTP_OK; diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeProviderTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeProviderTest.java index c74ab2d1..6c3da5d4 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeProviderTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeProviderTest.java @@ -83,7 +83,7 @@ public class AbstractAcmeProviderTest { final Connection connection = mock(Connection.class); final Session session = mock(Session.class); - when(connection.sendRequest(testResolvedUri)).thenReturn(HttpURLConnection.HTTP_OK); + when(connection.sendRequest(testResolvedUri, session)).thenReturn(HttpURLConnection.HTTP_OK); when(connection.readJsonResponse()).thenReturn(TestUtils.getJsonAsMap("directory")); AbstractAcmeProvider provider = new AbstractAcmeProvider() { @@ -108,7 +108,7 @@ public class AbstractAcmeProviderTest { Map map = provider.directory(session, testServerUri); assertThat(JsonUtil.toJson(map), sameJSONAs(TestUtils.getJson("directory"))); - verify(connection).sendRequest(testResolvedUri); + verify(connection).sendRequest(testResolvedUri, session); verify(connection).updateSession(any(Session.class)); verify(connection).readJsonResponse(); verify(connection).close();