def _listen(self): """(internal) Busy loop to listen for events. This method is called in a thread by the `listen` method, and will be the one actually listening for messages on the server's sockets, and calling the callbacks when messages are received. """ match = self._match_address advanced_matching = self.advanced_matching addresses = self.addresses stats = self.stats_received while True: drop_late = self.drop_late_bundles if not self.sockets: sleep(.01) continue else: try: read, write, error = select(self.sockets, [], [], self.timeout) except (ValueError, socket.error): continue for sender_socket in read: data, sender = sender_socket.recvfrom(65535) for address, tags, values, offset in read_packet( data, drop_late=drop_late, encoding=self.encoding, encoding_errors=self.encoding_errors): stats.calls += 1 stats.bytes += offset stats.params += len(values) stats.types.update(tags) matched = False if advanced_matching: for sock, addr in addresses: if sock == sender_socket and match(addr, address): matched = True for cb, get_address in addresses[(sock, addr)]: if get_address: cb(address, *values) else: cb(*values) else: if (sender_socket, address) in addresses: matched = True for cb, get_address in addresses.get( (sender_socket, address), []): if get_address: cb(address, *values) else: cb(*values) if not matched and self.default_handler: self.default_handler(address, *values)
def _listen(self): """(internal) Busy loop to listen for events. This method is called in a thread by the `listen` method, and will be the one actually listening for messages on the server's sockets, and calling the callbacks when messages are received. """ match = self._match_address advanced_matching = self.advanced_matching addresses = self.addresses stats = self.stats_received def _execute_callbacks(_callbacks_list): for cb, get_address in _callbacks_list: try: if get_address: cb(address, *values) else: cb(*values) except Exception as exc: if self.intercept_errors: logger.error( "Unhandled exception caught in oscpy server", exc_info=True) else: raise while self._must_loop: drop_late = self.drop_late_bundles if not self.sockets: sleep(.01) continue else: try: read, write, error = select(self.sockets, [], [], self.timeout) except (ValueError, socket.error): continue for sender_socket in read: try: data, sender = sender_socket.recvfrom(65535) except ConnectionResetError: continue for address, tags, values, offset in read_packet( data, drop_late=drop_late, encoding=self.encoding, encoding_errors=self.encoding_errors): stats.calls += 1 stats.bytes += offset stats.params += len(values) stats.types.update(tags) matched = False if advanced_matching: for sock, addr in addresses: if sock == sender_socket and match(addr, address): callbacks_list = addresses.get((sock, addr), []) if callbacks_list: matched = True _execute_callbacks(callbacks_list) else: callbacks_list = addresses.get( (sender_socket, address), []) if callbacks_list: matched = True _execute_callbacks(callbacks_list) if not matched and self.default_handler: self.default_handler(address, *values)
def test_read_packet(): with raises(ValueError): read_packet(struct.pack('>%is' % len('test'), b'test'))