Skip to content

Commit

Permalink
Escape non ASCII when converting Map to JSON
Browse files Browse the repository at this point in the history
  • Loading branch information
AymericDu committed Jul 25, 2019
1 parent f7e9444 commit 616f573
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 6 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ ext.isReleaseVersion = !version.endsWith('SNAPSHOT')
dependencies {
compile group: 'log4j', name: 'log4j', version: '1.2.17'
compile group: 'com.google.code.gson', name: 'gson', version: '2.5'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.9.1'

testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile 'org.mockito:mockito-core:1.9.5'
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/io/openio/sds/common/JsonUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;

import io.openio.sds.models.Position;

/**
Expand All @@ -28,6 +32,7 @@ public class JsonUtils {

private static final GsonBuilder builder = new GsonBuilder()
.registerTypeAdapter(Position.class, new PositionAdapter());
private static final ObjectMapper mapper = new ObjectMapper();

private static final Type MAP_TYPE = new TypeToken<Map<String, String>>() {
}.getType();
Expand Down Expand Up @@ -63,6 +68,16 @@ public static Map<String, Map<String, String>> jsonToMapMap(InputStream in) {
MAP_MAP_TYPE);
}

public static String jsonFromMap(Map<String, String> map) {
try {
mapper.getFactory()
.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
return mapper.writeValueAsString(map);
} catch (JsonProcessingException e) {
throw new IllegalArgumentException(e);
}
}

private static final class PositionAdapter implements
JsonSerializer<Position>, JsonDeserializer<Position> {

Expand All @@ -78,4 +93,5 @@ public JsonElement serialize(Position src, Type typeOfSrc,
return new JsonPrimitive(src.toString());
}
}

}
13 changes: 7 additions & 6 deletions src/main/java/io/openio/sds/proxy/ProxyClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static io.openio.sds.common.Check.checkArgument;
import static io.openio.sds.common.JsonUtils.gson;
import static io.openio.sds.common.JsonUtils.gsonForObject;
import static io.openio.sds.common.JsonUtils.jsonFromMap;
import static io.openio.sds.common.OioConstants.ACCOUNT_HEADER;
import static io.openio.sds.common.OioConstants.ACTION_MODE_HEADER;
import static io.openio.sds.common.OioConstants.CONTAINER_DEL_PROP;
Expand Down Expand Up @@ -475,8 +476,8 @@ public ContainerInfo createContainer(OioUrl url,
throws OioException {
checkArgument(null != url, INVALID_URL_MSG);
String body = format("{\"properties\": %1$s, \"system\": %2$s}",
(properties == null) ? "{}" : gsonForObject().toJson(properties),
(system == null) ? "{}" : gsonForObject().toJson(system));
(properties == null) ? "{}" : jsonFromMap(properties),
(system == null) ? "{}" : jsonFromMap(system));
OioHttpResponse resp = http.post(
format(CREATE_CONTAINER_FORMAT, settings.url(), settings.ns(),
Strings.urlEncode(url.account()),
Expand Down Expand Up @@ -751,7 +752,7 @@ public ObjectInfo putObject(ObjectInfo oinf, RequestContext reqCtx)
Map<String, String> props = oinf.properties();
String body = format("{\"chunks\": %1$s, \"properties\": %2$s}",
gsonForObject().toJson(oinf.chunks()),
props != null ? gsonForObject().toJson(props) : "{}");
props != null ? jsonFromMap(props) : "{}");
http.post(
format(PUT_OBJECT_FORMAT, settings.url(), settings.ns(),
Strings.urlEncode(oinf.url().account()),
Expand Down Expand Up @@ -1025,8 +1026,8 @@ public void setContainerProperties(OioUrl url,
if (clear)
request.query(FLUSH_PARAM, "1");
String body = format("{\"properties\": %1$s, \"system\": %2$s}",
(properties == null) ? "{}" : gsonForObject().toJson(properties),
(system == null) ? "{}" : gsonForObject().toJson(system));
(properties == null) ? "{}" : jsonFromMap(properties),
(system == null) ? "{}" : jsonFromMap(system));
request.body(body)
.hosts(hosts).verifier(CONTAINER_VERIFIER)
.withRequestContext(reqCtx).execute().close();
Expand Down Expand Up @@ -1289,7 +1290,7 @@ public void setObjectProperties(OioUrl url, Long version,
checkArgument(null != url && null != url.object(), INVALID_URL_MSG);
checkArgument(null != properties && properties.size() > 0, "Invalid properties");
String body = format("{\"properties\": %1$s}",
gsonForObject().toJson(properties));
jsonFromMap(properties));
RequestBuilder request = http.post(
format(OBJECT_SET_PROP, settings.url(), settings.ns(),
Strings.urlEncode(url.account()),
Expand Down
2 changes: 2 additions & 0 deletions src/test/java/io/openio/sds/ClientITest.java
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,8 @@ public void objectPutAndGetWithProperties() {
Assert.assertNotNull(oinf.chunkMethod());
Assert.assertNotNull(oinf.hashMethod());
Assert.assertEquals(props, oinf.properties());
Map<String, String> properties = client.getObjectProperties(url);
Assert.assertEquals(properties, oinf.properties());
} finally {
try {
client.deleteObject(url);
Expand Down

0 comments on commit 616f573

Please sign in to comment.