/*
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.util;
import java.io.UnsupportedEncodingException;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.mock.web.test.MockHttpServletRequest;
import static org.junit.Assert.*;
/**
* Unit tests for {@link UrlPathHelper}.
*
* @author Rob Harrop
* @author Juergen Hoeller
* @author Costin Leau
*/
public class UrlPathHelperTests {
private static final String WEBSPHERE_URI_ATTRIBUTE = "com.ibm.websphere.servlet.uri_non_decoded";
private final UrlPathHelper helper = new UrlPathHelper();
private final MockHttpServletRequest request = new MockHttpServletRequest();
@Test
public void getPathWithinApplication() {
request.setContextPath("/petclinic");
request.setRequestURI("/petclinic/welcome.html");
assertEquals("Incorrect path returned", "/welcome.html", helper.getPathWithinApplication(request));
}
@Test
public void getPathWithinApplicationForRootWithNoLeadingSlash() {
request.setContextPath("/petclinic");
request.setRequestURI("/petclinic");
assertEquals("Incorrect root path returned", "/", helper.getPathWithinApplication(request));
}
@Test
public void getPathWithinApplicationForSlashContextPath() {
request.setContextPath("/");
request.setRequestURI("/welcome.html");
assertEquals("Incorrect path returned", "/welcome.html", helper.getPathWithinApplication(request));
}
@Test
public void getPathWithinServlet() {
request.setContextPath("/petclinic");
request.setServletPath("/main");
request.setRequestURI("/petclinic/main/welcome.html");
assertEquals("Incorrect path returned", "/welcome.html", helper.getPathWithinServletMapping(request));
}
@Test
public void alwaysUseFullPath() {
helper.setAlwaysUseFullPath(true);
request.setContextPath("/petclinic");
request.setServletPath("/main");
request.setRequestURI("/petclinic/main/welcome.html");
assertEquals("Incorrect path returned", "/main/welcome.html", helper.getLookupPathForRequest(request));
}
// SPR-11101
@Test
public void getPathWithinServletWithoutUrlDecoding() {
request.setContextPath("/SPR-11101");
request.setServletPath("/test_url_decoding/a/b");
request.setRequestURI("/test_url_decoding/a%2Fb");
helper.setUrlDecode(false);
String actual = helper.getPathWithinServletMapping(request);
assertEquals("/test_url_decoding/a%2Fb", actual);
}
@Test
public void getRequestUri() {
request.setRequestURI("/welcome.html");
assertEquals("Incorrect path returned", "/welcome.html", helper.getRequestUri(request));
request.setRequestURI("/foo%20bar");
assertEquals("Incorrect path returned", "/foo bar", helper.getRequestUri(request));
request.setRequestURI("/foo+bar");
assertEquals("Incorrect path returned", "/foo+bar", helper.getRequestUri(request));
}
@Test
public void getRequestRemoveSemicolonContent() throws UnsupportedEncodingException {
helper.setRemoveSemicolonContent(true);
request.setRequestURI("/foo;f=F;o=O;o=O/bar;b=B;a=A;r=R");
assertEquals("/foo/bar", helper.getRequestUri(request));
// SPR-13455
request.setServletPath("/foo/1");
request.setRequestURI("/foo/;test/1");
assertEquals("/foo/1", helper.getRequestUri(request));
}
@Test
public void getRequestKeepSemicolonContent() throws UnsupportedEncodingException {
helper.setRemoveSemicolonContent(false);
request.setRequestURI("/foo;a=b;c=d");
assertEquals("/foo;a=b;c=d", helper.getRequestUri(request));
request.setRequestURI("/foo;jsessionid=c0o7fszeb1");
assertEquals("jsessionid should always be removed", "/foo", helper.getRequestUri(request));
request.setRequestURI("/foo;a=b;jsessionid=c0o7fszeb1;c=d");
assertEquals("jsessionid should always be removed", "/foo;a=b;c=d", helper.getRequestUri(request));
// SPR-10398
request.setRequestURI("/foo;a=b;JSESSIONID=c0o7fszeb1;c=d");
assertEquals("JSESSIONID should always be removed", "/foo;a=b;c=d", helper.getRequestUri(request));
}
@Test
public void getLookupPathWithSemicolonContent() {
helper.setRemoveSemicolonContent(false);
request.setContextPath("/petclinic");
request.setServletPath("/main");
request.setRequestURI("/petclinic;a=b/main;b=c/welcome.html;c=d");
assertEquals("/welcome.html;c=d", helper.getLookupPathForRequest(request));
}
@Test
public void getLookupPathWithSemicolonContentAndNullPathInfo() {
helper.setRemoveSemicolonContent(false);
request.setContextPath("/petclinic");
request.setServletPath("/welcome.html");
request.setRequestURI("/petclinic;a=b/welcome.html;c=d");
assertEquals("/welcome.html;c=d", helper.getLookupPathForRequest(request));
}
//
// suite of tests root requests for default servlets (SRV 11.2) on Websphere vs Tomcat and other containers
// see: http://jira.springframework.org/browse/SPR-7064
//
//
// / mapping (default servlet)
//
@Test
public void tomcatDefaultServletRoot() throws Exception {
request.setContextPath("/test");
request.setPathInfo(null);
request.setServletPath("/");
request.setRequestURI("/test/");
assertEquals("/", helper.getLookupPathForRequest(request));
}
@Test
public void tomcatDefaultServletFile() throws Exception {
request.setContextPath("/test");
request.setPathInfo(null);
request.setServletPath("/foo");
request.setRequestURI("/test/foo");
assertEquals("/foo", helper.getLookupPathForRequest(request));
}
@Test
public void tomcatDefaultServletFolder() throws Exception {
request.setContextPath("/test");
request.setPathInfo(null);
request.setServletPath("/foo/");
request.setRequestURI("/test/foo/");
assertEquals("/foo/", helper.getLookupPathForRequest(request));
}
//SPR-12372 & SPR-13455
@Test
public void removeDuplicateSlashesInPath() throws Exception {
request.setContextPath("/SPR-12372");
request.setPathInfo(null);
request.setServletPath("/foo/bar/");
request.setRequestURI("/SPR-12372/foo//bar/");
assertEquals("/foo/bar/", helper.getLookupPathForRequest(request));
request.setServletPath("/foo/bar/");
request.setRequestURI("/SPR-12372/foo/bar//");
assertEquals("/foo/bar/", helper.getLookupPathForRequest(request));
// "normal" case
request.setServletPath("/foo/bar//");
request.setRequestURI("/SPR-12372/foo/bar//");
assertEquals("/foo/bar//", helper.getLookupPathForRequest(request));
}
@Test
public void wasDefaultServletRoot() throws Exception {
request.setContextPath("/test");
request.setPathInfo("/");
request.setServletPath("");
request.setRequestURI("/test/");
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/");
assertEquals("/", helper.getLookupPathForRequest(request));
}
@Test
public void wasDefaultServletRootWithCompliantSetting() throws Exception {
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/");
tomcatDefaultServletRoot();
}
@Test
public void wasDefaultServletFile() throws Exception {
request.setContextPath("/test");
request.setPathInfo("/foo");
request.setServletPath("");
request.setRequestURI("/test/foo");
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo");
assertEquals("/foo", helper.getLookupPathForRequest(request));
}
@Test
public void wasDefaultServletFileWithCompliantSetting() throws Exception {
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo");
tomcatDefaultServletFile();
}
@Test
public void wasDefaultServletFolder() throws Exception {
request.setContextPath("/test");
request.setPathInfo("/foo/");
request.setServletPath("");
request.setRequestURI("/test/foo/");
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo/");
assertEquals("/foo/", helper.getLookupPathForRequest(request));
}
@Test
public void wasDefaultServletFolderWithCompliantSetting() throws Exception {
UrlPathHelper.websphereComplianceFlag = true;
try {
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo/");
tomcatDefaultServletFolder();
}
finally {
UrlPathHelper.websphereComplianceFlag = false;
}
}
//
// /foo/* mapping
//
@Test
public void tomcatCasualServletRoot() throws Exception {
request.setContextPath("/test");
request.setPathInfo("/");
request.setServletPath("/foo");
request.setRequestURI("/test/foo/");
assertEquals("/", helper.getLookupPathForRequest(request));
}
// test the root mapping for /foo/* w/o a trailing slash - <host>/<context>/foo
@Test @Ignore
public void tomcatCasualServletRootWithMissingSlash() throws Exception {
request.setContextPath("/test");
request.setPathInfo(null);
request.setServletPath("/foo");
request.setRequestURI("/test/foo");
assertEquals("/", helper.getLookupPathForRequest(request));
}
@Test
public void tomcatCasualServletFile() throws Exception {
request.setContextPath("/test");
request.setPathInfo("/foo");
request.setServletPath("/foo");
request.setRequestURI("/test/foo/foo");
assertEquals("/foo", helper.getLookupPathForRequest(request));
}
@Test
public void tomcatCasualServletFolder() throws Exception {
request.setContextPath("/test");
request.setPathInfo("/foo/");
request.setServletPath("/foo");
request.setRequestURI("/test/foo/foo/");
assertEquals("/foo/", helper.getLookupPathForRequest(request));
}
@Test
public void wasCasualServletRoot() throws Exception {
request.setContextPath("/test");
request.setPathInfo(null);
request.setServletPath("/foo/");
request.setRequestURI("/test/foo/");
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo/");
assertEquals("/", helper.getLookupPathForRequest(request));
}
@Test
public void wasCasualServletRootWithCompliantSetting() throws Exception {
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo/");
tomcatCasualServletRoot();
}
// test the root mapping for /foo/* w/o a trailing slash - <host>/<context>/foo
@Ignore
@Test
public void wasCasualServletRootWithMissingSlash() throws Exception {
request.setContextPath("/test");
request.setPathInfo(null);
request.setServletPath("/foo");
request.setRequestURI("/test/foo");
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo");
assertEquals("/", helper.getLookupPathForRequest(request));
}
@Ignore
@Test
public void wasCasualServletRootWithMissingSlashWithCompliantSetting() throws Exception {
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo");
tomcatCasualServletRootWithMissingSlash();
}
@Test
public void wasCasualServletFile() throws Exception {
request.setContextPath("/test");
request.setPathInfo("/foo");
request.setServletPath("/foo");
request.setRequestURI("/test/foo/foo");
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo/foo");
assertEquals("/foo", helper.getLookupPathForRequest(request));
}
@Test
public void wasCasualServletFileWithCompliantSetting() throws Exception {
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo/foo");
tomcatCasualServletFile();
}
@Test
public void wasCasualServletFolder() throws Exception {
request.setContextPath("/test");
request.setPathInfo("/foo/");
request.setServletPath("/foo");
request.setRequestURI("/test/foo/foo/");
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo/foo/");
assertEquals("/foo/", helper.getLookupPathForRequest(request));
}
@Test
public void wasCasualServletFolderWithCompliantSetting() throws Exception {
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/test/foo/foo/");
tomcatCasualServletFolder();
}
@Test
public void getOriginatingRequestUri() {
request.setAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE, "/path");
request.setRequestURI("/forwarded");
assertEquals("/path", helper.getOriginatingRequestUri(request));
}
@Test
public void getOriginatingRequestUriWebsphere() {
request.setAttribute(WEBSPHERE_URI_ATTRIBUTE, "/path");
request.setRequestURI("/forwarded");
assertEquals("/path", helper.getOriginatingRequestUri(request));
}
@Test
public void getOriginatingRequestUriDefault() {
request.setRequestURI("/forwarded");
assertEquals("/forwarded", helper.getOriginatingRequestUri(request));
}
@Test
public void getOriginatingQueryString() {
request.setQueryString("forward=on");
request.setAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE, "/path");
request.setAttribute(WebUtils.FORWARD_QUERY_STRING_ATTRIBUTE, "original=on");
assertEquals("original=on", this.helper.getOriginatingQueryString(request));
}
@Test
public void getOriginatingQueryStringNotPresent() {
request.setQueryString("forward=true");
assertEquals("forward=true", this.helper.getOriginatingQueryString(request));
}
@Test
public void getOriginatingQueryStringIsNull() {
request.setQueryString("forward=true");
request.setAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE, "/path");
assertNull(this.helper.getOriginatingQueryString(request));
}
}