diff options
author | Christopher Baines <mail@cbaines.net> | 2023-06-30 19:11:45 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2023-06-30 19:11:45 +0100 |
commit | 836812dbff93f3c670903720d04129be60873e22 (patch) | |
tree | a83cc05bcb4ff0428fed5ec8775ae77fc9fbf614 | |
parent | 159e2164f376b0ed582534a0880f4ae90fcdb896 (diff) | |
download | nar-herder-836812dbff93f3c670903720d04129be60873e22.tar nar-herder-836812dbff93f3c670903720d04129be60873e22.tar.gz |
Add some more network connection timeout helpers
-rw-r--r-- | nar-herder/utils.scm | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/nar-herder/utils.scm b/nar-herder/utils.scm index 2247231..4468ebb 100644 --- a/nar-herder/utils.scm +++ b/nar-herder/utils.scm @@ -54,7 +54,9 @@ check-locale! - with-port-timeouts)) + with-port-timeouts + set-socket-timeout + open-socket-for-uri*)) (define* (retry-on-error f #:key times delay ignore) (let loop ((attempt 1)) @@ -593,3 +595,38 @@ If already in the worker thread, call PROC immediately." (lambda (port) (wait port "w")))) (thunk))) + +(define* (set-socket-timeout port #:key (seconds 120)) + (when (defined? 'SO_RCVTIMEO) + ;; This is only supported on Guile 3.0.9 and later + (setsockopt port SOL_SOCKET SO_RCVTIMEO `(,seconds . 0)) + (setsockopt port SOL_SOCKET SO_SNDTIMEO `(,seconds . 0)))) + +;; Returns the port as well as the raw socket +(define* (open-socket-for-uri* uri + #:key (verify-certificate? #t)) + (define tls-wrap + (@@ (web client) tls-wrap)) + + (define https? + (eq? 'https (uri-scheme uri))) + + (define plain-uri + (if https? + (build-uri + 'http + #:userinfo (uri-userinfo uri) + #:host (uri-host uri) + #:port (or (uri-port uri) 443) + #:path (uri-path uri) + #:query (uri-query uri) + #:fragment (uri-fragment uri)) + uri)) + + (let ((s (open-socket-for-uri plain-uri))) + (values + (if https? + (tls-wrap s (uri-host uri) + #:verify-certificate? verify-certificate?) + s) + s))) |