[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