org.yestech.lib.web.RequestUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.yestech.lib.web.RequestUtils.java

Source

/*
 * Copyright LGPL3
 * YES Technology Association
 * http://yestech.org
 *
 * http://www.opensource.org/licenses/lgpl-3.0.html
 */

/*
 *
 * Author:  Artie Copeland
 * Last Modified Date: $DateTime: $
 */
package org.yestech.lib.web;

import static org.yestech.lib.util.LoggingUtils.logRequestHeaders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.lang.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

/**
 * A collection of request processing utilities
 *
 * @author Artie Copeland
 * @version $Revision: $
 */
final public class RequestUtils {
    final private static Logger logger = LoggerFactory.getLogger(RequestUtils.class);

    private RequestUtils() {
    }

    /**
     * Checks if the request uri is an include.
     * These cannot be gzipped.
     */
    public static boolean isIncluded(final HttpServletRequest request) {
        final String uri = (String) request.getAttribute("javax.servlet.include.request_uri");
        final boolean includeRequest = !(uri == null);

        if (includeRequest && logger.isDebugEnabled()) {
            logger.debug(request.getRequestURL() + " resulted in an include request. This is unusable, because"
                    + "the response will be assembled into the overrall response. Not gzipping.");
        }
        return includeRequest;
    }

    /**
     * Determine whether the user agent accepts GZIP encoding. This feature is part of HTTP1.1.
     * If a browser accepts GZIP encoding it will advertise this by including in its HTTP header:
     * <p/>
     * <code>
     * Accept-Encoding: gzip
     * </code>
     * <p/>
     * Requests which do not accept GZIP encoding fall into the following categories:
     * <ul>
     * <li>Old browsers, notably IE 5 on Macintosh.
     * <li>Internet Explorer through a proxy. By default HTTP1.1 is enabled but disabled when going
     * through a proxy. 90% of non gzip requests seen on the Internet are caused by this.
     * </ul>
     * As of September 2004, about 34% of Internet requests do not accept GZIP encoding.
     *
     * @param request
     * @return true, if the User Agent request accepts GZIP encoding
     */
    public static boolean acceptsGzipEncoding(HttpServletRequest request) {
        return acceptsEncoding(request, "gzip");
    }

    /**
     * Checks if request accepts the named encoding.
     */
    public static boolean acceptsEncoding(final HttpServletRequest request, final String name) {
        final boolean accepts = headerContains(request, "Accept-Encoding", name);
        return accepts;
    }

    /**
     * Checks if request contains the header value.
     *
     * @return true if header acc
     */
    public static boolean headerContains(final HttpServletRequest request, final String header,
            final String value) {

        logRequestHeaders(logger, request);

        final Enumeration accepted = request.getHeaders(header);
        while (accepted.hasMoreElements()) {
            final String headerValue = (String) accepted.nextElement();
            if (headerValue.indexOf(value) != -1) {
                return true;
            }
        }
        return false;
    }

    /**
     * Trys to resolve an clients ip address first by last item in "X-Forwarded-For" HTTP header.
     * If that fails then use {@link javax.servlet.http.HttpServletRequest#getRemoteAddr()}.
     *  
     * @param request HttpRequest
     * @return Ip Address
     */
    public static String resolveUserIpAddress(HttpServletRequest request) {
        String endUserIp = request.getHeader("X-Forwarded-For");
        String[] ips = StringUtils.split(endUserIp, ",");
        if (ips != null && ips.length > 0) {
            endUserIp = ips[ips.length - 1];
        } else {
            endUserIp = request.getRemoteAddr();
        }
        return endUserIp.trim();
    }
}