From: markt Date: Sat, 7 Jun 2008 14:34:36 +0000 (+0000) Subject: Add a new valve that works-around the broken MS WedDAV client. X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=c4d242e8513a7376a6a11a443bb55a9a4e0faa47;p=tomcat7.0 Add a new valve that works-around the broken MS WedDAV client. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@664345 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/valves/WebdavFixValve.java b/java/org/apache/catalina/valves/WebdavFixValve.java new file mode 100644 index 000000000..3b340f2c5 --- /dev/null +++ b/java/org/apache/catalina/valves/WebdavFixValve.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.catalina.valves; + +import java.io.IOException; + +import javax.servlet.ServletException; + +import org.apache.catalina.valves.ValveBase; +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; + +/** + * Valve 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: + * + * To use this valve add the following <Valve + * className="org.apache.catalina.valves.MicrosoftWebdavFixValve" /> + * to your Engine, Host or Context as + * required. Normally, this valve would be used at the Context + * level. + * + * @version $Revision: 420067 $, $Date: 2006-07-08 09:16:58 +0200 (sub, 08 srp 2006) $ + */ + +public class WebdavFixValve + extends ValveBase { + + /** + * 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); + } + } + + private String buildRedirect(Request request) { + StringBuffer location = + new StringBuffer(request.getRequestURL().length()); + location.append(request.getScheme()); + location.append("://"); + location.append(request.getHost().getName()); + 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 + // problems with BASIC authentication + location.append(request.getServerPort()); + location.append(request.getRequestURI()); + return location.toString(); + } +}