Repository: struts
Updated Branches:
  refs/heads/master 91ae3448c -> d29caba5e


Uses better regex to improve performance


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/8df5a897
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/8df5a897
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/8df5a897

Branch: refs/heads/master
Commit: 8df5a897f61f3ef45c36fdd9275e66669ae4516c
Parents: 91ae344
Author: Lukasz Lenart <lukaszlen...@apache.org>
Authored: Tue Aug 1 11:29:23 2017 +0200
Committer: Lukasz Lenart <lukaszlen...@apache.org>
Committed: Tue Aug 1 11:29:23 2017 +0200

----------------------------------------------------------------------
 .../validator/validators/URLValidator.java      | 10 ++++----
 .../xwork2/validator/URLValidatorTest.java      | 26 ++++++++++++++++++++
 2 files changed, 31 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/8df5a897/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java
 
b/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java
index eab0fa8..6cf58ef 100644
--- 
a/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java
+++ 
b/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java
@@ -49,18 +49,18 @@ public class URLValidator extends FieldValidatorSupport {
     private static final Logger LOG = LogManager.getLogger(URLValidator.class);
 
     public static final String DEFAULT_URL_REGEX = "^(https?|ftp):\\/\\/" +
-            "(([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+" +
-            "(:([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+)?" +
+            "(([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=\\-]|%[0-9a-f]{2})+" +
+            "(:([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=\\-]|%[0-9a-f]{2})+)?" +
             "@)?(#?" +
             ")((([a-z0-9]\\.|[a-z0-9][a-z0-9-]*[a-z0-9]\\.)*" +
             "[a-z][a-z0-9-]*[a-z0-9]" +
             "|((\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])\\.){3}" +
             "(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])" +
             ")(:\\d+)?" +
-            
")(((\\/{0,1}([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)*" +
-            "(\\?([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)" +
+            ")(((\\/([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=\\-]|%[0-9a-f]{2})*)*" +
+            
"(\\?([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=\\-\\/\\:]|%[0-9a-f]{2})*)" +
             "?)?)?" +
-            "(#([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)?" +
+            "(#([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=\\-]|%[0-9a-f]{2})*)?" +
             "$";
 
     private String urlRegexExpression;

http://git-wip-us.apache.org/repos/asf/struts/blob/8df5a897/core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java 
b/core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java
index 5c83dd1..baa2bb1 100644
--- a/core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java
@@ -160,6 +160,32 @@ public class URLValidatorTest extends XWorkTestCase {
 
         
assertTrue(pattern.matcher("http://netsol-underconstruction-page-monitor-1.com/__media__/js/netsoltrademark.php?d=www.le-soutien-scolaire.fr%2Favis-et-test-comparatifs-des-robots-multifonctions%2F";).matches());
         
assertTrue(UrlValidator.getInstance().isValid("http://netsol-underconstruction-page-monitor-1.com/__media__/js/netsoltrademark.php?d=www.le-soutien-scolaire.fr%2Favis-et-test-comparatifs-des-robots-multifonctions%2F";));
+
+        //this will cause test to hang indefinitely using JDK 1.8.0_121, 
Struts 2.5.10.1 and JUnit 4.5
+        
assertTrue(pattern.matcher("http://www.javaroad.jp/news/redirect.jsp?link=http://www.forum-course-de-cote.com/que-penser-dune-trottinette-electrique/";).matches());
+        
assertTrue(UrlValidator.getInstance().isValid("http://www.javaroad.jp/news/redirect.jsp?link=http://www.forum-course-de-cote.com/que-penser-dune-trottinette-electrique/";));
+
+        //this will cause test to hang indefinitely using JDK 1.8.0_121, 
Struts 2.5.10.1 and JUnit 4.5
+        
assertTrue(pattern.matcher("http://wargame.ch/wc/acw/sub/aotm/guestbook/index.php?page3D183EClearwater20Roofing20Contractors3C/a3E3Ekaldu20non20msg3C/a3E";).matches());
+        
assertTrue(UrlValidator.getInstance().isValid("http://wargame.ch/wc/acw/sub/aotm/guestbook/index.php?page3D183EClearwater20Roofing20Contractors3C/a3E3Ekaldu20non20msg3C/a3E";));
+    }
+
+    public void testLongRunningValidations() throws Exception {
+        URLValidator validator = new URLValidator();
+
+        Pattern pattern = Pattern.compile(validator.getUrlRegex(), 
Pattern.CASE_INSENSITIVE);
+
+        long time = System.currentTimeMillis();
+        
assertFalse(pattern.matcher("ftp://aaaaaaaaaaaaaaaaaaaaaaaa|").matches());
+        assertTrue("Validation did not complete in half a second", 
System.currentTimeMillis() - time < 500);
+
+        time = System.currentTimeMillis();
+        
assertFalse(pattern.matcher("ftp://bbbbbbbbbbbbbbbbbbbbbbbb}";).matches());
+        assertTrue("Validation did not complete in half a second", 
System.currentTimeMillis() - time < 500);
+
+        time = System.currentTimeMillis();
+        
assertFalse(pattern.matcher("ftp://cccccccccccccccccccccccc{";).matches());
+        assertTrue("Validation did not complete in half a second", 
System.currentTimeMillis() - time < 500);
     }
 
     public void testValidUrlCaseInsensitive() throws Exception {

Reply via email to