You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2005/07/04 22:41:04 UTC

cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/valves RequestFilterValve.java

markt       2005/07/04 13:41:03

  Modified:    catalina/src/share/org/apache/catalina/valves
                        RequestFilterValve.java
  Log:
  Fix bug 25835. Use a local RE object configured via shared REProgram objects to prevent
   synchronisation problems with RE objects as they are not thread safe. There is a
   very slight performance hit when not under load and an equally slight improvement
   when under load.
  
  Revision  Changes    Path
  1.8       +27 -17    jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/valves/RequestFilterValve.java
  
  Index: RequestFilterValve.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/valves/RequestFilterValve.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- RequestFilterValve.java	27 Mar 2005 20:18:01 -0000	1.7
  +++ RequestFilterValve.java	4 Jul 2005 20:41:03 -0000	1.8
  @@ -23,7 +23,9 @@
   import javax.servlet.ServletException;
   import javax.servlet.ServletResponse;
   import javax.servlet.http.HttpServletResponse;
  +
   import org.apache.regexp.RE;
  +import org.apache.regexp.REProgram;
   import org.apache.regexp.RESyntaxException;
   import org.apache.catalina.Request;
   import org.apache.catalina.Response;
  @@ -79,15 +81,17 @@
   
   
       /**
  -     * The set of <code>allow</code> regular expressions we will evaluate.
  +     * The set of <code>allow</code> pre-compiled regular expressions we will
  +     * evaluate.
        */
  -    protected RE allows[] = new RE[0];
  +    protected REProgram allows[] = new REProgram[0];
   
   
       /**
  -     * The set of <code>deny</code> regular expressions we will evaluate.
  +     * The set of <code>deny</code> pre-compiled regular expressions we will
  +     * evaluate.
        */
  -    protected RE denies[] = new RE[0];
  +    protected REProgram denies[] = new REProgram[0];
   
   
       /**
  @@ -199,32 +203,32 @@
   
   
       /**
  -     * Return an array of regular expression objects initialized from the
  -     * specified argument, which must be <code>null</code> or a comma-delimited
  -     * list of regular expression patterns.
  +     * Return an array of pre-compiled regular expression objects initialized
  +     * from the specified argument, which must be <code>null</code> or a
  +     * comma-delimited list of regular expression patterns.
        *
        * @param list The comma-separated list of patterns
        *
        * @exception IllegalArgumentException if one of the patterns has
        *  invalid syntax
        */
  -    protected RE[] precalculate(String list) {
  +    protected REProgram[] precalculate(String list) {
   
           if (list == null)
  -            return (new RE[0]);
  +            return (new REProgram[0]);
           list = list.trim();
           if (list.length() < 1)
  -            return (new RE[0]);
  +            return (new REProgram[0]);
           list += ",";
   
  -        ArrayList reList = new ArrayList();
  +        ArrayList reProgramList = new ArrayList();
           while (list.length() > 0) {
               int comma = list.indexOf(',');
               if (comma < 0)
                   break;
               String pattern = list.substring(0, comma).trim();
               try {
  -                reList.add(new RE(pattern));
  +                reProgramList.add(new RE(pattern).getProgram());
               } catch (RESyntaxException e) {
                   throw new IllegalArgumentException
                       (sm.getString("requestFilterValve.syntax", pattern));
  @@ -232,8 +236,8 @@
               list = list.substring(comma + 1);
           }
   
  -        RE reArray[] = new RE[reList.size()];
  -        return ((RE[]) reList.toArray(reArray));
  +        REProgram reProgramArray[] = new REProgram[reProgramList.size()];
  +        return ((REProgram[]) reProgramList.toArray(reProgramArray));
   
       }
   
  @@ -268,9 +272,14 @@
               return;
           }
   
  +        
  +        // Create local RE since RE is not thread safe
  +        RE re = new RE();
  +        
           // Check the deny patterns, if any
           for (int i = 0; i < denies.length; i++) {
  -            if (denies[i].match(property)) {
  +            re.setProgram(denies[i]);
  +            if (re.match(property)) {
                   ServletResponse sres = response.getResponse();
                   if (sres instanceof HttpServletResponse) {
                       HttpServletResponse hres = (HttpServletResponse) sres;
  @@ -282,7 +291,8 @@
   
           // Check the allow patterns, if any
           for (int i = 0; i < allows.length; i++) {
  -            if (allows[i].match(property)) {
  +            re.setProgram(allows[i]);
  +            if (re.match(property)) {
                   context.invokeNext(request, response);
                   return;
               }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org