Christopher Schultz schrieb am 20.11.2008 um 10:05:48 (-0500):
> Micheal,
> 
> Your comment about calling getResponse().getOutputStream() and
> ignoring the result got me to thinking...

Christopher,

I may actually have had a point there, although I'm not sure this is the
case. I just verified that the working HttpResponseCatcher I posted some
minutes ago stops working correctly when I omit the calls to the
underlying ServletResponse object. In that case, the output looks like
this:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Gurke: eingelegt
GuFilter-Zeichen: 101
GuFilter-Oktette: 103
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Fri, 21 Nov 2008 20:58:00 GMT

<!-- Käseküchlein --><p>Included text</p>
<html><p>Before include</p>
<p>After include</p></html>

You can see that the included HTML snippet is in the wrong place. (The
comment is inserted by the filter on the outgoing response.)

> You know what? I just realized that I've been leading you down the
> wrong path: you must manage the buffers separately because of the "you
> can only call either getOutputStream OR getWriter" rule.
> 
> I think you can still make it work with a unified buffer, but you have
> to be more careful. Let's be less careful and more straightforward.

Your argument in favour of the unified buffer sounds perfectly logical
to me. In the end, it's all bytes that get written, regardless of
whether or not I wrap a PrintWriter around the buffer.

I have to make sure, of course, to always hand out the same buffer, so
all output goes there.

I possibly also have to make sure to play by the same rules as the real
implementation and not allow both getWriter() and getOutputStream() on
the same resonse.

> Basically, you'll have to duplicate your efforts to wrap the Writer
> the same way you did the OutputStream: create a WriterWrapper and
> cache that information. I'd recommend using a StringWriter as a
> backing class, since you don't have to worry too much about the
> character encoding at that point (because Writers always use
> characters, not bytes).

Hmm. Do you still think this is better?

And what do you mean by "caching" it? Just keeping it in an instance
variable, instead of erroneously creating a new one for each call of
getWriter(), as I first did?

> Anyhow, you definitely /should/ call getResponse().getOutputStream()
> (or getWriter(), whichever the case may be) when your getOutputStream()
> method is invoked: you definitely want the state handling to be done by
> the wrapped request, because you never know what has happened to the
> request before your filters gets its hands on it.

I agree: You never know. And who knows what stuff gets set or tweaked in
Tomcat's internals for each one of getWriter() and getOutputStream(). On
the other hand, I haven't found any statement to the effect that you
have to pass through the calls to the underlying response object.

Michael Ludwig

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to