diff --git a/src/judas_server/backend/backend_server.py b/src/judas_server/backend/backend_server.py index babb523..7311cfa 100644 --- a/src/judas_server/backend/backend_server.py +++ b/src/judas_server/backend/backend_server.py @@ -164,71 +164,67 @@ class BackendServer: try: if mask & selectors.EVENT_READ: self._receive_inbound(sock, client) - if client.inbound: - if client.mac_id is None: - # expect HELLO message - try: - msg = Message.from_bytes(client.inbound) - if ( - msg.category == Category.CONTROL - and msg.action == ControlAction.HELLO - and msg.payload.get("mac") is not None - ): - client.mac_id = msg.payload["mac"] - if ( - client.mac_id in self.clients - and self.clients[client.mac_id].status - == "connected" - ): - old_client: Client = self.clients[ - client.mac_id - ] - self.logger.warning( - f"Client {client.mac_id} is already connected from {old_client.addr}, disconnecting old client..." - ) - self._disconnect(old_client) - # TODO: tell client not to reconnect - self.clients[client.mac_id] = client - self.logger.info( - f"[+] Registered new client {client}" - ) - else: - self.logger.error( - f"Expected HELLO message from {client}, got {msg}" - ) - self._disconnect(client) - return - except Exception as e: - self.logger.error( - f"Failed to parse HELLO message from {client}: {e}" - ) - self._disconnect(client) - return - - while b"\n" in client.inbound: - line, client.inbound = client.inbound.split(b"\n", 1) - self.logger.debug( - f"[<] Complete message from {client}: {line!r}" - ) - try: - msg = Message.from_bytes(line) - self.logger.info(f"[.] Parsed message {msg.id}") - if msg.ack_required: - self._send_ack(client, target_id=msg.id) - - except Exception as e: - self.logger.error( - f"Failed to parse message from {client}: {e}" - ) - self._disconnect(client) - return - - else: + if not client.inbound: self._disconnect(client) + return - if mask & selectors.EVENT_WRITE: - if client.outbound: - self._send_outbound(sock, client) + if client.mac_id is None: + # expect HELLO message + try: + msg = Message.from_bytes(client.inbound) + except Exception as e: + self.logger.error( + f"Failed to parse HELLO message from {client}: {e}" + ) + self._disconnect(client) + return + + if ( + msg.category == Category.CONTROL + and msg.action == ControlAction.HELLO + and msg.payload.get("mac") is not None + ): + client.mac_id = msg.payload["mac"] + if ( + client.mac_id in self.clients + and self.clients[client.mac_id].status + == "connected" + ): + old_client: Client = self.clients[client.mac_id] + self.logger.warning( + f"Client {client.mac_id} is already connected from {old_client.addr}, disconnecting old client..." + ) + self.send_close(old_client) + # self._disconnect(old_client) + # TODO: tell client not to reconnect + self.clients[client.mac_id] = client + self.logger.info(f"[+] Registered new client {client}") + else: + self.logger.error( + f"Expected HELLO message from {client}, got {msg}" + ) + self._disconnect(client) + return + + while b"\n" in client.inbound: + line, client.inbound = client.inbound.split(b"\n", 1) + self.logger.debug( + f"[<] Complete message from {client}: {line!r}" + ) + try: + msg = Message.from_bytes(line) + self.logger.info(f"[.] Parsed message {msg.id}") + if msg.ack_required: + self.send_ack(client, target_id=msg.id) + except Exception as e: + self.logger.error( + f"Failed to parse message from {client}: {e}" + ) + self._disconnect(client) + return + + if mask & selectors.EVENT_WRITE and client.outbound: + self._send_outbound(sock, client) except ConnectionResetError as e: self.logger.error(f"Connection reset by {client}, disconnect: {e}")