FOP-2973: Cannot use custom schemes starting with "data" in resource resolver
Thanks to J Frank
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1894165 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/fop-core/src/main/java/org/apache/fop/apps/io/InternalResourceResolver.java b/fop-core/src/main/java/org/apache/fop/apps/io/InternalResourceResolver.java
index af0a264..a6fbfaf 100644
--- a/fop-core/src/main/java/org/apache/fop/apps/io/InternalResourceResolver.java
+++ b/fop-core/src/main/java/org/apache/fop/apps/io/InternalResourceResolver.java
@@ -86,7 +86,7 @@
* @throws IOException if an I/O error occurred
*/
public Resource getResource(URI uri) throws IOException {
- if (uri.getScheme() != null && uri.getScheme().startsWith("data")) {
+ if (uri.getScheme() != null && uri.getScheme().equals("data")) {
return new Resource(resolveDataURI(uri.toASCIIString()));
}
return resourceResolver.getResource(resolveFromBase(uri));
diff --git a/fop-core/src/test/java/org/apache/fop/apps/io/URIResolverWrapperTestCase.java b/fop-core/src/test/java/org/apache/fop/apps/io/URIResolverWrapperTestCase.java
index b2044e3..50568db 100644
--- a/fop-core/src/test/java/org/apache/fop/apps/io/URIResolverWrapperTestCase.java
+++ b/fop-core/src/test/java/org/apache/fop/apps/io/URIResolverWrapperTestCase.java
@@ -19,6 +19,8 @@
package org.apache.fop.apps.io;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
@@ -35,7 +37,11 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import org.apache.commons.io.IOUtils;
+
import org.apache.xmlgraphics.io.ResourceResolver;
+import org.apache.xmlgraphics.util.WriterOutputStream;
+import org.apache.xmlgraphics.util.io.Base64EncodeStream;
public class URIResolverWrapperTestCase {
@@ -60,7 +66,8 @@
@Test
public void testResolveIn() throws Exception {
- String[] uris = new String[] {".", "resource", "path/to/resource"};
+ String[] uris = new String[]{".", "resource", "path/to/resource",
+ "datafoo:application/octet-stream;interpreter=fop;base64,AAECAwQF"};
for (String base : BASE_URIS) {
setBase(base);
for (String uriStr : uris) {
@@ -72,6 +79,20 @@
}
@Test
+ public void testGetResourceForURIStartingWithData() throws Exception {
+ String uriStr = "data:application/octet-stream;interpreter=fop;base64,AAECAwQF";
+ ResourceResolver resolver = mock(ResourceResolver.class);
+ InternalResourceResolver sut = new InternalResourceResolver(base, resolver);
+ URI uri = new URI(uriStr);
+ InputStream actual = sut.getResource(uri);
+ StringWriter stringWriter = new StringWriter();
+ Base64EncodeStream out = new Base64EncodeStream(
+ new WriterOutputStream(stringWriter, "US-ASCII"), false);
+ IOUtils.copy(actual, out);
+ assertEquals("AAECAwQF", stringWriter.toString());
+ }
+
+ @Test
public void testResolveInBadUri() throws Exception {
String[] uris = new String[] {"path\\to\\resource", "bad resource name"};
for (String base : BASE_URIS) {