Package: guile;
Reported by: Leo Nikkilä <hello <at> lnikki.la>
Date: Sun, 20 Aug 2023 09:17:02 UTC
Severity: normal
Tags: patch
View this message in rfc822 format
From: Leo Nikkilä <hello <at> lnikki.la> To: 65399 <at> debbugs.gnu.org Cc: Leo Nikkilä <hello <at> lnikki.la> Subject: bug#65399: [PATCH] web: Fix non-IPv4 default socket. Date: Sun, 20 Aug 2023 12:15:37 +0300
PF_INET sockets were being created by default with #:family AF_INET6 or AF_UNIX, resulting in In procedure bind: Address family not supported by protocol * module/web/server/http.scm (make-default-socket): Use #:family. * doc/ref/web.texi (Web Server): Fix quoting in documentation, bind to suitable address. * test-suite/tests/web-server.test: Test it. --- doc/ref/web.texi | 4 ++- module/web/server/http.scm | 2 +- test-suite/tests/web-server.test | 59 +++++++++++++++++++------------- 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/doc/ref/web.texi b/doc/ref/web.texi index 607c855b6..d76529456 100644 --- a/doc/ref/web.texi +++ b/doc/ref/web.texi @@ -1827,7 +1827,9 @@ implementation's open function. ;; On a different port (run-server handler 'http '(#:port 8081)) ;; IPv6 -(run-server handler 'http '(#:family AF_INET6 #:port 8081)) +(run-server handler 'http `(#:family ,AF_INET6 + #:addr ,IN6ADDR_LOOPBACK + #:port 8081)) ;; Custom socket (run-server handler 'http `(#:socket ,(sudo-make-me-a-socket))) @end example diff --git a/module/web/server/http.scm b/module/web/server/http.scm index 05bf46bf0..447282f4c 100644 --- a/module/web/server/http.scm +++ b/module/web/server/http.scm @@ -39,7 +39,7 @@ (define (make-default-socket family addr port) - (let ((sock (socket PF_INET SOCK_STREAM 0))) + (let ((sock (socket family SOCK_STREAM 0))) (setsockopt sock SOL_SOCKET SO_REUSEADDR 1) (bind sock family addr port) sock)) diff --git a/test-suite/tests/web-server.test b/test-suite/tests/web-server.test index d84c47d18..38e23e791 100644 --- a/test-suite/tests/web-server.test +++ b/test-suite/tests/web-server.test @@ -56,14 +56,42 @@ '((content-type . (application/octet-stream)))) (string->utf8 "forbidden"))))) -(define %port-number 8885) +(define %port-number4 8885) +(define %port-number6 8886) (define %server-base-uri "http://localhost:8885") (when (provided? 'threads) - ;; Run a local publishing server in a separate thread. + ;; Run local publishing servers (IPv4, IPv6) in separate threads. (call-with-new-thread (lambda () - (run-server handle-request 'http `(#:port ,%port-number))))) + (run-server handle-request 'http `(#:port ,%port-number4)))) + (call-with-new-thread + (lambda () + (run-server handle-request 'http `(#:family ,AF_INET6 + #:addr ,IN6ADDR_LOOPBACK + #:port ,%port-number6))))) + +(define (connect-to-server family addr port-number) + (let ((socket (socket family SOCK_STREAM 0))) + (let loop ((n 1)) + (define success? + (catch 'system-error + (lambda () + (format (current-error-port) + "connecting to the server, attempt #~a~%" n) + (connect socket family addr port-number) + (close-port socket) + #t) + (lambda args + (if (and (= ECONNREFUSED (system-error-errno args)) + (<= n 15)) + #f + (apply throw args))))) + + (or success? + (begin + (sleep 1) + (loop (+ n 1))))))) (define-syntax-rule (expect method path code args ...) (if (provided? 'threads) @@ -79,26 +107,11 @@ (pass-if "server is listening" ;; First, wait until the server is listening, up to a few seconds. (if (provided? 'threads) - (let ((socket (socket AF_INET SOCK_STREAM 0))) - (let loop ((n 1)) - (define success? - (catch 'system-error - (lambda () - (format (current-error-port) - "connecting to the server, attempt #~a~%" n) - (connect socket AF_INET INADDR_LOOPBACK %port-number) - (close-port socket) - #t) - (lambda args - (if (and (= ECONNREFUSED (system-error-errno args)) - (<= n 15)) - #f - (apply throw args))))) - - (or success? - (begin - (sleep 1) - (loop (+ n 1)))))) + (begin + (format (current-error-port) "connecting using IPv4...~%") + (connect-to-server AF_INET INADDR_LOOPBACK %port-number4) + (format (current-error-port) "connecting using IPv6...~%") + (connect-to-server AF_INET6 IN6ADDR_LOOPBACK %port-number6)) (throw 'unresolved))) (pass-if-equal "GET /" base-commit: c7632b8f974abc3bb654e116d62e4165c39490af -- 2.41.0
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.