diff --git a/org.springframework.web/src/main/java/org/springframework/web/util/WebUtils.java b/org.springframework.web/src/main/java/org/springframework/web/util/WebUtils.java index af858775572..c11df93a05f 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/util/WebUtils.java +++ b/org.springframework.web/src/main/java/org/springframework/web/util/WebUtils.java @@ -653,6 +653,20 @@ public abstract class WebUtils { * @return the extracted URI filename (e.g. "index") */ public static String extractFilenameFromUrlPath(String urlPath) { + String filename = extractFullFilenameFromUrlPath(urlPath); + int dotIndex = filename.lastIndexOf('.'); + if (dotIndex != -1) { + filename = filename.substring(0, dotIndex); + } + return filename; + } + /** + * Extract the full URL filename (including file extension) from the given request URL path. + * Correctly resolves nested paths such as "/products/view.html" as well. + * @param urlPath the request URL path (e.g. "/products/index.html") + * @return the extracted URI filename (e.g. "index.html") + */ + public static String extractFullFilenameFromUrlPath(String urlPath) { int end = urlPath.indexOf(';'); if (end == -1) { end = urlPath.indexOf('?'); @@ -661,12 +675,7 @@ public abstract class WebUtils { } } int begin = urlPath.lastIndexOf('/', end) + 1; - String filename = urlPath.substring(begin, end); - int dotIndex = filename.lastIndexOf('.'); - if (dotIndex != -1) { - filename = filename.substring(0, dotIndex); - } - return filename; + return urlPath.substring(begin, end); } } diff --git a/org.springframework.web/src/test/java/org/springframework/web/util/WebUtilsTests.java b/org.springframework.web/src/test/java/org/springframework/web/util/WebUtilsTests.java index 1225e85f850..616dc66686b 100644 --- a/org.springframework.web/src/test/java/org/springframework/web/util/WebUtilsTests.java +++ b/org.springframework.web/src/test/java/org/springframework/web/util/WebUtilsTests.java @@ -19,14 +19,18 @@ package org.springframework.web.util; import java.util.HashMap; import java.util.Map; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import org.junit.Test; /** * @author Juergen Hoeller + * @author Arjen Poutsma */ -public class WebUtilsTests extends TestCase { +public class WebUtilsTests { - public void testFindParameterValue() { + @Test + public void findParameterValue() { Map params = new HashMap(); params.put("myKey1", "myValue1"); params.put("myKey2_myValue2", "xxx"); @@ -40,7 +44,8 @@ public class WebUtilsTests extends TestCase { assertEquals("myValue4", WebUtils.findParameterValue(params, "myKey4")); } - public void testExtractFilenameFromUrlPath() { + @Test + public void extractFilenameFromUrlPath() { assertEquals("index", WebUtils.extractFilenameFromUrlPath("index.html")); assertEquals("index", WebUtils.extractFilenameFromUrlPath("/index.html")); assertEquals("view", WebUtils.extractFilenameFromUrlPath("/products/view.html")); @@ -49,4 +54,14 @@ public class WebUtilsTests extends TestCase { assertEquals("view", WebUtils.extractFilenameFromUrlPath("/products/view.html?param=/path/a.do")); } + @Test + public void extractFullFilenameFromUrlPath() { + assertEquals("index.html", WebUtils.extractFullFilenameFromUrlPath("index.html")); + assertEquals("index.html", WebUtils.extractFullFilenameFromUrlPath("/index.html")); + assertEquals("view.html", WebUtils.extractFullFilenameFromUrlPath("/products/view.html")); + assertEquals("view.html", WebUtils.extractFullFilenameFromUrlPath("/products/view.html?param=a")); + assertEquals("view.html", WebUtils.extractFullFilenameFromUrlPath("/products/view.html?param=/path/a")); + assertEquals("view.html", WebUtils.extractFullFilenameFromUrlPath("/products/view.html?param=/path/a.do")); + } + }