From d0251d9b10643a96e36ee028c9a65e14c356f99c Mon Sep 17 00:00:00 2001 From: Anshum Gupta Date: Fri, 15 May 2015 05:50:54 +0000 Subject: [PATCH] SOLR-7547: Short circuit SolrDispatchFilter for static content request. Right now it creates a new HttpSolrCall object and tries to process it. git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1679493 13f79535-47bb-0310-9956-ffa450edef68 --- solr/CHANGES.txt | 3 ++ .../org/apache/solr/servlet/HttpSolrCall.java | 8 +---- .../solr/servlet/SolrDispatchFilter.java | 33 ++++++++++++++++--- solr/webapp/web/WEB-INF/web.xml | 26 ++++----------- 4 files changed, 39 insertions(+), 31 deletions(-) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index c0ee6ec1e0a..4040a0704e6 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -270,6 +270,9 @@ Optimizations * SOLR-7324: IndexFetcher does not need to call isIndexStale if full copy is already needed (Stephan Lagraulet via Varun Thacker) +* SOLR-7547: Short circuit SolrDisptachFilter for static content request. Right now it creates + a new HttpSolrCall object and tries to process it. (Anshum Gupta) + Other Changes ---------------------- diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java index 022dd55f014..00e6b102f34 100644 --- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java +++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java @@ -400,13 +400,7 @@ public class HttpSolrCall { 1. Authorization is enabled, and 2. The requested resource is not a known static file */ - // TODO: There should be a better way to ignore the static files. - if (cores.getAuthorizationPlugin() != null && - !(req.getRequestURI().endsWith(".html") - || req.getRequestURI().endsWith(".png") - || req.getRequestURI().endsWith(".ico") - || req.getRequestURI().endsWith(".css") - )) { + if (cores.getAuthorizationPlugin() != null) { AuthorizationContext context = getAuthCtx(); log.info(context.toString()); AuthorizationResponse authResponse = cores.getAuthorizationPlugin().authorize(context); diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java index 03b3b191357..9aeea9667bc 100644 --- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java +++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java @@ -17,10 +17,6 @@ package org.apache.solr.servlet; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.util.Properties; - import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; @@ -28,6 +24,12 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; @@ -57,6 +59,7 @@ public class SolrDispatchFilter extends BaseSolrFilter { protected String abortErrorMessage = null; protected final CloseableHttpClient httpClient = HttpClientUtil.createClient(new ModifiableSolrParams()); + private ArrayList excludePatterns; /** * Enum to define action that needs to be processed. @@ -81,7 +84,14 @@ public class SolrDispatchFilter extends BaseSolrFilter { public void init(FilterConfig config) throws ServletException { log.info("SolrDispatchFilter.init()" + this.getClass().getClassLoader()); - + String exclude = config.getInitParameter("excludePatterns"); + if(exclude != null) { + String[] excludeArray = exclude.split(","); + excludePatterns = new ArrayList(); + for (String element : excludeArray) { + excludePatterns.add(Pattern.compile(element)); + } + } try { Properties extraProperties = (Properties) config.getServletContext().getAttribute(PROPERTIES_ATTRIBUTE); if (extraProperties == null) @@ -170,6 +180,19 @@ public class SolrDispatchFilter extends BaseSolrFilter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain, boolean retry) throws IOException, ServletException { if (!(request instanceof HttpServletRequest)) return; + + // No need to even create the HttpSolrCall object if this path is excluded. + if(excludePatterns != null) { + String servletPath = ((HttpServletRequest) request).getServletPath().toString(); + for (Pattern p : excludePatterns) { + Matcher matcher = p.matcher(servletPath); + if (matcher.lookingAt()) { + chain.doFilter(request, response); + return; + } + } + } + HttpSolrCall call = new HttpSolrCall(this, cores, (HttpServletRequest) request, (HttpServletResponse) response, retry); try { Action result = call.call(); diff --git a/solr/webapp/web/WEB-INF/web.xml b/solr/webapp/web/WEB-INF/web.xml index 841aed3bbac..0a11fff8f0e 100644 --- a/solr/webapp/web/WEB-INF/web.xml +++ b/solr/webapp/web/WEB-INF/web.xml @@ -49,27 +49,15 @@ SolrRequestFilter org.apache.solr.servlet.SolrDispatchFilter - + + excludePatterns + /css/*,/js/*,/img/*,/tpl/* +