I was able to spend some time on this again. I attached two patches to this email:
The first patch is a cleaned up version of my previous patch. I think I addressed all feedback on the previous version in that patch (e.g. removed windows code, fixed formatting). The second patch is a new one, it implements honouring of the connect_timeout connection option in PQcancel. This patch requires the first patch to also be applied, but since it seemed fairly separate and the code is not trivial I didn't want the first patch to be blocked on this. Finally, I would love it if once these fixes are merged the would also be backpatched to previous versions of libpq. Does that seem possible? As far as I can tell it would be fine, since it doesn't really change any of the public APIs. The only change is that the pg_cancel struct now has a few additional fields. But since that struct is defined in libpq-int.h, so that struct should not be used by users of libpq directly, right?.
0001-Use-timeout-socket-options-for-cancel-connections.patch
Description: 0001-Use-timeout-socket-options-for-cancel-connections.patch
0002-Honor-connect_timeout-when-connecting-with-PQcancel.patch
Description: 0002-Honor-connect_timeout-when-connecting-with-PQcancel.patch