diff --git a/commons/src/main/java/org/archive/util/UriUtils.java b/commons/src/main/java/org/archive/util/UriUtils.java index 8e01850b..7d546327 100644 --- a/commons/src/main/java/org/archive/util/UriUtils.java +++ b/commons/src/main/java/org/archive/util/UriUtils.java @@ -280,6 +280,13 @@ public class UriUtils { return true; } + if (TextUtils.matches("^.*[^:]//.*$", candidate)) { + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.fine("rejected: contains '//' (but not '://'): " + candidate); + } + return true; + } + // look for things that look like hostnames and not filenames? // look for too many dots but make sure we take into account that url may have hostname? diff --git a/commons/src/test/java/org/archive/util/UriUtilsTest.java b/commons/src/test/java/org/archive/util/UriUtilsTest.java index 3db3d6c0..ba990550 100644 --- a/commons/src/test/java/org/archive/util/UriUtilsTest.java +++ b/commons/src/test/java/org/archive/util/UriUtilsTest.java @@ -210,6 +210,14 @@ public class UriUtilsTest extends TestCase { tryAll(startsOrEndsWithPlusFalsePositives, false); } + protected static final String[] doubleSlashFalsePositives = new String[] { + ".//*", + "http://example.com/monkey//foo/whatever" + }; + public void testDoubleSlashFalsePositives() { + tryAll(startsOrEndsWithPlusFalsePositives, false); + } + /** * Test that all supplied candidates give the expected result, for each of * the 'legacy' (H1) likely-URI-tests