aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMeng Wang <mewan@google.com>2021-02-25 10:14:56 -0800
committerMeng Wang <mewan@google.com>2021-02-25 19:32:08 +0000
commite8e72b2d3f378e41d4e719f2b5ad339aaf3f507c (patch)
treeb86fccc80bf452701c832d8405ecaee8489cac72
parent33a86832302893f2701ff82f1ea8314fe9f706bd (diff)
downloadservice_entitlement-e8e72b2d3f378e41d4e719f2b5ad339aaf3f507c.tar.gz
Undo JSON escaping of forward-slash in POST body
Android JSON toString() escapes forward-slash with back-slash. It's not supported by some vendor and not mandatory in JSON spec. Undo escaping. Bug: 181238451 Test: manual Change-Id: I11267cac34053aa9c1b000389421fedc5f3966ad
-rw-r--r--java/com/android/libraries/entitlement/http/HttpClient.java7
-rw-r--r--tests/src/com/android/libraries/entitlement/http/HttpClientTest.java25
-rw-r--r--tests/utils/com/android/libraries/entitlement/testing/FakeURLStreamHandler.java7
3 files changed, 36 insertions, 3 deletions
diff --git a/java/com/android/libraries/entitlement/http/HttpClient.java b/java/com/android/libraries/entitlement/http/HttpClient.java
index f88a42c..8476164 100644
--- a/java/com/android/libraries/entitlement/http/HttpClient.java
+++ b/java/com/android/libraries/entitlement/http/HttpClient.java
@@ -62,8 +62,11 @@ public class HttpClient {
try {
if (POST.equals(request.requestMethod())) {
try (OutputStream out = new DataOutputStream(mConnection.getOutputStream())) {
- out.write(request.postData().toString().getBytes(UTF_8));
- logPii("HttpClient.request post data: " + request.postData());
+ // Android JSON toString() escapes forward-slash with back-slash. It's not
+ // supported by some vendor and not mandatory in JSON spec. Undo escaping.
+ String postData = request.postData().toString().replace("\\/", "/");
+ out.write(postData.getBytes(UTF_8));
+ logPii("HttpClient.request post data: " + postData);
}
}
mConnection.connect(); // This is to trigger SocketTimeoutException early
diff --git a/tests/src/com/android/libraries/entitlement/http/HttpClientTest.java b/tests/src/com/android/libraries/entitlement/http/HttpClientTest.java
index 6a08295..5838bb7 100644
--- a/tests/src/com/android/libraries/entitlement/http/HttpClientTest.java
+++ b/tests/src/com/android/libraries/entitlement/http/HttpClientTest.java
@@ -38,6 +38,7 @@ import com.android.libraries.entitlement.testing.FakeURLStreamHandler.FakeRespon
import com.google.common.collect.ImmutableMap;
+import org.json.JSONObject;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -167,4 +168,28 @@ public class HttpClientTest {
assertThat(httpResponse.body()).isEqualTo(TEST_RESPONSE_BODY);
assertThat(httpResponse.responseCode()).isEqualTo(HttpURLConnection.HTTP_OK);
}
+
+ @Test
+ public void request_postJson_doNotEscapeForwardSlash() throws Exception {
+ String postData = "{\"key\":\"base64/base64+b\"}";
+ HttpRequest request =
+ HttpRequest.builder()
+ .setUrl(TEST_URL)
+ .setRequestMethod(RequestMethod.POST)
+ .setPostData(new JSONObject(postData))
+ .build();
+ FakeResponse responseContent =
+ FakeResponse.builder()
+ .setResponseCode(HttpURLConnection.HTTP_OK)
+ .setResponseBody(TEST_RESPONSE_BODY.getBytes(UTF_8))
+ .setContentType(CONTENT_TYPE_STRING_JSON)
+ .build();
+ Map<String, FakeResponse> response = ImmutableMap.of(TEST_URL, responseContent);
+ sFakeURLStreamHandler.stubResponse(response);
+
+ HttpResponse httpResponse = mHttpClient.request(request);
+
+ FakeHttpsURLConnection connection = sFakeURLStreamHandler.getConnections().get(0);
+ assertThat(connection.getBytesWrittenToOutputStream()).isEqualTo(postData.getBytes(UTF_8));
+ }
}
diff --git a/tests/utils/com/android/libraries/entitlement/testing/FakeURLStreamHandler.java b/tests/utils/com/android/libraries/entitlement/testing/FakeURLStreamHandler.java
index bee3d0c..a5bdb4c 100644
--- a/tests/utils/com/android/libraries/entitlement/testing/FakeURLStreamHandler.java
+++ b/tests/utils/com/android/libraries/entitlement/testing/FakeURLStreamHandler.java
@@ -81,6 +81,7 @@ public class FakeURLStreamHandler extends URLStreamHandler implements URLStreamH
/** Faked {@link HttpsURLConnection} to avoid making any network connection. */
public static class FakeHttpsURLConnection extends HttpsURLConnection {
private final FakeResponse mResponse;
+ private final ByteArrayOutputStream mOutputStream = new ByteArrayOutputStream();
public FakeHttpsURLConnection(URL url, FakeResponse response) {
super(url);
@@ -94,7 +95,11 @@ public class FakeURLStreamHandler extends URLStreamHandler implements URLStreamH
@Override
public OutputStream getOutputStream() {
- return new ByteArrayOutputStream();
+ return mOutputStream;
+ }
+
+ public byte[] getBytesWrittenToOutputStream() {
+ return mOutputStream.toByteArray();
}
@Override