tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bugzi...@apache.org
Subject DO NOT REPLY [Bug 3760] New: - When forwaring from one servlet to another, path info may get lost
Date Fri, 21 Sep 2001 10:59:12 GMT
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3760>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3760

When forwaring from one servlet to another, path info may get lost

           Summary: When forwaring from one servlet to another, path info
                    may get lost
           Product: Tomcat 3
           Version: 3.2.3 Final
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: Servlet
        AssignedTo: tomcat-dev@jakarta.apache.org
        ReportedBy: sebastian.kanthak@muehlheim.de


Symptom: When forwaring from one servlet to another, path info may get lost
Tomcat version: 3.2.3

It gets lost under these two circumstances:

1. It is forwarded to /servlet/* (no mapping in server.xml) and this
serlvet has not been accessed so far. On the second request, path info
is transmitted correctly.

2. It is forwarded to /someurl and in web.xml there is a mapping
for /someurl (not /someurl/*) to a servlet.

It works, however, if the request is forwarded to /someurl and there
is a mapping for /someurl/* in web.xml.

That 2 does not work may be acceptable, although I think it should
work (does somebody know, what the spec says?), but 1 is not
acceptable in my eyes.

Diagonistics:

The reasons, why it does not work, are different:

1. On the first request, the dynamic wrapping for
/servlet/SecondServlet is not present. So in SimpleMapper1.contextMap

	    Container container =(Container)map.getLongestPrefixMatch(  host,
									path );
returns a default container. This leads to erasure of path info in
SimpleMapper1.fixRequestPaths:
	case Container.DEFAULT_MAP:
	    s=path.substring( ctxPLen );
	    pathI= null ;

If this request was not created by forwarding, this would be solved by
InvokerIntercetor.requestMap:
	// Now we need to fix path info and servlet path
    // [cut irrelevant code]
	int secondSlash=servletPath.indexOf("/", prefixLen );
	if ( secondSlash > -1) {
	    servletName = servletPath.substring(prefixLen, secondSlash );
	    newPathInfo = servletPath.substring( secondSlash );
	} else {
	    servletName = servletPath.substring( prefixLen );
	}
but this does obviously not work, as servletPath does not contain the
path info, because it was a forward request.

2. Path info is removed by SimpleMapper1.contextMap calling
fixRequestPaths, because container is of type PATH_MAP.

Possible Solution:

In RequestDispatcherImpl (which starts the forwarding process) add a
special attribute "isForwarded" to
request. SimpleMapper1.fixRequestPaths should check for this attribute
before "fixing" path info, because this has already been done by its
invocation for the original servlet.

Is there a chance, you will fix this (I can supply a diff) and
release something like 3.2.3p1 or do I have to live with a patched
tomcat?

Mime
View raw message