diff --git a/server-spi-private/pom.xml b/server-spi-private/pom.xml index 7f051a35b51..47b32c7f75a 100755 --- a/server-spi-private/pom.xml +++ b/server-spi-private/pom.xml @@ -92,4 +92,20 @@ + + + + maven-surefire-plugin + + + + + + + -Dfile.encoding=UTF-8 + + + + + diff --git a/server-spi-private/src/main/java/org/keycloak/broker/provider/util/SimpleHttp.java b/server-spi-private/src/main/java/org/keycloak/broker/provider/util/SimpleHttp.java index 49fd82ae5ea..b648cb643c7 100755 --- a/server-spi-private/src/main/java/org/keycloak/broker/provider/util/SimpleHttp.java +++ b/server-spi-private/src/main/java/org/keycloak/broker/provider/util/SimpleHttp.java @@ -242,7 +242,7 @@ public class SimpleHttp { } private StringEntity getJsonEntity() throws IOException { - return new StringEntity(JsonSerialization.writeValueAsString(entity)); + return new StringEntity(JsonSerialization.writeValueAsString(entity), ContentType.getByMimeType(headers.get("Content-Type"))); } private UrlEncodedFormEntity getFormEntityFromParameter() throws IOException{ diff --git a/server-spi-private/src/test/java/org/keycloak/broker/provider/util/SimpleHttpTest.java b/server-spi-private/src/test/java/org/keycloak/broker/provider/util/SimpleHttpTest.java index e6311fb3a8a..a39443f59ee 100644 --- a/server-spi-private/src/test/java/org/keycloak/broker/provider/util/SimpleHttpTest.java +++ b/server-spi-private/src/test/java/org/keycloak/broker/provider/util/SimpleHttpTest.java @@ -1,15 +1,26 @@ package org.keycloak.broker.provider.util; import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpClient; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.conn.ClientConnectionManager; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.message.BasicHttpResponse; +import org.apache.http.params.HttpParams; +import org.apache.http.protocol.HttpContext; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; +import org.keycloak.common.util.StreamUtil; import java.io.IOException; import java.nio.charset.Charset; @@ -19,6 +30,7 @@ import java.util.Collection; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.fail; /** * @author Andrey Khlebnikov @@ -64,5 +76,102 @@ public final class SimpleHttpTest { response.setEntity(entity); return response; } + } + + @RunWith(Parameterized.class) + public static final class RequestConsideringEncodingTest { + private String value; + + public RequestConsideringEncodingTest(String value) { + this.value = value; + } + + @Parameters(name = "{index}: requestWithEncoding({0})") + public static Collection entities() { + return Arrays.asList(new Object[][] { { "English" }, { "Русский" }, { "GermanÜmläütß" } }); + } + + @Test + public void requestWithEncoding() throws IOException { + HttpClientMock client = new HttpClientMock(); + SimpleHttp.doPost("", client).json(new DummyEntity(value)).asResponse(); + assertEquals("{\"value\":\"" + value + "\"}", client.data); + } + + public static final class DummyEntity { + public String value; + public DummyEntity(String value) { + this.value = value; + } + } + + /** + * As no mocking framework is wanted, this is done the good old way. + */ + public static final class HttpClientMock implements HttpClient { + + String data; + + @Override + public HttpParams getParams() { + fail(); return null; + } + + @Override + public ClientConnectionManager getConnectionManager() { + fail(); return null; + } + + @Override + public HttpResponse execute(HttpUriRequest paramHttpUriRequest) throws IOException, ClientProtocolException { + HttpPost post = (HttpPost) paramHttpUriRequest; + data = StreamUtil.readString(post.getEntity().getContent()); + return null; + } + + @Override + public HttpResponse execute(HttpUriRequest paramHttpUriRequest, HttpContext paramHttpContext) + throws IOException, ClientProtocolException { + fail(); return null; + } + + @Override + public HttpResponse execute(HttpHost paramHttpHost, HttpRequest paramHttpRequest) throws IOException, ClientProtocolException { + fail(); return null; + } + + @Override + public HttpResponse execute(HttpHost paramHttpHost, HttpRequest paramHttpRequest, HttpContext paramHttpContext) + throws IOException, ClientProtocolException { + fail(); return null; + } + + @Override + public T execute(HttpUriRequest paramHttpUriRequest, ResponseHandler paramResponseHandler) + throws IOException, ClientProtocolException { + fail(); return null; + } + + @Override + public T execute(HttpUriRequest paramHttpUriRequest, ResponseHandler paramResponseHandler, + HttpContext paramHttpContext) throws IOException, ClientProtocolException { + fail(); return null; + } + + @Override + public T execute(HttpHost paramHttpHost, HttpRequest paramHttpRequest, ResponseHandler paramResponseHandler) + throws IOException, ClientProtocolException { + fail(); return null; + } + + @Override + public T execute(HttpHost paramHttpHost, HttpRequest paramHttpRequest, ResponseHandler paramResponseHandler, + HttpContext paramHttpContext) throws IOException, ClientProtocolException { + fail(); return null; + } + + } + } + } \ No newline at end of file