Saturday, March 29, 2008

URLConnection is silently retrying POST request

Recently, I was debugging an issue with a webservice that takes long time to respond. I noticed that the client was using the URLconnection object and it was automatically retrying the connection if the server abruptly terminated the connection. I was not expecting the client to reconnect to the server as I did not find any client side code to retry the connection. After googling for similar symptoms I found a known bug (ID 6382788) with the URLConnection object. Below is the explanation of the bug and the work around suggested by sun.

Non-idempotent http POST requests are being automatically resent to the server if theserver does not respond with a valid http response or an IOException occurs. This isincorrect according to the rfc. Only idempotent requests are supposed to beautomatically resent.

As this has been the behavior of Sun's http client forever, some users may be relyingon this behavior without even knowing it. So the solution is to allow this behaviorto be configured through a system property, sun.net.http.retryPost.

sun.net.http.retryPost determines if the an unsuccessful http POST request will beautomatically resent to the server. Unsuccessful in this case means the server didnot send a valid http response or an IOException occurred. The default value is trueto maintain backward compatibility.

By the way the connection was reset because of a firewall that was terminating the connection as it was taking longer than the defined idle timeout.