You are viewing a plain text version of this content. The canonical link for it is here.
Posted to httpclient-users@hc.apache.org by Michael Osipov <mi...@apache.org> on 2019/10/22 14:17:46 UTC

Advise on HttpEntity#isRepeatable()

Folks,

I am currently working on WAGON-568 and would like better understand how 
HttpEntity#isReproducible() should be properly handled.

In AbstractHttpClientWagon#put() [1] on specific status codes the 
request (PUT) is retried manually with the same HttpEntity [2]
without:

* consuming the given response entity,
* calling fireTransferError() (Wagon internal),
* knowing that the entity is repeatable

This may apply if expect/continue did not work properly.

 From what I understand, this approach is broken. I have either to fix 
the above or employ a modified version of DefaultRedirectStrategy.

Is my understanding correct?

Anyway, I have always signal an exception when a already consumed 
request body cannot be replayed?!

Michael

[1] 
https://github.com/apache/maven-wagon/blob/master/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java#L674
[2] 
https://github.com/apache/maven-wagon/blob/master/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java#L739-L743

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


Re: Advise on HttpEntity#isRepeatable()

Posted by Michael Osipov <mi...@apache.org>.
Am 2019-10-23 um 09:28 schrieb Oleg Kalnichevski:
> On Tue, 2019-10-22 at 16:17 +0200, Michael Osipov wrote:
>> Folks,
>>
>> I am currently working on WAGON-568 and would like better understand
>> how
>> HttpEntity#isReproducible() should be properly handled.
>>
>> In AbstractHttpClientWagon#put() [1] on specific status codes the
>> request (PUT) is retried manually with the same HttpEntity [2]
>> without:
>>
>> * consuming the given response entity,
>> * calling fireTransferError() (Wagon internal),
>> * knowing that the entity is repeatable
>>
>> This may apply if expect/continue did not work properly.
>>
>>   From what I understand, this approach is broken. I have either to
>> fix
>> the above or employ a modified version of DefaultRedirectStrategy.
>>
>> Is my understanding correct?
>>
> 
> Hi Michael
> 
> No, I do not think your current approach is wrong. The contract of
> HttpEntity is such that if HttpEntity#isRepeatable returns true the
> HttpEntity#writeTo method is expected to produce the same entity
> representation upon each invocation. HttpClient should be able to
> automatically re-try the request without any intervention as long as
> the HttpEntity contract is correctly implemented.
> 
>> Anyway, I have always signal an exception when a already consumed
>> request body cannot be replayed?!
>>
> 
> HttpClient automatically throws NonRepeatableRequestException if a
> method re-execution is impossible due to the closed entity being non-
> repeatable. I do not think Wagon needs to provide any additional
> handling logic unless there are some Wagon specific requirements I am
> not aware of.


Thanks, so basically there is a conceptional bug in Wagon. I would 
rather replace the custom redirect logic with the interfaces provided 
with Wagon. I need to see wether it is compatible with the 
ProgressListener not to have bytes counted multiple times. Likely this 
should work because all intermediate response is internally consumed.

Michael

>> Michael
>>
>> [1]
>>
> https://github.com/apache/maven-wagon/blob/master/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java#L674
>> [2]
>>
> https://github.com/apache/maven-wagon/blob/master/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java#L739-L743
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
>> For additional commands, e-mail: httpclient-users-help@hc.apache.org
>>
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
> For additional commands, e-mail: httpclient-users-help@hc.apache.org
> 
> 


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


Re: Advise on HttpEntity#isRepeatable()

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Tue, 2019-10-22 at 16:17 +0200, Michael Osipov wrote:
> Folks,
> 
> I am currently working on WAGON-568 and would like better understand
> how 
> HttpEntity#isReproducible() should be properly handled.
> 
> In AbstractHttpClientWagon#put() [1] on specific status codes the 
> request (PUT) is retried manually with the same HttpEntity [2]
> without:
> 
> * consuming the given response entity,
> * calling fireTransferError() (Wagon internal),
> * knowing that the entity is repeatable
> 
> This may apply if expect/continue did not work properly.
> 
>  From what I understand, this approach is broken. I have either to
> fix 
> the above or employ a modified version of DefaultRedirectStrategy.
> 
> Is my understanding correct?
> 

Hi Michael

No, I do not think your current approach is wrong. The contract of
HttpEntity is such that if HttpEntity#isRepeatable returns true the
HttpEntity#writeTo method is expected to produce the same entity
representation upon each invocation. HttpClient should be able to
automatically re-try the request without any intervention as long as
the HttpEntity contract is correctly implemented.

> Anyway, I have always signal an exception when a already consumed 
> request body cannot be replayed?!
> 

HttpClient automatically throws NonRepeatableRequestException if a
method re-execution is impossible due to the closed entity being non-
repeatable. I do not think Wagon needs to provide any additional
handling logic unless there are some Wagon specific requirements I am
not aware of. 

Hope this helps.

Oleg

> Michael
> 
> [1] 
> 
https://github.com/apache/maven-wagon/blob/master/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java#L674
> [2] 
> 
https://github.com/apache/maven-wagon/blob/master/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java#L739-L743
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
> For additional commands, e-mail: httpclient-users-help@hc.apache.org
> 


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