diff --git a/websocket/_app.py b/websocket/_app.py index d7e6d60..274fad6 100644 --- a/websocket/_app.py +++ b/websocket/_app.py @@ -131,6 +131,7 @@ class WebSocketApp(object): if self.sock: raise WebSocketException("socket is already opened") thread = None + break_on_close_op = False try: self.sock = WebSocket(self.get_mask_key, sockopt=sockopt, sslopt=sslopt, @@ -157,6 +158,7 @@ class WebSocketApp(object): if r: op_code, frame = self.sock.recv_data_frame(True) if op_code == ABNF.OPCODE_CLOSE: + break_on_close_op = True break elif op_code == ABNF.OPCODE_PING: self._callback(self.on_ping, frame.data) @@ -177,9 +179,22 @@ class WebSocketApp(object): thread.join() self.keep_running = False self.sock.close() - self._callback(self.on_close) + self._callback(self.on_close,*self._get_close_args(frame.data if break_on_close_op else None)) self.sock = None + def _get_close_args(self,data): + """ this functions extracts the code, reason from the close body + if they exists, and if the self.on_close except three arguments """ + import inspect + # if the on_close callback is "old", just return empty list + if not self.on_close or len(inspect.getargspec(self.on_close).args) != 3: + return [] + if data and len(data) >=2: + code = 256*six.byte2int(data[0]) + six.byte2int(data[1]) + reason = data[2:].decode('utf-8') + return [code,reason] + return [None,None] + def _callback(self, callback, *args): if callback: try: