Skip to content

Commit 7f21ca7

Browse files
authored
Merge pull request #182 from fukamachi/reconnect-on-eintr
Retry INTR error only once while "connect".
2 parents d2717a4 + 43ace47 commit 7f21ca7

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

src/backend/usocket.lisp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,24 @@
399399
(defmethod open-stream-p ((u usocket-wrapped-stream))
400400
(open-stream-p (usocket-wrapped-stream-stream u)))
401401

402+
(defun socket-connect/retry (uri &key timeout)
403+
(declare (ignorable timeout))
404+
(let ((retried nil))
405+
(tagbody
406+
retry
407+
(handler-bind (#+sbcl
408+
(sb-bsd-sockets:interrupted-error
409+
(lambda (e)
410+
(declare (ignore e))
411+
(unless retried
412+
(setf retried t)
413+
(go retry)))))
414+
(return-from socket-connect/retry
415+
(usocket:socket-connect (uri-host uri)
416+
(uri-port uri)
417+
#-(or ecl clasp clisp allegro) :timeout #-(or ecl clasp clisp allegro) timeout
418+
:element-type '(unsigned-byte 8)))))))
419+
402420
(defun-careful request (uri &rest args
403421
&key (method :get) (version 1.1)
404422
content headers
@@ -427,10 +445,7 @@
427445
(labels ((make-new-connection (uri)
428446
(restart-case
429447
(let* ((con-uri (quri:uri (or proxy uri)))
430-
(connection (usocket:socket-connect (uri-host con-uri)
431-
(uri-port con-uri)
432-
#-(or ecl clasp clisp allegro) :timeout #-(or ecl clasp clisp allegro) connect-timeout
433-
:element-type '(unsigned-byte 8)))
448+
(connection (socket-connect/retry con-uri :timeout connect-timeout))
434449
(stream
435450
(usocket:socket-stream connection))
436451
(scheme (uri-scheme uri)))

0 commit comments

Comments
 (0)