From b41964772b160ca46e120970ed8878dcc8f9b05d Mon Sep 17 00:00:00 2001 From: Gerd Flaig Date: Sat, 20 Dec 2008 01:20:23 +0100 Subject: [PATCH] Handle connection refused and closed --- empire.lisp | 30 +++++++++++++++++++----------- web.lisp | 11 +++++++---- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/empire.lisp b/empire.lisp index 5d1b950..7ef68bf 100644 --- a/empire.lisp +++ b/empire.lisp @@ -125,6 +125,7 @@ this stream.") (defgeneric handle-data (base-mode message)) (defgeneric handle-init (base-mode message)) +(defgeneric handle-exit (base-mode message)) (defgeneric handle-prompt (base-mode message)) (defmethod handle-init ((m init-mode) message) @@ -136,6 +137,10 @@ this stream.") (setf play-sent-p t)) (set-new-mode m 'play-mode)))) +(defmethod handle-exit ((m play-mode) message) + (declare (ignorable message)) + (quit (connection m))) + (defmethod handle-data ((m play-mode) message) (let* ((c (connection m)) (log (logging-stream c))) @@ -154,6 +159,7 @@ this stream.") (defparameter *line-type-dispatch* (list `(,+C_DATA+ . handle-data) `(,+C_INIT+ . handle-init) + `(,+C_EXIT+ . handle-exit) `(,+C_PROMPT+ . handle-prompt))) (defun parse-server-line (line) @@ -180,17 +186,19 @@ this stream.") (format stream "No handler for ~a in mode ~a." type mode))))) (defmethod read-message ((c connection)) - (let* ((s (network-stream c)) - (log (logging-stream c)) - (line (read-line s))) - (format log "< ~a~%" line) - (multiple-value-bind (message type) (parse-server-line line) - (let ((handler (lookup-handler type)) - (mode (connection-mode c))) - (if handler - (funcall handler mode message) - (error 'no-handler :mode mode :type type)))) - line)) + (handler-case + (let* ((s (network-stream c)) + (log (logging-stream c)) + (line (read-line s))) + (format log "< ~a~%" line) + (multiple-value-bind (message type) (parse-server-line line) + (let ((handler (lookup-handler type)) + (mode (connection-mode c))) + (if handler + (funcall handler mode message) + (error 'no-handler :mode mode :type type)))) + line) + (sb-int:closed-stream-error () nil))) (defmethod send-message ((c connection) message) (let ((s (network-stream c)) diff --git a/web.lisp b/web.lisp index 0f6a0c8..5c186c9 100644 --- a/web.lisp +++ b/web.lisp @@ -55,10 +55,13 @@ ;; destination of login-form (defun login-action () - (let ((connection (empire:connect :user (post-parameter "username") - :password (post-parameter "password")))) - (setf (session-value 'connection) connection) - (redirect +root-url+))) + (handler-case + (let ((connection (empire:connect :user (post-parameter "username") + :password (post-parameter "password")))) + (setf (session-value 'connection) connection) + (redirect +root-url+)) + (usocket:connection-refused-error (e) + (format nil "Connection error: ~a~%" e)))) (defun command-action () (let ((connection (session-value 'connection))) -- 2.43.0