diff options
author | Meng Wang <mewan@google.com> | 2021-02-25 10:14:56 -0800 |
---|---|---|
committer | Meng Wang <mewan@google.com> | 2021-02-25 19:32:08 +0000 |
commit | e8e72b2d3f378e41d4e719f2b5ad339aaf3f507c (patch) | |
tree | b86fccc80bf452701c832d8405ecaee8489cac72 | |
parent | 33a86832302893f2701ff82f1ea8314fe9f706bd (diff) | |
download | service_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
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 |