From: <jbo...@li...> - 2005-10-28 15:26:24
|
Author: rem...@jb... Date: 2005-10-28 11:26:18 -0400 (Fri, 28 Oct 2005) New Revision: 1463 Modified: trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteValve.java trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/TomcatResolver.java Log: - Should handle setting the valve to a Context (config is in /WEB-INF/rewrite.properties). - Update Tomcat resolver to return non null strings for paths. 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-28 15:14:47 UTC (rev 1462) +++ trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/RewriteValve.java 2005-10-28 15:26:18 UTC (rev 1463) @@ -26,6 +26,7 @@ import org.apache.catalina.connector.Response; import org.apache.catalina.util.LifecycleSupport; import org.apache.catalina.valves.ValveBase; +import org.apache.tomcat.util.buf.CharChunk; public class RewriteValve extends ValveBase implements Lifecycle { @@ -64,6 +65,12 @@ /** + * Will be set to true if the valve is associated with a context. + */ + protected boolean context = false; + + + /** * Maps to be used by the rules. */ protected Map maps = new Hashtable(); @@ -87,6 +94,7 @@ // Process configuration file for this valve if (getContainer() instanceof Context) { + context = true; is = ((Context) getContainer()).getServletContext() .getResourceAsStream("/WEB-INF/" + resourcePath); } else { @@ -210,10 +218,7 @@ // As long as MB isn't a char sequence or affiliated, this has to be // converted to a string - // FIXME: Most likely need to use the requestPath to handle the case - // where the valve is set at the context level, and then reconstruct the - // full URL at the end - String url = request.getDecodedRequestURI(); + String url = context ? request.getRequestPathMB().toString() : request.getDecodedRequestURI(); boolean rewritten = false; boolean done = false; for (int i = 0; i < rules.length; i++) { @@ -293,9 +298,16 @@ if (rewritten) { if (!done) { + // Set the new URL + CharChunk chunk = request.getCoyoteRequest().requestURI().getCharChunk(); + chunk.recycle(); + if (context) { + chunk.append(request.getContextPath()); + } + chunk.append(url); + request.getCoyoteRequest().requestURI().toChars(); // Reinvoke the whole request recursively try { - request.getCoyoteRequest().requestURI().setString(url); request.getConnector().getProtocolHandler().getAdapter().service (request.getCoyoteRequest(), response.getCoyoteResponse()); } catch (Exception e) { Modified: trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/TomcatResolver.java =================================================================== --- trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/TomcatResolver.java 2005-10-28 15:14:47 UTC (rev 1462) +++ trunk/labs/jbossweb/src/share/classes/org/jboss/web/rewrite/TomcatResolver.java 2005-10-28 15:26:18 UTC (rev 1463) @@ -17,7 +17,7 @@ * - IS_SUBREQ */ public String resolve(String key) { - // FIXME: Time based stuff not implemented + // FIXME: Time based stuff is not implemented if (key.equals("HTTP_USER_AGENT")) { return request.getHeader("user-agent"); } else if (key.equals("HTTP_USER_AGENT")) { @@ -48,10 +48,16 @@ return request.getMethod(); } else if (key.equals("SCRIPT_FILENAME")) { return request.getRealPath(request.getServletPath()); //FIXME ? + } else if (key.equals("REQUEST_PATH")) { + return request.getRequestPathMB().toString(); + } else if (key.equals("CONTEXT_PATH")) { + return request.getContextPath(); + } else if (key.equals("SERVLET_PATH")) { + return emptyStringIfNull(request.getServletPath()); } else if (key.equals("PATH_INFO")) { - return request.getPathInfo(); + return emptyStringIfNull(request.getPathInfo()); } else if (key.equals("QUERY_STRING")) { - return request.getQueryString(); + return emptyStringIfNull(request.getQueryString()); } else if (key.equals("AUTH_TYPE")) { return request.getAuthType(); } else if (key.equals("DOCUMENT_ROOT")) { @@ -80,12 +86,20 @@ } public String resolveSsl(String key) { - // FIXME: Implement SSL env variables + // FIXME: Implement SSL environment variables return null; } public String resolveHttp(String key) { return request.getHeader(key); } + + private static final String emptyStringIfNull(String value) { + if (value == null) { + return ""; + } else { + return value; + } + } } |