import json import logging import struct from judge.bridge.base_handler import Disconnect, ZlibPacketHandler logger = logging.getLogger("judge.bridge") size_pack = struct.Struct("!I") class DjangoHandler(ZlibPacketHandler): def __init__(self, request, client_address, server, judges): super().__init__(request, client_address, server) self.handlers = { "submission-request": self.on_submission, "terminate-submission": self.on_termination, "disconnect-judge": self.on_disconnect_request, } self.judges = judges def send(self, data): super().send(json.dumps(data, separators=(",", ":"))) def on_packet(self, packet): packet = json.loads(packet) try: result = self.handlers.get(packet.get("name", None), self.on_malformed)( packet ) except Exception: logger.exception("Error in packet handling (Django-facing)") result = {"name": "bad-request"} self.send(result) raise Disconnect() def on_submission(self, data): id = data["submission-id"] problem = data["problem-id"] language = data["language"] source = data["source"] judge_id = data["judge-id"] priority = data["priority"] if not self.judges.check_priority(priority): return {"name": "bad-request"} self.judges.judge(id, problem, language, source, judge_id, priority) return {"name": "submission-received", "submission-id": id} def on_termination(self, data): return { "name": "submission-received", "judge-aborted": self.judges.abort(data["submission-id"]), } def on_disconnect_request(self, data): judge_id = data["judge-id"] force = data["force"] self.judges.disconnect(judge_id, force=force) def on_malformed(self, packet): logger.error("Malformed packet: %s", packet) def on_close(self): self._to_kill = False