Introduce `forceHttps` flag in `JsonSchemaFactory.Builder` (#400)
* Provide a reproduce case for gh-314
* Introduce `forceHttps` flag in `JsonSchemaFactory.Builder`
diff --git a/src/main/java/com/networknt/schema/JsonSchemaFactory.java b/src/main/java/com/networknt/schema/JsonSchemaFactory.java
index c53e966..8fe4c51 100644
--- a/src/main/java/com/networknt/schema/JsonSchemaFactory.java
+++ b/src/main/java/com/networknt/schema/JsonSchemaFactory.java
@@ -47,6 +47,7 @@
private URNFactory urnFactory;
private final Map<String, JsonMetaSchema> jsonMetaSchemas = new HashMap<String, JsonMetaSchema>();
private final Map<String, String> uriMap = new HashMap<String, String>();
+ private boolean forceHttps = true;
public Builder() {
@@ -139,7 +140,10 @@
return this;
}
-
+ public Builder forceHttps(boolean forceHttps) {
+ this.forceHttps = forceHttps;
+ return this;
+ }
public JsonSchemaFactory build() {
// create builtin keywords with (custom) formats.
@@ -150,7 +154,8 @@
new URISchemeFetcher(uriFetcherMap),
urnFactory,
jsonMetaSchemas,
- uriMap
+ uriMap,
+ forceHttps
);
}
}
@@ -163,6 +168,7 @@
private final Map<String, JsonMetaSchema> jsonMetaSchemas;
private final Map<String, String> uriMap;
private final ConcurrentMap<URI, JsonSchema> uriSchemaCache = new ConcurrentHashMap<URI, JsonSchema>();
+ private final boolean forceHttps;
private JsonSchemaFactory(
@@ -172,7 +178,8 @@
final URISchemeFetcher uriFetcher,
final URNFactory urnFactory,
final Map<String, JsonMetaSchema> jsonMetaSchemas,
- final Map<String, String> uriMap) {
+ final Map<String, String> uriMap,
+ final boolean forceHttps) {
if (mapper == null) {
throw new IllegalArgumentException("ObjectMapper must not be null");
} else if (defaultMetaSchemaURI == null || defaultMetaSchemaURI.trim().isEmpty()) {
@@ -195,6 +202,7 @@
this.urnFactory = urnFactory;
this.jsonMetaSchemas = jsonMetaSchemas;
this.uriMap = uriMap;
+ this.forceHttps = forceHttps;
}
/**
@@ -273,7 +281,7 @@
private JsonMetaSchema findMetaSchemaForSchema(final JsonNode schemaNode) {
final JsonNode uriNode = schemaNode.get("$schema");
- final String uri = uriNode == null || uriNode.isNull() ? defaultMetaSchemaURI : normalizeMetaSchemaUri(uriNode.textValue());
+ final String uri = uriNode == null || uriNode.isNull() ? defaultMetaSchemaURI : normalizeMetaSchemaUri(uriNode.textValue(), forceHttps);
final JsonMetaSchema jsonMetaSchema = jsonMetaSchemas.get(uri);
if (jsonMetaSchema == null) {
throw new JsonSchemaException("Unknown MetaSchema: " + uri);
@@ -395,10 +403,11 @@
return result;
}
- static protected String normalizeMetaSchemaUri(String u) {
+ static protected String normalizeMetaSchemaUri(String u, boolean forceHttps) {
try {
URI uri = new URI(u);
- URI newUri = new URI("https", uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), null, null);
+ String scheme = forceHttps ? "https" : uri.getScheme();
+ URI newUri = new URI(scheme, uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), null, null);
return newUri.toString();
} catch (URISyntaxException e) {
throw new JsonSchemaException("Wrong MetaSchema URI: " + u);
diff --git a/src/main/java/com/networknt/schema/SpecVersionDetector.java b/src/main/java/com/networknt/schema/SpecVersionDetector.java
index 0b2e357..190ab4e 100644
--- a/src/main/java/com/networknt/schema/SpecVersionDetector.java
+++ b/src/main/java/com/networknt/schema/SpecVersionDetector.java
@@ -39,7 +39,7 @@
if (!jsonNode.has(SCHEMA_TAG))
throw new JsonSchemaException("Schema tag not present");
- String schemaUri = JsonSchemaFactory.normalizeMetaSchemaUri(jsonNode.get(SCHEMA_TAG).asText());
+ String schemaUri = JsonSchemaFactory.normalizeMetaSchemaUri(jsonNode.get(SCHEMA_TAG).asText(), true);
if (schemaUri.equals(JsonMetaSchema.getV4().getUri()))
return SpecVersion.VersionFlag.V4;
else if (schemaUri.equals(JsonMetaSchema.getV6().getUri()))
diff --git a/src/test/java/com/networknt/schema/Issue314Test.java b/src/test/java/com/networknt/schema/Issue314Test.java
new file mode 100644
index 0000000..c1fd163
--- /dev/null
+++ b/src/test/java/com/networknt/schema/Issue314Test.java
@@ -0,0 +1,26 @@
+package com.networknt.schema;
+
+import java.io.InputStream;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class Issue314Test {
+ private static final JsonSchemaFactory FACTORY =
+ JsonSchemaFactory.builder(JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7))
+ .addMetaSchema(
+ JsonMetaSchema.builder(
+ "http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0",
+ JsonMetaSchema.getV7())
+ .build())
+ .forceHttps(false)
+ .build();
+
+ @Test
+ public void testNormalizeHttpOnly() {
+ String schemaPath = "/schema/issue314-v7.json";
+ InputStream schemaInputStream = getClass().getResourceAsStream(schemaPath);
+ JsonSchema schema = FACTORY.getSchema(schemaInputStream);
+
+ Assert.assertNotNull(schema);
+ }
+}
diff --git a/src/test/java/com/networknt/schema/UnknownMetaSchemaTest.java b/src/test/java/com/networknt/schema/UnknownMetaSchemaTest.java
index 31b2039..e766602 100644
--- a/src/test/java/com/networknt/schema/UnknownMetaSchemaTest.java
+++ b/src/test/java/com/networknt/schema/UnknownMetaSchemaTest.java
@@ -64,10 +64,10 @@
String uri03 = "http://json-schema.org/draft-07/schema?key=value";
String uri04 = "http://json-schema.org/draft-07/schema?key=value&key2=value2";
String expected = "https://json-schema.org/draft-07/schema";
- Assert.assertEquals(expected, JsonSchemaFactory.normalizeMetaSchemaUri(uri01));
- Assert.assertEquals(expected, JsonSchemaFactory.normalizeMetaSchemaUri(uri02));
- Assert.assertEquals(expected, JsonSchemaFactory.normalizeMetaSchemaUri(uri03));
- Assert.assertEquals(expected, JsonSchemaFactory.normalizeMetaSchemaUri(uri04));
+ Assert.assertEquals(expected, JsonSchemaFactory.normalizeMetaSchemaUri(uri01, true));
+ Assert.assertEquals(expected, JsonSchemaFactory.normalizeMetaSchemaUri(uri02, true));
+ Assert.assertEquals(expected, JsonSchemaFactory.normalizeMetaSchemaUri(uri03, true));
+ Assert.assertEquals(expected, JsonSchemaFactory.normalizeMetaSchemaUri(uri04, true));
}
}
diff --git a/src/test/resources/schema/issue314-v7.json b/src/test/resources/schema/issue314-v7.json
new file mode 100644
index 0000000..c0d605c
--- /dev/null
+++ b/src/test/resources/schema/issue314-v7.json
@@ -0,0 +1,4 @@
+{
+ "$schema": "http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0#",
+ "type": "object"
+}