/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.web.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import com.enonic.cms.core.vhost.VirtualHost;
import com.enonic.cms.core.vhost.VirtualHostHelper;
import com.enonic.cms.core.vhost.VirtualHostResolver;
import com.enonic.cms.web.urlrewrite.UrlRewriterBean;
import com.enonic.cms.web.urlrewrite.UrlRewriterHttpServletRequestWrapper;
@Component
public final class VirtualHostFilter
extends OncePerRequestFilter
{
private final static Logger LOG = LoggerFactory.getLogger( VirtualHostFilter.class );
@Autowired
private VirtualHostResolver virtualHostResolver;
@Autowired
private UrlRewriterBean urlRewriterBean;
@Value("${cms.security.vhost.require}")
private boolean requireVirtualHost;
protected void doFilterInternal( HttpServletRequest req, HttpServletResponse res, FilterChain chain )
throws IOException, ServletException
{
try
{
doFilter( req, res, chain );
}
catch ( IOException e )
{
throw e;
}
catch ( ServletException e )
{
throw e;
}
catch ( Exception e )
{
LOG.error( e.getMessage(), e );
throw new ServletException( e );
}
}
private void doFilter( HttpServletRequest req, HttpServletResponse res, FilterChain chain )
throws Exception
{
String fullTargetPath = null;
VirtualHost virtualHost = this.virtualHostResolver != null ? this.virtualHostResolver.resolve( req ) : null;
if ( virtualHost != null )
{
fullTargetPath = virtualHost.getFullTargetPath( req );
String fullSourcePath = virtualHost.getFullSourcePath( req );
VirtualHostHelper.setBasePath( req, fullSourcePath );
}
else if ( requireVirtualHost )
{
res.setStatus( HttpServletResponse.SC_NOT_FOUND );
return;
}
if ( urlRewriterBean.isEnabled() )
{
UrlRewriterHttpServletRequestWrapper wrappedReq = new UrlRewriterHttpServletRequestWrapper( req, fullTargetPath );
boolean responseCommited = urlRewriterBean.doRewriteURL( wrappedReq, res, chain );
if ( responseCommited )
{
return;
}
}
if ( fullTargetPath != null )
{
RequestDispatcher dispatcher = req.getRequestDispatcher( fullTargetPath );
dispatcher.forward( req, res );
}
else
{
chain.doFilter( req, res );
}
}
}