Thanks for the reply

> Question: can we put parameters in the URL when sending data
> using the POST
> method ? In that case, we could maybe use the getQueryString()
> method (if it
> doesn't call getInputStream()) ?

With Tomcat you can definitely pass a query string when using POST, don't
know about other servers but without checking the HTTP spec I would think
they work also. I also don't see any reason for the server to call
getInputStream in this case as the query string is passed as part of the
URL.

Reading the HTTP RFC, I can see nowhere in the spec that POST handlers
should ignore the query string.

I think parsing the query string is the only realistic solution (without
looking at the code). If I pass data as a serialized object, the redirector
has to use get[InputStream|Reader] to get the data, this will interfere with
my servlet calling getParameter. If the re-director calls getParameter this
will interfere with my servlet calling get[InputStream|Reader].

If this works then would the idea be to add support for add beginXXX methods
that take a WebRequest object that we could 'write' the input data to?

Kevin Jones
Developmentor
www.develop.com

> -----Original Message-----
> From: Vincent Massol [mailto:[EMAIL PROTECTED]]
> Sent: 08 October 2001 17:26
> To: [EMAIL PROTECTED]
> Subject: Re: Sending data to a servlet
>
>
> Hi Kevin,
>
> ----- Original Message -----
> From: "Kevin Jones" <[EMAIL PROTECTED]>
> To: "Cactus-User" <[EMAIL PROTECTED]>
> Sent: Monday, October 08, 2001 3:49 PM
> Subject: Sending data to a servlet
>
>
> > I want to send data to a servlet that the servlet retrieves using
> > req.getReader. I know that Cactus doesn't support this directly (and I
> know
> > there's an open todo :-) ),
>
> hehe ... :)
>
> I've tried to write a unit test for Cactus that would use getReader() as I
> didn't see why it would not work ... and it doesn't work ... ! My test is
> very simple:
>
>  public void beginGetReader(WebRequest theRequest)
>  {
>      theRequest.addParameter("test", "some body data");
>   }
>
>  public void testGetReader() throws Exception
>  {
>      String buffer;
>      StringBuffer body = new StringBuffer();
>      BufferedReader reader = request.getReader();
>      while ((buffer = reader.readLine()) != null) {
>          body.append(buffer);
>      }
>      assertEquals("test=some body data", body.toString());
>  }
>
> By default, Cactus sends the parameters using the POST method so
> getReader()
> should get the parameter. Ok, I know, if you need to send some raw data
> (without the 'xxx = yyy' format) then it wouldn't work but it
> would be easy
> to add a new method for that.
>
> However, the above test fails and body.toString() is empty. Why ?
> I believe
> it is because, internally, Cactus sends other internal parameters in the
> http request (such as the name of the test class, the method to call, ...)
> and these parameters are extracted by the servlet redirector (using
> request.getParameter()) _before_ the testGetReader() is called ... and
> Servlet API doc says that for a given request, getParameter()
> [which must be
> using getInputStream() internally] or getReader() can be called
> but not both
> ... [for some reason, using Resin, it does not raise an exception, but
> returns ""].
>
> .....
>
> This is a major issue as we absolutely need to pass (transparently) some
> context data to the servlet redirector. If we want to be able to support
> getReader() [and we do want that !], we need to find another way
> of passing
> our internal data .... A solution might be to continue to pass them in the
> body and extract them by hand [not using getParameter()] by calling
> getReader() [but we will need to be careful not to read on the
> data for the
> test part  - we could also use a serialized java object]. This means there
> will be 2 cases: tests that uses getInputStream() and tests that uses
> getReader() ...
>
> Question: can we put parameters in the URL when sending data
> using the POST
> method ? In that case, we could maybe use the getQueryString()
> method (if it
> doesn't call getInputStream()) ?
>
> To summarize:
> * adding support for sending data to servlets is easy if the code
> under test
> is using getInputStream() to get that data
> * adding support for sending data to servlets is difficult if the
> code under
> test is using getReader() to get that data
>
> > so can I do this 'outside' the scope of Cactus
> > and still have the tests executed. I.e. can I use an
> HttpUrlConnection (or
> > similar) to talk to the re-direction proxy within my testXXX methods?
>
> hum ...
> * the interface between the Cactus client and the Cactus server
> parts is not
> public, meaning it may change in the future (as demonstrated for
> example by
> the above analysis which will probably lead to a change),
> * it would not even work for the reason explained above (getParameter() is
> called before your getReader() code).
>
> The only solution is to help us on Cactus correct this bug/limitation you
> have found ... ! ;-)
>
> Thanks for that !
>
> >
> > Kevin Jones
> > Developmentor
> > www.develop.com
> >
>
> -Vincent
>
> --
> Vincent Massol, [EMAIL PROTECTED]
> OCTO Technology, www.octo.com
> Information System Architecture Consulting
>

Reply via email to