[jboss-svn-commits] JBL Code SVN: r5533 - labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Aug 7 09:32:14 EDT 2006


Author: remy.maucherat at jboss.com
Date: 2006-08-07 09:32:11 -0400 (Mon, 07 Aug 2006)
New Revision: 5533

Modified:
   labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteCond.java
   labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteRule.java
   labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteValve.java
   labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/TomcatResolver.java
Log:
- Apply portions of the patch for JBWEB-67.
- Fix processing of conditions
- Fix handling of case insensitivity
- Add fancier handling for query string and the QSA feature
- Fix HTTP_HOST variable value.
- Treat comments as comments.
- Submitted by Rob Hughes.

Modified: labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteCond.java
===================================================================
--- labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteCond.java	2006-08-07 12:49:36 UTC (rev 5532)
+++ labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteCond.java	2006-08-07 13:32:11 UTC (rev 5533)
@@ -145,7 +145,7 @@
             PatternCondition condition = new PatternCondition();
             int flags = 0;
             if (isNocase()) {
-                flags &= Pattern.CASE_INSENSITIVE;
+                flags |= Pattern.CASE_INSENSITIVE;
             }
             condition.pattern = Pattern.compile(condPattern, flags);
         }
@@ -232,7 +232,7 @@
                 PatternCondition ncondition = new PatternCondition();
                 int flags = 0;
                 if (isNocase()) {
-                    flags &= Pattern.CASE_INSENSITIVE;
+                    flags |= Pattern.CASE_INSENSITIVE;
                 }
                 ncondition.pattern = Pattern.compile(condPattern, flags);
                 condition = ncondition;

Modified: labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteRule.java
===================================================================
--- labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteRule.java	2006-08-07 12:49:36 UTC (rev 5532)
+++ labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteRule.java	2006-08-07 13:32:11 UTC (rev 5533)
@@ -47,7 +47,7 @@
         // Parse the pattern
         int flags = 0;
         if (isNocase()) {
-            flags &= Pattern.CASE_INSENSITIVE;
+            flags |= Pattern.CASE_INSENSITIVE;
         }
         Pattern.compile(patternString, flags);
         // Parse conditions
@@ -76,19 +76,18 @@
             // Parse the pattern
             int flags = 0;
             if (isNocase()) {
-                flags &= Pattern.CASE_INSENSITIVE;
+                flags |= Pattern.CASE_INSENSITIVE;
             }
             pattern = Pattern.compile(patternString, flags);
             this.pattern.set(pattern);
         }
         Matcher matcher = pattern.matcher(url);
         if (!matcher.matches()) {
-            // FIXME: System.out.println("No match for: " + url + " pattern: " + pattern);
             // Evaluation done
             return null;
         }
         // Evaluate conditions
-        boolean done = true;
+        boolean done = false;
         boolean rewrite = true;
         Matcher lastMatcher = null;
         int pos = 0;

Modified: labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteValve.java
===================================================================
--- labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteValve.java	2006-08-07 12:49:36 UTC (rev 5532)
+++ labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/RewriteValve.java	2006-08-07 13:32:11 UTC (rev 5533)
@@ -53,6 +53,7 @@
 import org.apache.catalina.valves.ValveBase;
 import org.apache.tomcat.util.buf.CharChunk;
 import org.apache.tomcat.util.buf.MessageBytes;
+import org.apache.tomcat.util.net.URL;
 
 public class RewriteValve extends ValveBase
     implements Lifecycle {
@@ -312,8 +313,35 @@
             }
             // - redirect (code)
             if (rules[i].isRedirect() && newtest != null) {
-                // Note: No way to specify the status code here
-                response.sendRedirect(url.toString());
+                // append the query string to the url if there is one and it hasn't been rewritten
+                String queryString = request.getQueryString();
+                StringBuffer urlString = new StringBuffer(url);
+                if (queryString != null && queryString.length() > 0) {
+                    int index = urlString.indexOf("?");
+                    if (index != -1) {
+                        // if qsa is specified append the query
+                        if (rules[i].isQsappend()) {
+                            urlString.append('&');
+                            urlString.append(queryString);
+                        }
+                        // if the ? is the last character delete it, its only purpose was to
+                        // prevent the rewrite module from appending the query string
+                        else if (index == urlString.length() - 1) {
+                            urlString.deleteCharAt(index);
+                        }
+                    } else {
+                        urlString.append('?');
+                        urlString.append(queryString);
+                    }
+                }
+                // Insert the context if
+                // 1. this valve is associated with a context
+                // 2. the url starts with a leading slash
+                // 3. the url isn't absolute
+                if (context && urlString.charAt(0) == '/' && !hasScheme(urlString)) {
+                    urlString.insert(0, request.getContext().getEncodedPath());
+                }
+                response.sendRedirect(urlString.toString());
                 done = true;
                 break;
             }
