package org.atricore.idbus.kernel.main.mediation.camel.component.http; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.atricore.idbus.kernel.main.util.ConfigurationContext; import org.springframework.beans.factory.InitializingBean; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; /** * @author <a href=mailto:sgonzalez@atricore.org>Sebastian Gonzalez Oyuela</a> */ public class DefaultInternalProcessingPolicy implements InternalProcessingPolicy, InitializingBean { private static final Log logger = LogFactory.getLog(DefaultInternalProcessingPolicy .class); private ConfigurationContext kernelConfig; private List<String> excludedUrls = new ArrayList<String>(); private List<String> includedUrls = new ArrayList<String>(); public void afterPropertiesSet() throws Exception { String excludedUrlsCsv = kernelConfig.getProperty("binding.http.followRedirects.excludeUrls"); if (excludedUrlsCsv != null) { StringTokenizer st = new StringTokenizer(excludedUrlsCsv, ","); while (st.hasMoreTokens()) { String url = st.nextToken().trim(); logger.info("Not following redirects for ["+url+"]"); excludedUrls.add(url); } } String includedUrlsCsv = kernelConfig.getProperty("binding.http.followRedirects.includeUrls"); if (includedUrlsCsv != null) { StringTokenizer st = new StringTokenizer(includedUrlsCsv, ","); while (st.hasMoreTokens()) { String url = st.nextToken().trim(); logger.info("Not following redirects for ["+url+"]"); includedUrls.add(url); } } } public boolean match(HttpServletRequest originalReq, String redirectUrl) { if (logger.isTraceEnabled()) logger.trace("Matching URL [" + redirectUrl+ "]"); // Force includes/excludes for (String includedUrl : includedUrls) { if (redirectUrl.length() >= includedUrl.length()) { String prefix = redirectUrl.substring(0, includedUrl.length()); if (prefix.equals(includedUrl)) { if (logger.isTraceEnabled()) logger.trace("Following, Matching URL to [" + includedUrl + "]"); return true; } } } for (String excludedUrl : excludedUrls) { if (redirectUrl.length() >= excludedUrl.length()) { String prefix = redirectUrl.substring(0, excludedUrl.length()); if (prefix.equals(excludedUrl)) { if (logger.isTraceEnabled()) logger.trace("Not Following, Matching URL to ["+excludedUrl+"]"); return false; } } } // See if we're redirected to the same host we started processing StringBuffer originalUrl = originalReq.getRequestURL(); String ctxPath = originalReq.getContextPath(); if (ctxPath.equals("")) { // TODO : Root context needs special treatment. throw new RuntimeException("Cannot work with mediation on root context !"); } // This should give us the position of the "/" after the context int ctxEnd = originalUrl.indexOf(ctxPath) + ctxPath.length() + 1; // The URL we're going to is shorter that the original + the context path if (ctxEnd > redirectUrl.length()) { return false; } String originalBase = originalUrl.substring(0, ctxEnd); String redirectBase = redirectUrl.substring(0, ctxEnd); return originalBase.equals(redirectBase); } public boolean match(HttpServletRequest req) { // Already internal, ignore it. if (req.getHeader(IDBusHttpConstants.HTTP_HEADER_IDBUS_PROXIED_REQUEST) != null) return false; // Do not proxy POST methods if (!req.getMethod().equals("GET")) return false; // Do not proxy SOAP requests if (req.getPathInfo().contains("/SOAP")) return false; StringBuffer reqUrl = req.getRequestURL(); String requestUrl = reqUrl.toString(); // Force includes/excludes for (String includedUrl : includedUrls) { if (requestUrl.length() >= includedUrl.length()) { String prefix = requestUrl.substring(0, includedUrl.length()); if (prefix.equals(includedUrl)) { if (logger.isTraceEnabled()) logger.trace("Following, Matching URL to [" + includedUrl + "]"); return true; } } } for (String excludedUrl : excludedUrls) { if (requestUrl.length() >= excludedUrl.length()) { String prefix = requestUrl.substring(0, excludedUrl.length()); if (prefix.equals(excludedUrl)) { if (logger.isTraceEnabled()) logger.trace("Not Following, Matching URL to ["+excludedUrl+"]"); return false; } } } return true; } public List<String> getExcludedUrls() { return excludedUrls; } public void setExcludedUrls(List<String> excludedUrls) { this.excludedUrls = excludedUrls; } public List<String> getIncludedUrls() { return includedUrls; } public void setIncludedUrls(List<String> includedUrls) { this.includedUrls = includedUrls; } public ConfigurationContext getKernelConfig() { return kernelConfig; } public void setKernelConfig(ConfigurationContext kernelConfig) { this.kernelConfig = kernelConfig; } }