TCP connection hanging in CLOSE_WAIT when using Invoke-RestMethod with PUT or DELETE


While creating my Powershell framework for Isilon I’m quite confident that I found a bug in Powershell. The affected cmdlet is “Invoke-RestMethod” and the bug is still valid for version 3 and 4.
I also reported the bug on Microsoft Connect and it was reproduced by at least 2 independent people.
If you found this post because you are also facing this issue or if you are willing to reproduce the bug, please go to Microsoft Connect and vote the bug as important to be resolved!

Bug description:

When issuing more than two Invoke-RestMethod commands with the PUT or DELETE method against the same server, the third one fails with error: “Invoke-RestMethod : The operation has timed out.” Only after closing the powershell and reopening will allow a new Invoke-RestMethod command run successfully.This behavior was tested with two different servers, offering a REST API. GET and POST methods are not affected.Using “netstat -an” you will see for the server communicating with, two active connections with state CLOSE_WAIT. On the server side you will see FIN_WAIT_2.
Investigating the tcp communication with wireshark, I can see that the client receives the “ACK,FIN” but is probably not issuing a close() as there is no “ACK,FIN” send as a response by the client to the server.
If using Fiddler in between you will not encounter the timeout but see in netstat for each Invoke-RestMethod command run, a CLOSE_WAIT. In the http standard only two connections are allowed to the same server. Fiddler is modifying this to allow unlimited http connections to the same server.

When closing the powershell a “RST” is send to the server, discarding the tcp session in CLOSE_WAIT state.

Workaround:

Using Invoke-WebRequest instead of Invoke-RestMethod does work:

(Invoke-WebRequest -Uri $uri -Method DELETE -Headers $headers).content | ConvertFrom-Json

Leave a comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

One thought on “TCP connection hanging in CLOSE_WAIT when using Invoke-RestMethod with PUT or DELETE

  • vignesh

    I faced the same problem and your solution did help. But your link to the bug is not valid anymore so I couldn’t vote it up.