Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

unified closing handshake for client and server. #46

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions src/ws/base.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
(:import-from :fast-websocket
#:make-ws
#:ws-stage
#:make-parser)
#:make-parser
#:error-code)
(:import-from :event-emitter
#:emit
#:event-emitter)
Expand Down Expand Up @@ -73,13 +74,17 @@
(parse-lock :initform (make-recursive-lock)
:reader parse-lock)))

(defun send-close-frame (ws reason code)
(defun respond-to-close-frame (ws reason code)
(setf (ready-state ws) :closing)
(send ws reason :type :close :code code
:callback
(lambda ()
(close-connection ws reason code))))

(defun initiate-close-frame (ws reason code)
(setf (ready-state ws) :closing)
(send ws reason :type :close :code code))

(defmethod initialize-instance :after ((ws ws) &key)
(setf (parser ws)
(make-parser (ws-parse ws)
Expand All @@ -102,15 +107,15 @@
(case (ready-state ws)
;; closing request by the other peer
(:open
(send-close-frame ws data code))
(respond-to-close-frame ws data code))
;; probably the response for a 'close' frame
(otherwise
(close-connection ws data code)))
(setf (ws-stage (ws-parse ws)) 0))
:error-callback
(lambda (code reason)
(emit :error ws reason)
(send-close-frame ws reason code)
(respond-to-close-frame ws reason code)
(setf (ws-stage (ws-parse ws)) 0)))))

(defgeneric ready-state (ws)
Expand Down Expand Up @@ -170,7 +175,7 @@

(defgeneric close-connection (ws &optional reason code))

(defmethod close-connection :around ((ws ws) &optional reason code)
(defmethod close-connection :around ((ws ws) &optional (reason "") (code (error-code :normal-closure)))
(case (ready-state ws)
(:connecting
(setf (ready-state ws) :closed)
Expand All @@ -180,7 +185,8 @@
(call-next-method)
(emit :close ws :code code :reason reason))
(:open
(call-next-method))
(initiate-close-frame ws reason code)
t)
(:closing
(emit :close ws :code code :reason reason))
(otherwise nil)))
Expand Down
1 change: 0 additions & 1 deletion src/ws/client.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -270,5 +270,4 @@
(unless (eq (bt:current-thread) thread)
(bt:destroy-thread thread))
(setf (slot-value client 'read-thread) nil)))
(emit :close client :code code :reason reason)
t)
14 changes: 4 additions & 10 deletions src/ws/server.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
#:websocket-driver.ws.base
#:websocket-driver.util)
(:import-from :fast-websocket
#:compose-frame
#:error-code)
#:compose-frame)
(:import-from :clack.socket
#:read-callback
#:write-sequence-to-socket
Expand Down Expand Up @@ -85,14 +84,9 @@
(close-connection server)
(setf (ready-state server) :closed)))))

(defmethod close-connection ((server server) &optional (reason "") (code (error-code :normal-closure)))
(setf (ready-state server) :closing)
(send server reason :type :close :code code
:callback
(let ((socket (socket server)))
(lambda ()
(setf (ready-state server) :closed)
(close-socket socket))))
(defmethod close-connection ((server server) &optional reason code)
(setf (ready-state server) :closed)
(close-socket (socket server))
t)

(defmethod send ((server server) data &key start end type code callback)
Expand Down