/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.web.portal.services;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import com.enonic.esl.containers.MultiValueMap;
import com.enonic.esl.net.URL;
import com.enonic.cms.core.Attribute;
import com.enonic.cms.core.portal.httpservices.HttpServicesException;
import com.enonic.cms.core.portal.httpservices.IllegalRedirectException;
import com.enonic.cms.core.structure.SitePath;
@Component
public class UserServicesRedirectUrlResolver
{
public String resolveRedirectUrlToPage( HttpServletRequest request, String redirect, MultiValueMap queryParams )
{
if ( redirect == null || redirect.length() == 0 )
{
String referer = request.getHeader( "referer" );
if ( referer != null && !referer.equals( "" ) )
{
return appendParams( referer, queryParams );
}
return appendParams( "/", queryParams );
}
if ( redirect.contains( "://" ) )
{
return appendParams( redirect, queryParams );
}
if ( redirect.startsWith( "/" ) )
{
return appendParams( redirect, queryParams );
}
StringBuilder errorMessage = new StringBuilder();
errorMessage.append( "Requested redirect Url: " );
errorMessage.append( redirect );
String referer = request.getHeader( "referer" );
if ( referer != null && !referer.equals( "" ) )
{
errorMessage.append( " - Referer: " );
errorMessage.append( appendParams( referer, queryParams ) );
}
throw new IllegalRedirectException( errorMessage.toString() );
}
public String resolveRedirectUrlToErrorPage( HttpServletRequest request, Integer[] codes, ServicesProcessor errorSource )
{
// Check for a fatal exception
for ( int code : codes )
{
if ( code >= 500 )
{
throw new HttpServicesException( code );
}
}
SitePath originalSitePath = (SitePath) request.getAttribute( Attribute.ORIGINAL_SITEPATH );
String handler = UserServicesParameterResolver.resolveHandlerFromSitePath( originalSitePath );
String operation = UserServicesParameterResolver.resolveOperationFromSitePath( originalSitePath );
Integer httpResponseCode = errorSource.httpResponseCodeTranslator( codes );
// set error paramater on query string
StringBuilder errorKeyBuilder = new StringBuilder( "error_" );
if ( handler != null && operation != null )
{
errorKeyBuilder.append( handler );
errorKeyBuilder.append( '_' );
errorKeyBuilder.append( operation );
}
else
{
errorKeyBuilder.append( "userservices" );
}
String errorKey = errorKeyBuilder.toString();
String baseUrlString = request.getHeader( "referer" );
if ( baseUrlString == null )
{
throw new HttpServicesException( codes[0] );
}
// remove old error-parameters
URL url = new URL( baseUrlString );
removeErrorParameters( url );
// add query parameters to url
for ( int code : codes )
{
url.addParameter( errorKey, String.valueOf( code ) );
}
url.addParameter( "httpResponseCode", httpResponseCode.toString() );
return url.toString();
}
private void removeErrorParameters( URL url )
{
Iterator paramIterator = url.parameterIterator();
while ( paramIterator.hasNext() )
{
URL.Parameter param = (URL.Parameter) paramIterator.next();
if ( param.getKey().contains( "error" ) )
{
paramIterator.remove();
}
}
}
private String appendParams( String urlString, MultiValueMap queryParams )
{
URL url = new URL( urlString );
if ( queryParams != null && queryParams.size() > 0 )
{
for ( Object key : queryParams.keySet() )
{
for ( Object o : ( queryParams.getValueList( key ) ) )
{
url.addParameter( key.toString(), o.toString() );
}
}
}
return url.toString();
}
}