Hi,
It seems your patch correct the AJP13 + RequestDispatcher.forward() problem.
I'll do more tests but it seems to be good :-)
Thanks
PS: Could be commited ;-)
"La maîtrise des autres n'est que la force. La maîtrise de vous-même est le
véritable pouvoir"
-- Lao Tzu
>-----Original Message-----
>From: Clinton, Doug [mailto:[EMAIL PROTECTED]]
>Sent: Friday, November 24, 2000 3:07 PM
>To: [EMAIL PROTECTED]
>Subject: [PATCH] Possible fix for bug #373
>
>
>Further to my earlier message, I've been investigating the problem with
>ajp13 and found the following.
>
>RequestDispatcher.forward() calls realResponse.finish() as its
>final action.
>However, ContextManager.service() also calls finish() on the
>response which
>results in two packets of type JK_AJP13_END_RESPONSE being
>written back to
>the mod_jk stream. This means that the next time mod_jk makes
>a request the
>first thing it will get back from tomcat is the second
>END_RESPONSE packet.
>The real response to the request gets left, buffered in the
>socket stream.
>
>
>Hence, every time mod_jk makes a request which must be passed through
>forward, the whole reponse stream gets one more step behind.
>
>My first fix to the problem was to remove the call to finish() from
>RequestDispatcher.forward(). However, I am unsure as to what
>possible side
>effects this might have, hence I have produced the patch below to
>Ajp13ConnectorResponse.java which prevents multiple calls to
>finish() from
>producing more than one END_RESPONSE packet. The flag to check
>for this is
>reset in the recycle() method so that the Ajp13ConnectorResponse can be
>reused.
>
>Since this is the first time I've delved into the tomcat code
>I'm concerned
>that I may have missed something critical so if anyone who has more
>experience of this area of the code can look over the patch
>I'd appreciate
>it. In particular I'm not sure whether the call to
>super.finish() should be
>made regardless of whether it has been called already.
>
>thanks,
>Doug Clinton
>[EMAIL PROTECTED]
>
>
>diff -p Ajp13ConnectorResponse.java Ajp13ConnectorResponse.java.orig
>*** Ajp13ConnectorResponse.java Fri Nov 24 13:53:37 2000
>--- Ajp13ConnectorResponse.java.orig Tue Nov 21 03:24:06 2000
>*************** public class Ajp13ConnectorResponse exte
>*** 97,104 ****
>
> MsgConnector con;
>
>- private boolean finished = false;
>-
> public Ajp13ConnectorResponse()
> {
> }
>--- 97,102 ----
>*************** public class Ajp13ConnectorResponse exte
>*** 150,165 ****
>
> public void finish() throws IOException
> {
>! if (!finished) {
>! super.finish();
>! finished = true;
>! MsgBuffer msg = con.getMsgBuffer();
>! msg.reset();
>! msg.appendByte(JK_AJP13_END_RESPONSE);
>! msg.appendByte((byte)1);
>! msg.end();
>! con.send(msg);
>! }
> }
>
> protected int headerNameToSc(String name)
>--- 148,160 ----
>
> public void finish() throws IOException
> {
>! super.finish();
>! MsgBuffer msg = con.getMsgBuffer();
>! msg.reset();
>! msg.appendByte(JK_AJP13_END_RESPONSE);
>! msg.appendByte((byte)1);
>! msg.end();
>! con.send(msg);
> }
>
> protected int headerNameToSc(String name)
>*************** public class Ajp13ConnectorResponse exte
>*** 215,221 ****
> public void recycle()
> {
> super.recycle();
>- finished = false;
> }
>
> public void setConnector(MsgConnector con)
>--- 210,215 ----
>