    001// Licensed under the Apache License, Version 2.0 (the "License");
    002// you may not use this file except in compliance with the License.
    003// You may obtain a copy of the License at
    004//
    005// http://www.apache.org/licenses/LICENSE-2.0
    006//
    007// Unless required by applicable law or agreed to in writing, software
    008// distributed under the License is distributed on an "AS IS" BASIS,
    009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    010// See the License for the specific language governing permissions and
    011// limitations under the License.
    012
    013package org.apache.tapestry5.http.services;
    014
    015import java.util.List;
    016import java.util.Locale;
    017
    018/**
    019 * Generic version of {@link javax.servlet.http.HttpServletRequest}, used to encapsulate the Servlet API version, and to
    020 * help bridge the differences between Servlet API and Porlet API.
    021 *
    022 * The Request service is a {@linkplain org.apache.tapestry5.ioc.services.PropertyShadowBuilder shadow} of the current
    023 * thread's request.
    024 */
    025public interface Request
    026{
    027    public String REQUESTED_WITH_HEADER = "X-Requested-With";
    028    public String X_FORWARDED_PROTO_HEADER = "X-Forwarded-Proto";
    029
    030    /**
    031     * Gets the {@link Session}. If create is false and the session has not be created previously, returns null. Also,
    032     * if the session is invalidated and create is false, returns null. Invoking this method with true, when the session exists but has
    033     * been invalidated, will force the creation of a new session.
    034     *
    035     * @param create
    036     *         true to force the creation of the session
    037     * @return the session (or null if create is false the session has not been previously created)
    038     */
    039    Session getSession(boolean create);
    040
    041    /**
    042     * Returns the context path. This always starts with a "/" character and does not end with one, with the exception
    043     * of servlets in the root context, which return the empty string.
    044     *
    045     * @deprecated in 5.4, inject the value for symbol {@link org.apache.tapestry5.SymbolConstants#CONTEXT_PATH} instead
    046     */
    047    String getContextPath();
    048
    049    /**
    050     * Returns a list of query parameter names, in alphabetical order.
    051     */
    052    List<String> getParameterNames();
    053
    054    /**
    055     * Returns the query parameter value for the given name. Returns null if no such parameter is in the request. For a
    056     * multi-valued parameter, returns just the first value.
    057     */
    058    String getParameter(String name);
    059
    060    /**
    061     * Returns the parameter values for the given name. Returns null if no such parameter is in the request.
    062     */
    063    String[] getParameters(String name);
    064
    065    /**
    066     * Returns the path portion of the request, which starts with a "/" and contains everything up to the start of the
    067     * query parameters. It doesn't include the context path.
    068     */
    069    String getPath();
    070
    071    /**
    072     * Returns the locale of the client as determined from the request headers.
    073     */
    074    Locale getLocale();
    075
    076    /**
    077     * Returns the names of all headers in the request.
    078     */
    079    List<String> getHeaderNames();
    080
    081    /**
    082     * Returns the value of the specified request header as a <code>long</code> value that represents a
    083     * <code>Date</code> object. Use this method with headers that contain dates, such as <code>If-Modified-Since</code>
    084     * .
    085     *
    086     * The date is returned as the number of milliseconds since January 1, 1970 GMT. The header name is case
    087     * insensitive.
    088     *
    089     * If the request did not have a header of the specified name, this method returns -1. If the header can't be
    090     * converted to a date, the method throws an <code>IllegalArgumentException</code>.
    091     *
    092     * @param name
    093     *         a <code>String</code> specifying the name of the header
    094     * @return a <code>long</code> value representing the date specified in the header expressed as the number of
    095     *         milliseconds since January 1, 1970 GMT, or -1 if the named header was not included with the reqest
    096     * @throws IllegalArgumentException
    097     *         If the header value can't be converted to a date
    098     */
    099    long getDateHeader(String name);
    100
    101    /**
    102     * Returns the named header as a string, or null if not found.
    103     */
    104    String getHeader(String name);
    105
    106    /**
    107     * Returns true if the request originated on the client using XmlHttpRequest (the core of any Ajax behavior). Ajax
    108     * action requests may behave quite differently than ordinary, page-based requests. This implementation currently
    109     * depends on the client side setting a header: <strong>X-Requested-With=XMLHttpRequest</strong> (this is what
    110     * Prototype does).
    111     *
    112     * @return true if the request has an XmlHttpRequest origin
    113     */
    114    boolean isXHR();
    115
    116    /**
    117     * Returns a boolean indicating whether this request was made using a secure channel, such as HTTPS.
    118     *
    119     * @return a boolean indicating if the request was made using a secure channel
    120     */
    121    public boolean isSecure();
    122
    123    /**
    124     * Returns the host name of the server to which the request was sent. It is the value of the part before ":" in the
    125     * <code>Host</code> header, if any, or the resolved server name, or the server IP address.
    126     *
    127     * @return the name of the server
    128     */
    129    public String getServerName();
    130
    131    /**
    132     * Checks whether the requested session ID is still valid.
    133     *
    134     * @return true if the request included a session id that is still active, false if the included session id has
    135     *         expired
    136     */
    137    boolean isRequestedSessionIdValid();
    138
    139    /**
    140     * Returns the value of the named attribute as an <code>Object</code>, or <code>null</code> if no attribute of the
    141     * given name exists. Because this method is a wrapper around
    142     * {@link javax.servlet.ServletRequest#getAttribute(String)},
    143     * it is case <em>sensitive</em> (unlike most of Tapestry).
    144     *
    145     * @param name
    146     *         a <code>String</code> specifying the name of the attribute
    147     * @return an <code>Object</code> containing the value of the attribute, or <code>null</code> if the attribute does
    148     *         not exist
    149     */
    150    Object getAttribute(String name);
    151
    152    /**
    153     * Returns a sorted list of attribute names.
    154     *
    155     * @since 5.4
    156     */
    157    List<String> getAttributeNames();
    158
    159
    160    /**
    161     * Stores an attribute in this request. Attributes are reset between requests (and remember that in Tapestry, there
    162     * is usually two requests per operation: the action request that redirects to a render request).
    163     *
    164     * @param name
    165     *         a <code>String</code> specifying the name of the attribute
    166     * @param value
    167     *         the <code>Object</code> to be stored, or null to remove the attribute
    168     */
    169    void setAttribute(String name, Object value);
    170
    171    /**
    172     * Returns the name of the HTTP method with which this request was made, for example, GET, POST, or PUT.
    173     *
    174     * @return a string specifying the name of the method with which this request was made
    175     */
    176    String getMethod();
    177
    178    /**
    179     * Returns the Internet Protocol (IP) port number of the interface
    180     * on which the request was received.
    181     *
    182     * @return an integer specifying the port number
    183     * @since 5.2.0
    184     */
    185    int getLocalPort();
    186
    187    /**
    188     * Returns the port number to which the request was sent.
    189     * It is the value of the part after ":" in the <code>Host</code> header, if any, or the server port where the
    190     * client connection
    191     * was accepted on.
    192     *
    193     * @return an integer specifying the port number
    194     * @since 5.2.5
    195     */
    196    int getServerPort();
    197
    198    /**
    199     * Returns the fully qualified name of the client
    200     * or the last proxy that sent the request.
    201     * If the engine cannot or chooses not to resolve the hostname
    202     * (to improve performance), this method returns the dotted-string form of
    203     * the IP address.
    204     *
    205     * @return a <code>String</code> containing the fully
    206     *         qualified name of the client
    207     * @since 5.3
    208     */
    209    String getRemoteHost();
    210
    211    /**
    212     * Returns true if the request specified a session, and that session has been invalidated.
    213     *
    214     * @return true if session was invalidated during this request
    215     * @since 5.4
    216     */
    217    boolean isSessionInvalidated();
    218}