예제 #1
0
 def __on_error(self, error):
     '''Called on fatal websocket errors. We exit on these.'''
     if not self.exited:
         self.logger.error("Error : %s" % error)
         raise websocket.WebSocketException(error)
예제 #2
0
 def __on_close(self):
     '''Called on websocket close.'''
     # self.emit('close', [])
     self.logger.info('Websocket Closed')
     raise websocket.WebSocketException('Websocket Closed')
예제 #3
0
def on_error(e):
    print('$')
    logging.warn(e)
    raise websocket.WebSocketException(e)
예제 #4
0
    def receive(self):
        """
        Receive x bytes from the websocket.

        :rtype: bytes
        """

        while True:
            try:
                _LOGGER.debug("websocket: rx")
                data = self.ws.recv()
                _LOGGER.debug("websocket: rxed")
                if type(data) == str:
                    return str.encode(data)
                return data
            except websocket.WebSocketConnectionClosedException:
                _LOGGER.error("websocket: connection closed!")
                self.connected = False
                raise exception.ConnectionClosedException()
            except socket.error as e:
                time.sleep(5)
                _LOGGER.error("websocket: reconnecting! not really...")
                raise exception.ConnectionClosedException()
#                self.attempt_connection()
#                continoue

        try:
            frame = self.ws.recv_frame()
        except websocket.WebSocketException:
            _LOGGER.error("websocket.WebSocketException")
            raise exception.ConnectionClosedException()
#            raise
#            return websocket.ABNF.OPCODE_CLOSE, None
        if not frame:
            _LOGGER.error(
                "websocket.WebSocketException, not a valid frame: %s" % frame)
            raise websocket.WebSocketException(
                "websocket: Not a valid frame: %s" % frame)
        elif frame.opcode in OPCODE_DATA:
            _LOGGER.error("websocket got OPCODE_DATA")
            if type(frame.data) == str:
                return str.encode(frame.data)
            return frame.data
#            return str(frame.data)
        elif frame.opcode in OPCODE_TEXT:
            _LOGGER.error("websocket got OPCODE_TEXT")
            if type(frame.data) == str:
                return str.encode(frame.data)
            return frame.data
#            return str(frame.data, "utf-8")
        elif frame.opcode == websocket.ABNF.OPCODE_CLOSE:
            _LOGGER.error("websocket got OPCODE_CLOSE")
            self.ws.send_close()
            raise exception.ConnectFailedException()
#            return None
        elif frame.opcode == websocket.ABNF.OPCODE_PING:
            _LOGGER.error("websocket got OPCODE_PING")
            self.ws.pong(frame.data)
            return None

        if type(frame.data) == str:
            return str.encode(frame.data)
        return frame.data
예제 #5
0
 def _on_error(self, error):
     if not self.exited:
         logging.error(f'Error during websocket listening {error}')
         raise websocket.WebSocketException(error)
    def run_forever(self,
                    sockopt=None,
                    sslopt=None,
                    ping_interval=0,
                    ping_timeout=None,
                    http_proxy_host=None,
                    http_proxy_port=None,
                    http_no_proxy=None,
                    http_proxy_auth=None,
                    skip_utf8_validation=False,
                    host=None,
                    origin=None):
        """
        Patched version which handles more exceptions compared to original
        """

        if not ping_timeout or ping_timeout <= 0:
            ping_timeout = None
        if sockopt is None:
            sockopt = []
        if sslopt is None:
            sslopt = {}
        if self.sock:
            raise websocket.WebSocketException("socket is already opened")
        thread = None
        close_frame = None

        try:
            self.sock = websocket.WebSocket(
                self.get_mask_key,
                sockopt=sockopt,
                sslopt=sslopt,
                fire_cont_frame=self.on_cont_message and True or False,
                skip_utf8_validation=skip_utf8_validation)
            self.sock.settimeout(websocket.getdefaulttimeout())
            self.sock.connect(self.url,
                              header=self.header,
                              cookie=self.cookie,
                              http_proxy_host=http_proxy_host,
                              http_proxy_port=http_proxy_port,
                              http_no_proxy=http_no_proxy,
                              http_proxy_auth=http_proxy_auth,
                              subprotocols=self.subprotocols,
                              host=host,
                              origin=origin)
            self._callback(self.on_open)

            if ping_interval:
                event = threading.Event()
                thread = threading.Thread(target=self._send_ping,
                                          args=(ping_interval, event))
                thread.setDaemon(True)
                thread.start()

            while self.sock.connected:
                r, w, e = select.select((self.sock.sock, ), (), (),
                                        ping_timeout)
                if not self.keep_running:
                    break
                if ping_timeout and self.last_ping_tm and time.time(
                ) - self.last_ping_tm > ping_timeout:
                    self.last_ping_tm = 0
                    raise websocket.WebSocketTimeoutException("ping timed out")

                if r:
                    op_code, frame = self.sock.recv_data_frame(True)
                    if op_code == websocket.ABNF.OPCODE_CLOSE:
                        close_frame = frame
                        break
                    elif op_code == websocket.ABNF.OPCODE_PING:
                        self._callback(self.on_ping, frame.data)
                    elif op_code == websocket.ABNF.OPCODE_PONG:
                        self._callback(self.on_pong, frame.data)
                    elif op_code == websocket.ABNF.OPCODE_CONT and self.on_cont_message:
                        self._callback(self.on_data, data, frame.opcode,
                                       frame.fin)
                        self._callback(self.on_cont_message, frame.data,
                                       frame.fin)
                    else:
                        data = frame.data
                        if six.PY3 and frame.opcode == websocket.ABNF.OPCODE_TEXT:
                            data = data.decode("utf-8")
                        self._callback(self.on_data, data, frame.opcode, True)
                        self._callback(self.on_message, data)
        except (Exception, KeyboardInterrupt, SystemExit) as e:
            self._callback(self.on_error, e)
            if isinstance(e, SystemExit):
                # propagate SystemExit further
                raise
        finally:
            if thread:
                event.set()
                thread.join()
                self.keep_running = False
            self.sock.close()
            self._callback(
                self.on_close,
                *self._get_close_args(
                    close_frame.data if close_frame else None))
            self.sock = None
예제 #7
0
 def __on_error(self, ws, error):
     """Called on fatal websocket errors. We exit on these."""
     if not self.exited:
         logger.error("Error : %s" % error)
         raise websocket.WebSocketException(error)