blob: e28ca9d0a3393dab8076071f392fd3497a346e85 [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.request.http;
import java.nio.charset.Charset;
import java.time.Instant;
import java.util.List;
import java.util.Locale;
import jakarta.servlet.http.Cookie;
import org.apache.wicket.request.IRequestParameters;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Url;
import org.apache.wicket.util.string.StringValueConversionException;
import org.apache.wicket.util.string.Strings;
/**
* Base class for request that provides additional web-related information.
*
* @author Matej Knopp
* @author Igor Vaynberg
*/
public abstract class WebRequest extends Request
{
/** marker for Ajax requests */
public static final String PARAM_AJAX = "wicket-ajax";
/** marker for Ajax requests */
public static final String HEADER_AJAX = "Wicket-Ajax";
/** marker for Ajax-relative url */
public static final String PARAM_AJAX_BASE_URL = "wicket-ajax-baseurl";
/** marker for Ajax-relative url */
public static final String HEADER_AJAX_BASE_URL = "Wicket-Ajax-BaseURL";
/** anti-cache query parameter added by Wicket.Ajax.Request at its URL */
public static final String PARAM_AJAX_REQUEST_ANTI_CACHE = "_";
/** {@code Origin} http header */
public static final String HEADER_ORIGIN = "Origin";
/** {@code Referer} http header */
public static final String HEADER_REFERER = "Referer";
private Boolean isAjax;
/**
* @return request cookies
*/
public abstract List<Cookie> getCookies();
/**
* @param cookieName
* @return cookie with specified name or <code>null</code> if the cookie does not exist
*/
public Cookie getCookie(final String cookieName)
{
for (Cookie cookie : getCookies())
{
if (cookie.getName().equals(cookieName))
{
return cookie;
}
}
return null;
}
/**
* Returns all the values of the specified request header.
*
* @param name
* @return unmodifiable list of header values
*/
public abstract List<String> getHeaders(String name);
/**
* Returns the value of the specified request header as a <code>String</code>
*
* @param name
* @return string value of request header
*/
public abstract String getHeader(String name);
/**
* Returns the value of the specified request header as a <code>long</code> value that
* represents a <code>Date</code> object. Use this method with headers that contain dates, such
* as <code>If-Modified-Since</code>.
*
* @param name
* @return date value of request header or <code>null</code> if not found
*/
public abstract Instant getDateHeader(String name);
/**
* Convenience method for retrieving If-Modified-Since header.
*
* @return date representing the header or <code>null</code> if not set
*/
public final Instant getIfModifiedSinceHeader()
{
return getDateHeader("If-Modified-Since");
}
/**
* Returns whether this request is an Ajax request. This implementation checks for values of
* {@value #PARAM_AJAX} url parameter or the {@value #HEADER_AJAX} header. Subclasses can use
* other approaches.
*
* @return <code>true</code> if this request is an ajax request, <code>false</code> otherwise.
*/
public boolean isAjax()
{
if (isAjax == null)
{
try {
isAjax = Strings.isTrue(getHeader(HEADER_AJAX)) ||
Strings.isTrue(getQueryParameters().getParameterValue(PARAM_AJAX).toString());
} catch (StringValueConversionException invalidValue) {
isAjax = false;
}
}
return isAjax;
}
/**
* Signals whether or not request processing should preserve the current client url - in other
* words, handle this request without redirecting. By default, this method returns {@code false}
* .
*
* For example, this method can be used to preserve the url that caused a 404 in the browser if
* Wicket is also responsible for rendering the 404 page. If this method returns the default
* value of {@code false} then Wicket will redirect to the bookmarkable url of the error page,
* instead of preserving the url that caused the 404 in the browser.
*
* @return {@code true} if current client url should be preserved
*/
public boolean shouldPreserveClientUrl()
{
return false;
}
/**
* Returns request with specified URL and same POST parameters as this request.
*
* @param url
* Url instance
* @return request with specified URL.
*/
@Override
public WebRequest cloneWithUrl(final Url url)
{
return new WebRequest()
{
@Override
public Url getUrl()
{
return url;
}
@Override
public Url getOriginalUrl()
{
return WebRequest.this.getOriginalUrl();
}
@Override
public IRequestParameters getPostParameters()
{
return WebRequest.this.getPostParameters();
}
@Override
public List<Cookie> getCookies()
{
return WebRequest.this.getCookies();
}
@Override
public Instant getDateHeader(final String name)
{
return WebRequest.this.getDateHeader(name);
}
@Override
public Locale getLocale()
{
return WebRequest.this.getLocale();
}
@Override
public String getHeader(final String name)
{
return WebRequest.this.getHeader(name);
}
@Override
public List<String> getHeaders(final String name)
{
return WebRequest.this.getHeaders(name);
}
@Override
public Charset getCharset()
{
return WebRequest.this.getCharset();
}
@Override
public Url getClientUrl()
{
return WebRequest.this.getClientUrl();
}
@Override
public Object getContainerRequest()
{
return WebRequest.this.getContainerRequest();
}
@Override
public boolean shouldPreserveClientUrl()
{
return WebRequest.this.shouldPreserveClientUrl();
}
};
}
}