"Mark E. Palandri" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> I've got a Tomcat 5.0.14, IIS 5.1, jk2 setup.
>
> My workers2.properties file has a [uri:/foo/*] set up to forward requests
to
> a worker.
>
> I've got the worker service set up to handle the requests with the
following
> server.xml context:
>
>   <Context path="/foo" docBase="C:\foo" debug="0" reloadable="false"/>
>
> I've got a servlet implementing a WebDAV server with a WEB.XML file that
> contains the following:
>
>   <servlet-mapping>
>     <servlet-name>foo</servlet-name>
>     <url-pattern>/*</url-pattern>
>   </servlet-mapping>
>
> It all seems to work fine. All requests with a URI prefix of "/foo" get to
> my servlet great except for one small hitch. If a request comes in with
> specifying a resource URI of exactly "/foo", the request does not get to
my
> servlet. Instead, a 302 redirect response is generated specifying a
location
> of "http://bar/foo/"; (note the trailing slash). If a request specifying a
> resource URI of "/foo/" comes in, it gets forwarded to my servlet.
>
> My problem is that there are a great many WebDAV clients out there that
> can't handle the 302 response and treat it as an error. The main culprits
> are the Win2K and WinNT Web Folder clients. The WinXP client seems to
handle
> it fine, but it seems really inefficient for each request sent to "/foo"
to
> be redirected to "/foo/".
>
> I can get around this by specifying path="" in the <Context> tag, but then
> the context path of the servlet request is empty, making it awkward for
the
> servlet to figure out what portion of the request URI is context and what
is
> the rest.
>
> I got the source code for the worker process and ran it in a debugger to
see
> if I could find the source of the problem. What it came down to was the
> 'internalMapWrapper' method of the
org.apache.tomcat.util.http.mapper.Mapper
> class. This method has the following snippet of code:
>
>   int length = context.name.length();
>   if (length != (pathEnd - pathOffset)) {
>       servletPath = pathOffset + length;
>   } else {
>       // The path is empty, redirect to "/"
>       path.append('/');
>       mappingData.redirectPath.setChars
>           (path.getBuffer(), path.getOffset(), path.getEnd());
>       path.setEnd(path.getEnd() - 1);
>       return;
>   }
>
> When the context is "/foo" and the path is "/foo", the redirectPath of
> mappingData is set to "/foo/" and the 'service' method of the
> org.apache.coyote.tomcat5.CoyoteAdapter class then calls
> response.sendRedirect instead of calling the servlet container.
>
> I was wondering if anyone knew of a way for me to keep my context path at
> "/foo" and not have requests with a URI of "/foo" generate a response of
302
> and instead get passed through to my servlet.
>

Well, you could always modify your copy of the Tomcat source.  The other
alternative is to drop a line to Bill Gates, and ask him to fix his broken
client  ;-).

The reason that Tomcat does this is that HTML tags like <img
src="images/bar.gif"> would get resolved to /images/bar.gif instead of
/foo/images/bar.gif.



> Thanks,
>
> Mark




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to