I noticed the wininet callbacks don't respond quite the same as windows does. Primarily the async calls complete almost immediately while on windows they don't respond at all until an alertable function is called (eg. SleepEx).
Looking through the wininet code, I noticed we are using worker threads for async transfers rather then async procedure calls via QueueUserAPC, which is how windows does it AFAICT. Is there a reason for this? Would it be a problem if the implementation was changed to use APC?
IMHO this would reduce some overhead as we would not be creating extra worker threads when not really needed, the callbacks would respond more similar to how they respond under windows, and may significantly simplify the code.
If there are no arguments against this, I would like to work on it.