On 02/06/2014 00:50, Konstantin Kolinko wrote:

<snip/>

> Ack, OK.
> I re-reviewed with your arguments in mind and see that nothing has changed.
> 
> Several comments.
> 
> First
> --------
> One oddity here is, though. The success of this refactoring is based
> on fact that ActionCode.RESET is used internally in coyote only, as
> implementation and meaning of this 'RESET' code was changed.
> 
> Maybe do it the other way,
> Remove "reset()" method from Response object and replace it with call
> to action(ActionCode.RESET).  See r1598246 for an inspiration.
> It implies the following:
> a) Restore response.recycle() in http11.AbstractOutputBuffer.
> b) Implement ActionCode.RESET in AJP connector:
>  {  response.recycle(). }
> 
> Motivations:
> 1) AbstractOutputBuffer#nextRequest() already calls response.recycle().
> So it already calls recycle() method in similar use case.
> 2) AbstractOutputBuffer#reset() throws ISE with message text.
> The method in Response does not has text in its ISE.
> 3) ActionCode.RESET now will have original meaning and can be called
> from outside of coyote.

Hmm. It needs moving a check for a committed response into
AbstractAjpProcessor. Let me think about that.

At the back of my mind is a desire to get as close as possible to
non-endpoint specific implementations with all the endpoint specific
code in the Endpoint class and/or SocketWrapper.

> Second
> ------------
> 
>>         // Servlet 3.1 non-blocking write listener
>>         listener = null;
>>         fireListener = false;
>>         registeredForWrite = false;
> 
> (I think ServletResponse.reset() is not prohibited in async mode. It
> is prohibited once response is committed, but startAsync alone does
> not commit the response, nor does registering a WriteListener.)
> 
> Its javadoc says
> http://docs.oracle.com/javaee/7/api/javax/servlet/ServletResponse.html#reset%28%29
> 
> [quote]
> If getWriter() or getOutputStream() have been called before this
> method, then the corrresponding returned Writer or OutputStream will
> be staled and the behavior of using the stale object is undefined.
> [/quote]
> 
> Thus it should be OK to clear the listener installed via that old 
> OutputStream.
> 
> It a bit contradicts to the following
> http://docs.oracle.com/javaee/7/api/javax/servlet/ServletOutputStream.html#setWriteListener%28javax.servlet.WriteListener%29
> 
> [quote]
> IllegalStateException - if one of the following conditions is true
>  * the associated request is neither upgraded nor the async started
>  * setWriteListener is called more than once within the scope of the
> same request.
> [/quote]
> 
> I think the above "called more than once within ... the same request"
> condition is reset by response.reset() call.

Agreed. This is no different to the Writer/OutputStream issue.

> Third
> --------
> Looking at org.apache.catalina.connector.Response.reset()
> I suspect that it has to recycle  o.a.c.connector.OutputBuffer.conv converter.
> 
> Are there encodings that may leave bytes in converter's buffer
> during char->bytes conversion?

Not to my knowledge so (for now) I think we are safe.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to