jakarta-cactus-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kazuhito SUGURI <suguri.kazuh...@lab.ntt.co.jp>
Subject Re: Testing servlet redirects
Date Tue, 20 Jun 2006 09:49:22 GMT
Hi Dennis,

Followings are information and recommendation from me.
These are based on short examination with default settings of Tomat-5.5.12.
But, please note that behavior of a servlet named "default" might
be different for each container and its configuration.

In article <eb76c8de0606191414o76c404d1y3a53b5417f1506be@mail.gmail.com>,
Mon, 19 Jun 2006 23:14:40 +0200,
"Dennis Kempin" <dennis.kempin@googlemail.com> wrote: 
dennis> thank you for your answer. My servlet is mapped to process any request that
dennis> is made.
dennis> Lets say we have a request on /core/test.html: My servlets checks if it can
dennis> handle, if not it redirects to the default
dennis> servlet which should serve test.html (which does exist).
dennis> But instead of the contents of test.html i get the described 404 Error which
dennis> says that it cannot find "/core/ServletRedirector".

I think it's hard to test the forwarding by using Cactus
as long as you are using getNamedDispatcher("default").


RequestDispatcherWrapper#forward(), which is used in the test,
calls the original RequestDispatcher with the original HTTP request.
# See Cactus API JavaDoc.

A servier-side test case is invoked from a servlet,
/<context>/ ServletRedirecter. So, the request URI of the original HTTP
request is "/<context>/ServletRedirector".

When the original RequestDispatcher is the default servlet of Tomcat,
it's trying to obtain the resource from "/<context>/ServletRedirector",
that has the possiblity of causing an infinite loop.
# Fortunately, the default servlet responds 404 and stops the loop.

Please try following fragments of servlet and web.xml.
You will find similar behavior with your Cactus tests
when you access to <context>/dummy.

    public DummyServlet
        extends HttpServlet
    {
        protected void doGet(HttpServletRequest request,
                             HttpServletResponse response)
            throws ServletException, IOException
        {
            getServletContext().getNamedDispatcher("default").forward(request, response);
        }
    }

    <servlet>
      <servlet-name>dummy</servlet-name>
      <servlet-class>DummyServlet</servlet-name>
    </servlet>
    <servlet-mapping>
      <servlet-name>dummy</servlet-name>
      <url-pattern>/dummy</url-pattern>
    </servlet-mapping>


I would like to recommend you to use getRequestDispatcher(String)
instead of getNamedDispatcher("default"), it it's possible.
If you can do so, you will be able to simulate any path condition
for a testXXX() by using org.apache.cactus.WebRequest#setURL() method
in beginXXX(), and you can evaluate a forwarded responce in the corresponding
endXXX() method.
# You should not simulate <context>/ServletRedirector,
# which is the default of Cactus, of cource :-)


Hope this helps,
----
Kazuhito SUGURI

Mime
View raw message