You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by Senduran <bs...@gmail.com> on 2016/03/25 11:59:27 UTC

Handling 204 Response with Body

Hi all,

Some backend responses the '204 No content' status code with body (yes,
clearly spec violation)
In our targetHandler
<https://svn.wso2.org/repos/wso2/carbon/platform/tags/turing-chunk08/dependencies/synapse/2.1.2-wso2v5/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java#L200>
we check(isResponseHaveBodyExpected) for some status code (204, 205 and
304) and assumes those will not contain body and continue the rest. Once we
find those status code we call resetInput()
<http://grepcode.com/file/repo1.maven.org/maven2/org.apache.httpcomponents/httpcore-nio/4.2.3/org/apache/http/impl/nio/DefaultNHttpClientConnection.java?av=f#146>.(But
it didn't clear the sessionInputBuffer)

Every thing works fine, unless such spec violation happens. Once the 204
comes with a message body, the sessionInputBuffer is filled with the
content. and no one will consume it. So when the 2nd response comes (using
the same connection) it will use the same session input buffer and will get
a corrupted data. (in this case we are getting protocol violation
exception, since the 1st 204 response's body is prepended to the 2nd
response's status line)

What would be best way to fix this

Thanks
Senduran

Re: Handling 204 Response with Body

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Fri, 2016-03-25 at 16:29 +0530, Senduran wrote:
> Hi all,
> 
> Some backend responses the '204 No content' status code with body (yes,
> clearly spec violation)
> In our targetHandler
> <https://svn.wso2.org/repos/wso2/carbon/platform/tags/turing-chunk08/dependencies/synapse/2.1.2-wso2v5/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java#L200>
> we check(isResponseHaveBodyExpected) for some status code (204, 205 and
> 304) and assumes those will not contain body and continue the rest. Once we
> find those status code we call resetInput()
> <http://grepcode.com/file/repo1.maven.org/maven2/org.apache.httpcomponents/httpcore-nio/4.2.3/org/apache/http/impl/nio/DefaultNHttpClientConnection.java?av=f#146>.(But
> it didn't clear the sessionInputBuffer)
> 
> Every thing works fine, unless such spec violation happens. Once the 204
> comes with a message body, the sessionInputBuffer is filled with the
> content. and no one will consume it. So when the 2nd response comes (using
> the same connection) it will use the same session input buffer and will get
> a corrupted data. (in this case we are getting protocol violation
> exception, since the 1st 204 response's body is prepended to the 2nd
> response's status line)
> 
> What would be best way to fix this
> 
> Thanks
> Senduran

Senduran,

I do not think there is a way to make the same transport work reliably
with 204 status messages that violate the spec and those that are spec
compliant. 

Standards exist for a reason.

Oleg


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org