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 771567ca06..cfdf51457a 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
@@ -34,6 +34,7 @@ import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicNameValuePair;
import org.keycloak.common.util.Base64;
@@ -47,6 +48,7 @@ import java.io.InputStreamReader;
import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
+import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -185,7 +187,7 @@ public class SimpleHttp {
boolean delete = method.equals("DELETE");
HttpRequestBase httpRequest = new HttpPost(url);
-
+
if (get) {
httpRequest = new HttpGet(appendParameterToUrl(url));
}
@@ -273,6 +275,8 @@ public class SimpleHttp {
HttpEntity entity = response.getEntity();
if (entity != null) {
is = entity.getContent();
+ ContentType contentType = ContentType.getOrDefault(entity);
+ Charset charset = contentType.getCharset();
try {
HeaderIterator it = response.headerIterator();
while (it.hasNext()) {
@@ -282,7 +286,8 @@ public class SimpleHttp {
}
}
- InputStreamReader reader = new InputStreamReader(is);
+ InputStreamReader reader = charset == null ? new InputStreamReader(is) :
+ new InputStreamReader(is, charset);
StringWriter writer = new StringWriter();
@@ -326,11 +331,11 @@ public class SimpleHttp {
public String getFirstHeader(String name) throws IOException {
readResponse();
Header[] headers = response.getHeaders(name);
-
+
if (headers != null && headers.length > 0) {
- return headers[0].getValue();
+ return headers[0].getValue();
}
-
+
return null;
}
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
new file mode 100644
index 0000000000..e6311fb3a8
--- /dev/null
+++ b/server-spi-private/src/test/java/org/keycloak/broker/provider/util/SimpleHttpTest.java
@@ -0,0 +1,68 @@
+package org.keycloak.broker.provider.util;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpVersion;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.message.BasicHttpResponse;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Collection;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+/**
+ * @author Andrey Khlebnikov
+ * @version $Revision: 1 $
+ */
+public final class SimpleHttpTest {
+
+ @RunWith(Parameterized.class)
+ public static final class ResponseConsideringCharsetTest {
+ private final StringEntity entity;
+ private final String original;
+ private final boolean success;
+
+ public ResponseConsideringCharsetTest(String original, Charset charset, boolean success) {
+ this.original = original;
+ this.success = success;
+ this.entity = new StringEntity(original, ContentType.create("text/plain", charset));
+ }
+
+ @Parameters(name = "{index}: withCharset({0}, {1}) = {2}")
+ public static Collection