Hi Bill,

Thanks! I can see why this shouldn't be changed because it will break a lot of apps.

I am using a Java URL, so it appears that Java isn't redirecting with the same method! I tested from Firefox and it redirects correctly. This isn't an issue for me anymore because I actually do not want the redirect, but happened to stumble across the fact that Tomcat and other servlet containers (ex: Resin) behave differently in this regard.

Thanks,
Rich

Bill Barker wrote:

It's a well-known bug with most browsers.  RFC 2616 actually states that the 
browser should respond to a 302 redirect with the same method as the original 
request, but most browser implementations ignore this.  Complain to the browser 
vendor ;-).

You don't say what your servlet-mapping is.  If it is '/', then, yes you are 
going to see this.  If it is '/*', then Tomcat should pass it to your Servlet.

Your research into this problem is admirable, but it has been discussed at 
great length on [EMAIL PROTECTED], so don't waste your time posting to BZ:  It 
will be immediately closed as WONTFIX, since doing what you want would break 
very many more apps.
 "Rich Giuli" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED]
 Hi all,

 I am using the latest stable version of Tomcat Embedded. I have a question 
regarding how redirect works for a servlet.

My servlet mapping name is "RexaRetrieval". The basic problem I was having is that when I send a POST request, the HttpServletRequest always says it is a GET. If the URL I put in is: "http://localhost:8081/RexaRetrieval"; This causes a redirect to a GET request. If the URL is: "http://localhost:8081/RexaRetrieval/"; This works. The only difference is the trailing '/' character.
 Resin does not have this problem. When I deploy the same war, both POST 
requests work.

 The relevant source code is in org.apache.tomcat.util.http.mapper.Mapper line 
641:

  1         boolean noServletPath = false;
2 3 int length = context.name.length();
  4         if (length != (pathEnd - pathOffset)) {
  5             servletPath = pathOffset + length;
  6         } else {
  7             noServletPath = true;
  8             path.append('/');
  9             pathOffset = path.getOffset();
 10             pathEnd = path.getEnd();
 11             servletPath = pathOffset+length;
 12         }
 Note the !=. This means if a trailing forward slash is missing, 
"noServletPath" is true.

 The in Mapper line 688:

  1         if(mappingData.wrapper == null && noServletPath) {
  2             // The path is empty, redirect to "/"
  3             mappingData.redirectPath.setChars
  4                 (path.getBuffer(), pathOffset, pathEnd);
  5             path.setEnd(pathEnd - 1);
  6             return;
  7         }
 Another related question: how is this redirect suposed to work? The original method was 
POST. Does it always redirect to GET when there is a servlet path? What if I were to post 
to a URL like "http://localhost:8081/RexaRetrieval/foo";. I am guessing the 
correct action here would be that this redirects to a GET because posting to such a URL 
doesn't make sense.

 Thanks,
 Rich


Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to