@@ -336,9 +364,13 @@
                 request.setContentType(rules[i].getTypeValue());
             }
             // - qsappend
-            // FIXME: Append to query string ? In general, some query string handling is 
-            //        apparently needed, which feels weird (in Servlet API land, the query
-            //        string is separate)
+            if (rules[i].isQsappend() && newtest != null) {
+                String queryString = request.getQueryString();
+                String urlString = url.toString();
+                if (urlString.indexOf('?') != -1 && queryString != null) {
+                    url = urlString + "&" + queryString;
+                }
+            }
             
             // Control flow processing
             
@@ -370,14 +402,29 @@
         
         if (rewritten) {
             if (!done) {
+                // See if we need to replace the query string
+                String urlString = url.toString();
+                String queryString = null;
+                int queryIndex = urlString.indexOf('?');
+                if (queryIndex != -1) {
+                    queryString = urlString.substring(queryIndex+1);
+                    urlString = urlString.substring(0, queryIndex);
+                }
                 // Set the new URL
                 CharChunk chunk = request.getCoyoteRequest().requestURI().getCharChunk();
                 chunk.recycle();
                 if (context) {
                     chunk.append(request.getContextPath());
                 }
-                chunk.append(url.toString());
+                chunk.append(urlString);
                 request.getCoyoteRequest().requestURI().toChars();
+                // Set the new Query if there is one
+                if (queryString != null) {
+                    chunk = request.getCoyoteRequest().queryString().getCharChunk();
+                    chunk.recycle();
+                    chunk.append(queryString);
+                    request.getCoyoteRequest().queryString().toChars();
+                }
                 // Set the new host if it changed
                 if (!host.equals(request.getServerName())) {
                     chunk = request.getCoyoteRequest().serverName().getCharChunk();
@@ -385,6 +432,7 @@
                     chunk.append(host.toString());
                     request.getCoyoteRequest().serverName().toChars();
                 }
+                request.getMappingData().recycle();
                 // Reinvoke the whole request recursively
                 try {
                     request.getConnector().getProtocolHandler().getAdapter().service
@@ -517,8 +565,10 @@
                 result[0] = name;
                 result[1] = map;
                 return result;
+            } else if (token.startsWith("#")) {
+                // it's a comment, ignore it
             } else {
-                throw new IllegalArgumentException("Ivalid line: " + line);
+                throw new IllegalArgumentException("Invalid line: " + line);
             }
         }
         return null;
@@ -608,6 +658,7 @@
                 rule.setRedirectCode(Integer.parseInt(flag));
             } else {
                 rule.setRedirect(true);
+                rule.setRedirectCode(HttpServletResponse.SC_FOUND);
             }
         } else if (flag.startsWith("skip") || flag.startsWith("S")) {
             if (flag.startsWith("skip=")) {
@@ -625,8 +676,25 @@
             rule.setType(true);
             rule.setTypeValue(flag);
         } else {
-            throw new IllegalArgumentException("Ivalid flag in: " + line + " flag: " + flag);
+            throw new IllegalArgumentException("Invalid flag in: " + line + " flag: " + flag);
         }
     }
     
+
+    /**
+     * Determine if a URI string has a <code>scheme</code> component.
+     */
+    protected static boolean hasScheme(StringBuffer uri) {
+        int len = uri.length();
+        for(int i=0; i < len ; i++) {
+            char c = uri.charAt(i);
+            if(c == ':') {
+                return i > 0;
+            } else if(!URL.isSchemeChar(c)) {
+                return false;
+            }
+        }
+        return false;
+    }
+
 }

Modified: labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/TomcatResolver.java
===================================================================
--- labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/TomcatResolver.java	2006-08-07 12:49:36 UTC (rev 5532)
+++ labs/jbossweb/trunk/src/share/classes/org/jboss/web/rewrite/TomcatResolver.java	2006-08-07 13:32:11 UTC (rev 5533)
@@ -55,7 +55,11 @@
         } else if (key.equals("HTTP_FORWARDED")) {
             return request.getHeader("forwarded");
         } else if (key.equals("HTTP_HOST")) {
-            return request.getHeader("host");
+            String host = request.getHeader("host");
+            int index = host.indexOf(':');
+            if (index != -1)
+                host = host.substring(0, index);
+            return host;
         } else if (key.equals("HTTP_PROXY_CONNECTION")) {
             return request.getHeader("proxy-connection");
         } else if (key.equals("HTTP_ACCEPT")) {




More information about the jboss-svn-commits mailing list