How can a synchronous WinHttp request be cancelled?

2.7k Views Asked by At

My service has a thread that may potentially be executing a WinHttpSendRequest when someone tries to stop my service.

The WinHttpCloseHandle documentation says:

An application can terminate an in-progress synchronous or asynchronous request by closing the HINTERNET request handle using WinHttpCloseHandle

But, then later on the same documentation seems to contradict this. It says:

An application should never WinHttpCloseHandle call on a synchronous request. This can create a race condition.

I've found this blog post that seems to agree I can't call WinHttpCloseHandle.

I'm wondering how can I cancel this operation so that my service can be stopped gracefully? I can't really wait for the WinHttpSendRequest to timeout naturally because it takes too long and my service doesn't stop quickly enough. I think windows reports this as an error and then forcefully kills the service in a shutdown.

An ideas would be appreciated.

1

There are 1 best solutions below

0
On BEST ANSWER

Calling WinHttpCloseHandle off a background thread to force handle close is perhaps not the best solution. Still it works, and the original caller would receive something like "bad handle" error code and the request would be forcefully terminated.

It would be possibly unsafe to abuse this power, and one would rather implement async requests instead. However, in case of shutting down stale service it is going to work fine.