Author: markt
Date: Mon Jul 6 21:06:13 2009
New Revision: 791616
URL: http://svn.apache.org/viewvc?rev=791616&view=rev
Log:
Convert the WebDAV fix valve to a filter.
Based on a patch provided by Xie Xiaodong as part of GSOC 2009
Added:
tomcat/trunk/java/org/apache/catalina/filters/WebdavFixFilter.java
- copied, changed from r791216,
tomcat/trunk/java/org/apache/catalina/valves/WebdavFixValve.java
Removed:
tomcat/trunk/java/org/apache/catalina/valves/WebdavFixValve.java
Modified:
tomcat/trunk/webapps/docs/config/filter.xml
tomcat/trunk/webapps/docs/config/valve.xml
Copied: tomcat/trunk/java/org/apache/catalina/filters/WebdavFixFilter.java
(from r791216, tomcat/trunk/java/org/apache/catalina/valves/WebdavFixValve.java)
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/filters/WebdavFixFilter.java?p2=tomcat/trunk/java/org/apache/catalina/filters/WebdavFixFilter.java&p1=tomcat/trunk/java/org/apache/catalina/valves/WebdavFixValve.java&r1=791216&r2=791616&rev=791616&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/WebdavFixValve.java (original)
+++ tomcat/trunk/java/org/apache/catalina/filters/WebdavFixFilter.java Mon Jul
6 21:06:13 2009
@@ -15,58 +15,76 @@
* limitations under the License.
*/
-package org.apache.catalina.valves;
+package org.apache.catalina.filters;
import java.io.IOException;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
-
-import org.apache.catalina.valves.ValveBase;
-import org.apache.catalina.connector.Request;
-import org.apache.catalina.connector.Response;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
- * Valve that attempts to force MS WebDAV clients connecting on port 80 to use
+ * Filter that attempts to force MS WebDAV clients connecting on port 80 to use
* a WebDAV client that actually works. Other workarounds that might help
* include:
* <ul>
- * <li>Specifing the port, even if it is port 80, when trying to
connect.</li>
- * <li>Canceling the first authentication dialog box and then trying to
+ * <li>Specifying the port, even if it is port 80, when trying to
connect.</li>
+ * <li>Cancelling the first authentication dialog box and then trying to
* reconnect.</li>
* </ul>
- * To use this valve add the following <code><Valve
- * className="org.apache.catalina.valves.WebdavFixValve" /></code>
- * to your <code>Engine</code>, <code>Host</code> or <code>Context</code> as
- * required. Normally, this valve would be used at the <code>Context</code>
- * level.
- *
- * @version $Revision$, $Date$
+ *
+ * Generally each different version of the MS client has a different set of
+ * problems.
+ * TODO: Update this filter to recognise specific MS clients and apply the
+ * appropriate workarounds for that particular client
+ *
+ * As a filter, this is configured in web.xml like any other Filter. You
usually
+ * want to map this filter to whatever your WebDAV servlet is mapped to.
*/
-public class WebdavFixValve
- extends ValveBase {
+public class WebdavFixFilter implements Filter {
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ }
+
+ @Override
+ public void destroy() {
+ }
/**
* Check for the broken MS WebDAV client and if detected issue a re-direct
* that hopefully will cause the non-broken client to be used.
*/
- public void invoke(Request request, Response response)
- throws IOException, ServletException {
-
- String ua = request.getHeader("User-Agent");
- if (ua != null && ua.contains("MiniRedir")) {
- response.sendRedirect(buildRedirect(request));
- } else {
- getNext().invoke(request, response);
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response,
+ FilterChain chain) throws IOException, ServletException
{
+ if (!(request instanceof HttpServletRequest) ||
+ !(response instanceof HttpServletResponse)) {
+ chain.doFilter(request, response);
+ return;
}
- }
+ HttpServletRequest httpRequest = ((HttpServletRequest) request);
+ HttpServletResponse httpResponse = ((HttpServletResponse)
response);
+ String ua = httpRequest.getHeader("User-Agent");
+ if (ua != null && ua.contains("MiniRedir")) {
+ httpResponse.sendRedirect(buildRedirect(httpRequest));
+ } else {
+ chain.doFilter(request, response);
+ }
+ }
- private String buildRedirect(Request request) {
+ private String buildRedirect(HttpServletRequest request) {
StringBuffer location =
new StringBuffer(request.getRequestURL().length());
location.append(request.getScheme());
location.append("://");
- location.append(request.getHost().getName());
+ location.append(request.getServerName());
location.append(':');
// If we include the port, even if it is 80, then MS clients will use
// a WebDAV client that works rather than the MiniRedir that has
@@ -75,4 +93,5 @@
location.append(request.getRequestURI());
return location.toString();
}
+
}
Modified: tomcat/trunk/webapps/docs/config/filter.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/filter.xml?rev=791616&r1=791615&r2=791616&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/filter.xml (original)
+++ tomcat/trunk/webapps/docs/config/filter.xml Mon Jul 6 21:06:13 2009
@@ -77,7 +77,39 @@
<subsection name="Initialisation parameters">
<p>The Add Default Character Set Filter does not support any initialization
- parameters</p>
+ parameters.</p>
+
+ </subsection>
+
+</section>
+
+
+<section name="WebDAV Fix Filter">
+
+ <subsection name="Introduction">
+
+ <p>Microsoft operating systems have two WebDAV clients. One is used with
+ port 80, the other is used for all other ports. The implementation used
with
+ port 80 does not adhere to the WebDAV specification and fails when trying
to
+ communicate with the Tomcat WebDAV Servlet. This Filter provides a fix for
+ this by forcing the use of the WebDAV implementation that works, even when
+ connecting via port 80.</p>
+
+ </subsection>
+
+ <subsection name="Filter Class Name">
+
+ <p>The filter class name for the WebDAV Fix Filter is
+ <strong><code>org.apache.catalina.filters.WebdavFixFilter</code>
+ </strong>.</p>
+
+ </subsection>
+
+ <subsection name="Initialisation parameters">
+
+ <p>The WebDAV Fix Filter does not support any initialization
parameters.</p>
+
+ </subsection>
</subsection>
Modified: tomcat/trunk/webapps/docs/config/valve.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/valve.xml?rev=791616&r1=791615&r2=791616&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/valve.xml (original)
+++ tomcat/trunk/webapps/docs/config/valve.xml Mon Jul 6 21:06:13 2009
@@ -449,42 +449,6 @@
</section>
-<section name="WebDAV Fix Valve">
-
- <subsection name="Introduction">
-
- <p>Microsoft operating systems have two WebDAV clients. One is used with
- port 80, the other is used for all other ports. The implementation used
with
- port 80 does not adhere to the WebDAV specification and fails when trying
to
- communicate with the Tomcat WebDAV Servlet. This valve provides a fix for
- this by forcing the use of the WebDAV implementation that works, even when
- connecting via port 80.</p>
-
- <p>This Valve may be used at the <code>Engine</code>, <code>Host</code> or
- <code>Context</code> level as required. Normally, this Valve would be used
- at the <code>Context</code> level.</p>
-
- </subsection>
-
- <subsection name="Attributes">
-
- <p>The <strong>WebDAV Fix Valve</strong> supports the following
- configuration attributes:</p>
-
- <attributes>
-
- <attribute name="className" required="true">
- <p>Java class name of the implementation to use. This MUST be set to
- <strong>org.apache.catalina.valves.WebdavFixValve</strong>.</p>
- </attribute>
-
- </attributes>
-
- </subsection>
-
-</section>
-
-
<section name="Add Default Character Set Valve">
<subsection name="Introduction">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]