From: <jbo...@li...> - 2005-10-25 14:51:42
|
Author: rem...@jb... Date: 2005-10-25 10:51:31 -0400 (Tue, 25 Oct 2005) New Revision: 1444 Modified: trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteRule.java trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteTestCase.java trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteValve.java Log: - Simple parsing tests and associated bug fixes. - Handle "-" substitution for a rule. - Implement main rewrite engine, but not tested yet. Modified: trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteRule.java =================================================================== --- trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteRule.java 2005-10-24 19:51:10 UTC (rev 1443) +++ trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteRule.java 2005-10-25 14:51:31 UTC (rev 1444) @@ -16,9 +16,11 @@ public void parse(Map maps) { // Parse the substitution - substitution = new Substitution(); - substitution.setSub(substitutionString); - substitution.parse(maps); + if (!"-".equals(substitutionString)) { + substitution = new Substitution(); + substitution.setSub(substitutionString); + substitution.parse(maps); + } // Parse the pattern int flags = 0; if (isNocase()) { @@ -85,7 +87,11 @@ } // Use the substitution to rewrite the url if (rewrite) { - return substitution.evaluate(matcher, lastMatcher, resolver); + if (substitution != null) { + return substitution.evaluate(matcher, lastMatcher, resolver); + } else { + return url; + } } else { return null; } Modified: trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteTestCase.java =================================================================== --- trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteTestCase.java 2005-10-24 19:51:10 UTC (rev 1443) +++ trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteTestCase.java 2005-10-25 14:51:31 UTC (rev 1444) @@ -128,6 +128,49 @@ assertEquals("/about/", result); } + public void testParsing() { + Object result = null; + String test = null; + RewriteRule resultRule = null; + RewriteCond resultCond = null; + + test = "RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]"; + result = RewriteValve.parse(test); + if (result instanceof RewriteRule) { + resultRule = (RewriteRule) result; + } + assertNotNull(resultRule); + assertTrue(resultRule.isRedirect()); + assertEquals(resultRule.getPatternString(), "^/~([^/]+)/?(.*)"); + assertEquals(resultRule.getSubstitutionString(), "/u/$1/$2"); + resultRule = null; + + test = "RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]"; + result = RewriteValve.parse(test); + if (result instanceof RewriteRule) { + resultRule = (RewriteRule) result; + } + assertNotNull(resultRule); + assertTrue(resultRule.isRedirect()); + assertTrue(resultRule.isLast()); + assertEquals(resultRule.getPatternString(), "^/(.*)"); + assertEquals(resultRule.getSubstitutionString(), "http://fully.qualified.domain.name:%{SERVER_PORT}/$1"); + resultRule = null; + + test = "RewriteCond %{HTTP_HOST} !^fully\\.qualified\\.domain\\.name [NC]"; + result = RewriteValve.parse(test); + if (result instanceof RewriteCond) { + resultCond = (RewriteCond) result; + } + assertNotNull(resultCond); + assertTrue(resultCond.isNocase()); + assertEquals(resultCond.getTestString(), "%{HTTP_HOST}"); + assertEquals(resultCond.getCondPattern(), "!^fully\\.qualified\\.domain\\.name"); + resultCond = null; + + } + + public static CharSequence rewriteUrl(CharSequence url, Resolver resolver, RewriteRule[] rules) { if (rules == null) return url; Modified: trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteValve.java =================================================================== --- trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteValve.java 2005-10-24 19:51:10 UTC (rev 1443) +++ trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteValve.java 2005-10-25 14:51:31 UTC (rev 1444) @@ -12,6 +12,7 @@ import java.util.StringTokenizer; import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; import org.apache.catalina.Container; import org.apache.catalina.Context; @@ -25,7 +26,6 @@ import org.apache.catalina.connector.Response; import org.apache.catalina.util.LifecycleSupport; import org.apache.catalina.valves.ValveBase; -import org.xml.sax.InputSource; public class RewriteValve extends ValveBase implements Lifecycle { @@ -195,12 +195,73 @@ boolean done = false; for (int i = 0; i < rules.length; i++) { CharSequence newurl = rules[i].evaluate(url, resolver); - if (newurl != null) { - // Check some extra flags, including redirect, proxying, etc - // FIXME + if (newurl != null && !url.equals(newurl.toString())) { url = newurl.toString(); - rewritten = true; + rewritten = true; } + + // Control flow processing + + // - chain (skip remaining chained rules if this one does not match) + if (rules[i].isChain() && newurl == null) { + for (int j = i; j < rules.length; j++) { + if (!rules[j].isChain()) { + i = j; + break; + } + } + } + // - last (stop rewriting here) + if (rules[i].isLast() && newurl != null) { + break; + } + // - next (redo again) + if (rules[i].isNext() && newurl != null) { + i = 0; + } + // - skip (n rules) + if (newurl != null) { + i += rules[i].getSkip(); + } + + // Final reply: + // - forbidden + if (rules[i].isForbidden() && newurl != null) { + response.sendError(HttpServletResponse.SC_FORBIDDEN); + done = true; + break; + } + // - gone + if (rules[i].isGone() && newurl != null) { + response.sendError(HttpServletResponse.SC_GONE); + done = true; + break; + } + // - redirect (code) + if (rules[i].isRedirect() && newurl != null) { + // Note: No way to specify the status code here + response.sendRedirect(url); + done = true; + break; + } + + // Reply modification: + // - cookie + if (rules[i].isCookie() && newurl != null) { + // FIXME: Cookie impl + } + // - env (note: this sets a request attribute) + if (rules[i].isEnv() && newurl != null) { + request.setAttribute(rules[i].getEnvName(), rules[i].getEnvValue()); + } + // - content type (note: this will not force the content type, use a filter + // to do that) + if (rules[i].isType() && newurl != null) { + request.setContentType(rules[i].getTypeValue()); + } + // - qsappend + // FIXME: Append to query string ? + } if (rewritten) { @@ -295,7 +356,7 @@ if (tokenizer.hasMoreTokens()) { String flags = tokenizer.nextToken(); if (flags.startsWith("[") && flags.endsWith("]")) { - flags.substring(1, flags.length() - 1); + flags = flags.substring(1, flags.length() - 1); } StringTokenizer flagsTokenizer = new StringTokenizer(flags, ","); while (flagsTokenizer.hasMoreElements()) { @@ -313,7 +374,7 @@ if (tokenizer.hasMoreTokens()) { String flags = tokenizer.nextToken(); if (flags.startsWith("[") && flags.endsWith("]")) { - flags.substring(1, flags.length() - 1); + flags = flags.substring(1, flags.length() - 1); } StringTokenizer flagsTokenizer = new StringTokenizer(flags, ","); while (flagsTokenizer.hasMoreElements()) { @@ -344,7 +405,7 @@ } else if (flag.equals("OR") || flag.equals("ornext")) { condition.setOrnext(true); } else { - throw new IllegalArgumentException("Ivalid flag in: " + line); + throw new IllegalArgumentException("Ivalid flag in: " + line + " flags: " + flag); } } @@ -400,6 +461,8 @@ flag = flag.substring("R=".length()); rule.setRedirect(true); rule.setRedirectCode(Integer.parseInt(flag)); + } else { + rule.setRedirect(true); } } else if (flag.startsWith("skip") || flag.startsWith("S")) { if (flag.startsWith("skip=")) { @@ -417,7 +480,7 @@ rule.setType(true); rule.setTypeValue(flag); } else { - throw new IllegalArgumentException("Ivalid flag in: " + line); + throw new IllegalArgumentException("Ivalid flag in: " + line + " flag: " + flag); } } |