Christopher Baines writes: > For years now I've been trying to work out how to do reliable HTTPS > networking with Guile, where reliable just means that it can't hang > indefinitely. > > After a few wrong turns, I believe the way to do this is use > non-blocking ports as that combined with suspendable ports in Guile > allows you to provide current-read-waiter/current-write-waiter > procedures that will timeout at some point. > > I think the final hurdle is to get tls-wrap in (web client) to support > Asynchronous operation with GnuTLS [1] and I think there are only a > couple of things missing. make-session needs passing > connection-flag/nonblock and error/again plus error/interrupted > exceptions need handling for the handshake using the information from > record-get-direction about whether Guile should wait to write or read. > > 1: https://gnutls.org/manual/html_node/Asynchronous-operation.html > > I think I forgot to move things forward after guile-gnutls 4.0.0 > released with record-get-direction, so I'm opening this bug to try and > keep track of things. I've now sent a couple of patches. The first is a re-send of [2], but with some docstring improvements. I can't find any reference in the Guile docs at least to the bitwise or'ing of options with the socket style, so while it seems to work, I'm a bit unsure about that. 2: https://lists.gnu.org/archive/html/guile-devel/2023-07/msg00025.html The second patch makes the changes inside of tls-wrap. There's also this patch [3] here to make get-bytevector-all non-blocking, and that's relevant here as it's used in read-response-body. 3: https://lists.gnu.org/archive/html/guile-devel/2023-07/msg00023.html