aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2023-06-30 19:11:45 +0100
committerChristopher Baines <mail@cbaines.net>2023-06-30 19:11:45 +0100
commit836812dbff93f3c670903720d04129be60873e22 (patch)
treea83cc05bcb4ff0428fed5ec8775ae77fc9fbf614
parent159e2164f376b0ed582534a0880f4ae90fcdb896 (diff)
downloadnar-herder-836812dbff93f3c670903720d04129be60873e22.tar
nar-herder-836812dbff93f3c670903720d04129be60873e22.tar.gz
Add some more network connection timeout helpers
-rw-r--r--nar-herder/utils.scm39
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)))