blob: 5aa035078d1090c60aaf58cb37e953afda207f74 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.wicket.protocol.http.servlet;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.Page;
import org.apache.wicket.markup.IMarkupResourceStreamProvider;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.mock.MockApplication;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.StringResourceStream;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.jupiter.api.Test;
/**
* Tests for {@link ServletWebRequest}
*/
class ServletWebRequestTest
{
/**
* Tests that {@link ServletWebRequest#getClientUrl()} returns the current url + the query
* string when this is not error dispatched request. When the request is error dispatched it
* returns just the request uri to the error page without the query string
*/
@Test
void wicket3599()
{
MockHttpServletRequest httpRequest = new MockHttpServletRequest(null, null, null);
httpRequest.setURL(httpRequest.getContextPath() + "/request/Uri");
httpRequest.setParameter("some", "parameter");
ServletWebRequest webRequest = new ServletWebRequest(httpRequest, "");
Url clientUrl = webRequest.getClientUrl();
assertEquals("request/Uri?some=parameter", clientUrl.toString());
// simulates a request that has errors metadata
httpRequest.setAttribute("jakarta.servlet.error.request_uri", httpRequest.getContextPath()
+ "/any/source/of/error");
ServletWebRequest errorWebRequest = new ServletWebRequest(httpRequest, "");
Url errorClientUrl = errorWebRequest.getClientUrl();
assertEquals("any/source/of/error", errorClientUrl.toString());
}
/**
* <a href="https://issues.apache.org/jira/browse/WICKET-4168">WICKET-4168</a>
*/
@Test
void testClientURLIsContextRelativeInErrorResponses()
{
MockHttpServletRequest httpRequest = new MockHttpServletRequest(null, null, null);
httpRequest.setURL(httpRequest.getContextPath() + "/request/Uri");
String problematiURI = httpRequest.getContextPath() + "/any/source/of/error";
httpRequest.setAttribute("jakarta.servlet.error.request_uri", problematiURI);
ServletWebRequest errorWebRequest = new ServletWebRequest(httpRequest, "");
Url errorClientUrl = errorWebRequest.getClientUrl();
assertEquals("any/source/of/error", errorClientUrl.toString());
}
/**
* https://issues.apache.org/jira/browse/WICKET-4138
*
* Relative Urls should be calculated against 'javax.servlet.forward.request_uri'
*/
@Test
void parseForwardAttributes()
{
MockHttpServletRequest httpRequest = new MockHttpServletRequest(null, null, null);
httpRequest.setURL(httpRequest.getContextPath() + "/request/Uri");
String forwardedURI = httpRequest.getContextPath() + "/some/forwarded/url";
httpRequest.setAttribute("jakarta.servlet.forward.request_uri", forwardedURI);
ServletWebRequest forwardWebRequest = new ServletWebRequest(httpRequest, "");
Url forwardClientUrl = forwardWebRequest.getClientUrl();
assertEquals("some/forwarded/url", forwardClientUrl.toString());
}
/**
* https://issues.apache.org/jira/browse/WICKET-4123
*/
@Test
void useCustomServletWebRequest()
{
WebApplication application = new MockApplication()
{
@Override
public Class<? extends Page> getHomePage()
{
return CustomRequestPage.class;
}
@Override
public WebRequest newWebRequest(HttpServletRequest servletRequest, String filterPath)
{
return new CustomServletWebRequest(servletRequest, filterPath);
}
};
WicketTester tester = new WicketTester(application);
try
{
tester.startPage(new CustomRequestPage());
}
finally
{
tester.destroy();
}
}
/**
* Assert that ServletWebRequest#getClientUrl() will throw an AbortWithHttpErrorCodeException
* with error code 400 (Bad Request) when an Ajax request doesn't provide the base url.
*
* https://issues.apache.org/jira/browse/WICKET-4841
*/
@Test
void getClientUrlAjaxWithoutBaseUrl()
{
MockHttpServletRequest httpRequest = new MockHttpServletRequest(null, null, null);
httpRequest.setHeader(ServletWebRequest.HEADER_AJAX, "true");
ServletWebRequest webRequest = new ServletWebRequest(httpRequest, "");
try
{
webRequest.getClientUrl();
fail("Should not be possible to get the request client url in Ajax request without base url");
}
catch (AbortWithHttpErrorCodeException awhex)
{
assertEquals(HttpServletResponse.SC_BAD_REQUEST, awhex.getErrorCode());
}
}
/**
* Tests that {@link ServletWebRequest#getClientUrl()} returns the current url + the query
* string when this is not forward dispatched request. When the request is error dispatched it
* returns just the request uri to the error page without the query string
*/
@Test
void wicket5203()
{
String filterPath = "filterPath";
MockHttpServletRequest httpRequest = new MockHttpServletRequest(null, null, null);
httpRequest.setURL(httpRequest.getContextPath() + '/' + filterPath + "/request/Path");
httpRequest.setParameter("some", "parameter");
ServletWebRequest webRequest = new ServletWebRequest(httpRequest, filterPath);
Url clientUrl = webRequest.getClientUrl();
assertEquals("request/Path?some=parameter", clientUrl.toString());
// simulates a request that has errors metadata
httpRequest.setAttribute("jakarta.servlet.error.request_uri", httpRequest.getContextPath()
+ '/' + filterPath + "/any/source/of/error");
ServletWebRequest errorWebRequest = new ServletWebRequest(httpRequest, filterPath);
Url errorClientUrl = errorWebRequest.getClientUrl();
assertEquals("any/source/of/error", errorClientUrl.toString());
}
/**
* WICKET-5287
*/
@Test
void parseUrlWhichLooksLikeFullInItsContextRelativePart()
{
String filterPath = "filterPath";
MockHttpServletRequest httpRequest = new MockHttpServletRequest(null, null, null);
String looksLikeFullUrl = "/foo://:/";
httpRequest.setURL("http://localhost" + '/' + httpRequest.getContextPath() + '/'
+ filterPath + looksLikeFullUrl);
ServletWebRequest webRequest = new ServletWebRequest(httpRequest, filterPath);
assertEquals(looksLikeFullUrl, webRequest.getClientUrl().toString());
}
private static class CustomRequestPage extends WebPage implements IMarkupResourceStreamProvider
{
private static final long serialVersionUID = 1L;
private CustomRequestPage()
{
assertThat(getRequest()).isInstanceOf(CustomServletWebRequest.class);
}
@Override
public IResourceStream getMarkupResourceStream(MarkupContainer container,
Class<?> containerClass)
{
return new StringResourceStream("<html></html>");
}
}
private static class CustomServletWebRequest extends ServletWebRequest
{
CustomServletWebRequest(HttpServletRequest httpServletRequest, String filterPrefix)
{
super(httpServletRequest, filterPrefix);
}
}
}