diff --git a/src/main/java/com/adobe/epubcheck/messages/MessageDictionary.java b/src/main/java/com/adobe/epubcheck/messages/MessageDictionary.java index c3e92c571..0018eabd5 100644 --- a/src/main/java/com/adobe/epubcheck/messages/MessageDictionary.java +++ b/src/main/java/com/adobe/epubcheck/messages/MessageDictionary.java @@ -329,6 +329,7 @@ static Map getDefaultSeverities() map.put(MessageId.RSC_020, Severity.ERROR); map.put(MessageId.RSC_021, Severity.ERROR); map.put(MessageId.RSC_022, Severity.INFO); + map.put(MessageId.RSC_023, Severity.WARNING); // Scripting map.put(MessageId.SCP_001, Severity.USAGE); diff --git a/src/main/java/com/adobe/epubcheck/messages/MessageId.java b/src/main/java/com/adobe/epubcheck/messages/MessageId.java index 65ca93d88..81531aad1 100644 --- a/src/main/java/com/adobe/epubcheck/messages/MessageId.java +++ b/src/main/java/com/adobe/epubcheck/messages/MessageId.java @@ -292,6 +292,7 @@ public enum MessageId implements Comparable RSC_020("RSC-020"), RSC_021("RSC-021"), RSC_022("RSC-022"), + RSC_023("RSC-023"), // Messages relating to scripting SCP_001("SCP-001"), diff --git a/src/main/java/com/adobe/epubcheck/ops/OPSHandler.java b/src/main/java/com/adobe/epubcheck/ops/OPSHandler.java index 117a3b701..489afef44 100755 --- a/src/main/java/com/adobe/epubcheck/ops/OPSHandler.java +++ b/src/main/java/com/adobe/epubcheck/ops/OPSHandler.java @@ -224,9 +224,20 @@ else if (".".equals(href)) URI uri = checkURI(href); if (uri == null) return; - if ("http".equals(uri.getScheme())) + if ("http".equals(uri.getScheme()) || "https".equals(uri.getScheme())) { report.info(path, FeatureEnum.REFERENCE, href); + + /* + * #708 report invalid HTTP/HTTPS URLs + * uri.scheme may be correct, but missing a : or a / from the // + * leads to uri.getHost() == null + */ + if (uri.getHost() == null) + { + int missingSlashes = uri.getSchemeSpecificPart().startsWith("/") ? 1 : 2; + report.message(MessageId.RSC_023, parser.getLocation(), uri, missingSlashes, uri.getScheme()); + } } /* diff --git a/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties b/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties index 32c5fe587..fa192dd5d 100644 --- a/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties +++ b/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties @@ -293,6 +293,7 @@ RSC_019=EPUBs with Multiple Renditions should contain a META-INF/metadata.xml fi RSC_020='%1$s' is not a valid URI. RSC_021=A Search Key Map Document must point to Content Documents ('%1$s' was not found in the spine). RSC_022=Cannot check image details (requires Java version 7 or higher). +RSC_023=The URL '%1$s' is missing %2$d slash(es) '/' after the protocol '%3$s:' #Scripting SCP_001=Use of Javascript eval() function in EPUB scripts is a security risk. diff --git a/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java b/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java index 4c3f6046e..f5133d4ab 100644 --- a/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java +++ b/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java @@ -214,6 +214,15 @@ public void testValidateXHTMLLINKInvalid() EPUBVersion.VERSION_3); } + @Test + public void testValidateXHTMLUrlChecksInvalid() + { + Collections.addAll(expectedErrors, MessageId.RSC_020); + Collections.addAll(expectedWarnings, MessageId.HTM_025, MessageId.RSC_023, MessageId.RSC_023); + testValidateDocument("xhtml/invalid/url-checks_issue-708.xhtml", "application/xhtml+xml", + EPUBVersion.VERSION_3); + } + @Test public void testValidateXHTMLXml11() { diff --git a/src/test/resources/30/single/xhtml/invalid/url-checks_issue-708.xhtml b/src/test/resources/30/single/xhtml/invalid/url-checks_issue-708.xhtml new file mode 100644 index 000000000..8c7ef4041 --- /dev/null +++ b/src/test/resources/30/single/xhtml/invalid/url-checks_issue-708.xhtml @@ -0,0 +1,18 @@ + + + + + + +

+ Invalid URI (RSC-020) + Unsupported URI scheme (HTM-025) + URL is missing slashes after protocol (RSC-023) + URL is missing slashes after protocol (RSC-023) + + Valid URI + Valid URI + Valid URI +

+ +