RequestFactory.java

/* 
 * 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.esigate.servlet.impl;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.http.ProtocolVersion;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.message.BasicLineParser;
import org.apache.http.message.BasicRequestLine;
import org.esigate.http.IncomingRequest;
import org.esigate.servlet.HttpServletRequestContext;
import org.esigate.util.UriUtils;

/**
 * Converts the {@link HttpServletRequest} to an {@link IncomingRequest}.
 * 
 * @author Francois-Xavier Bonnet
 * 
 */
public class RequestFactory {
    private final ServletContext servletContext;

    public RequestFactory(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    public IncomingRequest create(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws IOException {
        HttpServletRequestContext context =
                new HttpServletRequestContext(request, response, servletContext, filterChain);
        // create request line
        String uri =
                UriUtils.createURI(request.getScheme(), request.getServerName(), request.getServerPort(),
                        request.getRequestURI(), request.getQueryString(), null);
        ProtocolVersion protocolVersion = BasicLineParser.parseProtocolVersion(request.getProtocol(), null);
        IncomingRequest.Builder builder =
                IncomingRequest.builder(new BasicRequestLine(request.getMethod(), uri, protocolVersion));
        builder.setContext(context);
        // copy headers
        @SuppressWarnings("rawtypes")
        Enumeration names = request.getHeaderNames();
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            @SuppressWarnings("rawtypes")
            Enumeration values = request.getHeaders(name);
            while (values.hasMoreElements()) {
                String value = (String) values.nextElement();
                builder.addHeader(name, value);
            }
        }
        // create entity
        HttpServletRequestEntity entity = new HttpServletRequestEntity(request);
        builder.setEntity(entity);

        builder.setRemoteAddr(request.getRemoteAddr());
        builder.setRemoteUser(request.getRemoteUser());
        HttpSession session = request.getSession(false);
        if (session != null) {
            builder.setSessionId(session.getId());
        }
        builder.setUserPrincipal(request.getUserPrincipal());

        // Copy cookies
        // As cookie header contains only name=value so we don't need to copy
        // all attributes!
        javax.servlet.http.Cookie[] src = request.getCookies();
        if (src != null) {
            for (Cookie c : src) {
                BasicClientCookie dest = new BasicClientCookie(c.getName(), c.getValue());
                builder.addCookie(dest);
            }
        }
        builder.setSession(new HttpServletSession(request));
        builder.setContextPath(request.getContextPath());
        return builder.build();
    }
}