/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.web.portal.page;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import com.enonic.cms.api.plugin.ext.http.HttpResponseFilter;
/**
* forces HTML5 for doctypeHandler = "html5forcer"
* <p/>
* removes about:legacy-compat and other XSLT things from doctype for doctypeHandler = "html5fixer"
* <p/>
* does nothing in other cases
*/
public final class HTML5HttpResponseFilter
extends HttpResponseFilter
{
private static final Pattern DOCTYPE =
Pattern.compile( "^(\\s*)(<!DOCTYPE .*?>)(.*)$", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL );
private static final String DOCTYPE_HTML = "<!DOCTYPE html>";
private final String doctypeHandler;
public HTML5HttpResponseFilter( final String doctypeHandler )
{
this.doctypeHandler = doctypeHandler;
}
@Override
public String filterResponse( final HttpServletRequest request, final String response, final String contentType )
throws Exception
{
if ( "none".equals( doctypeHandler ) || StringUtils.isEmpty( doctypeHandler ) )
{
return response;
}
// handle only text/html
if ( contentType == null || !contentType.startsWith( "text/html" ) )
{
return response;
}
final Matcher matcher = DOCTYPE.matcher( response );
if ( matcher.find() )
{
final String doctype = matcher.group( 2 );
if ( "html5fixer".equals( doctypeHandler ) && doctype.contains( "\"about:legacy-compat\"" ) ||
"html5forcer".equals( doctypeHandler ) && !doctype.toLowerCase().contains( "frameset" ) )
{
return DOCTYPE_HTML + matcher.group( 3 );
}
}
return response;
}
}