68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
|
import json
|
||
|
import logging
|
||
|
import struct
|
||
|
|
||
|
from event_socket_server import ZlibPacketHandler
|
||
|
|
||
|
logger = logging.getLogger('judge.bridge')
|
||
|
size_pack = struct.Struct('!I')
|
||
|
|
||
|
|
||
|
class DjangoHandler(ZlibPacketHandler):
|
||
|
def __init__(self, server, socket):
|
||
|
super(DjangoHandler, self).__init__(server, socket)
|
||
|
|
||
|
self.handlers = {
|
||
|
'submission-request': self.on_submission,
|
||
|
'terminate-submission': self.on_termination,
|
||
|
'disconnect-judge': self.on_disconnect,
|
||
|
}
|
||
|
self._to_kill = True
|
||
|
# self.server.schedule(5, self._kill_if_no_request)
|
||
|
|
||
|
def _kill_if_no_request(self):
|
||
|
if self._to_kill:
|
||
|
logger.info('Killed inactive connection: %s', self._socket.getpeername())
|
||
|
self.close()
|
||
|
|
||
|
def _format_send(self, data):
|
||
|
return super(DjangoHandler, self)._format_send(json.dumps(data, separators=(',', ':')))
|
||
|
|
||
|
def packet(self, packet):
|
||
|
self._to_kill = False
|
||
|
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, self._schedule_close)
|
||
|
|
||
|
def _schedule_close(self):
|
||
|
self.server.schedule(0, self.close)
|
||
|
|
||
|
def on_submission(self, data):
|
||
|
id = data['submission-id']
|
||
|
problem = data['problem-id']
|
||
|
language = data['language']
|
||
|
source = data['source']
|
||
|
priority = data['priority']
|
||
|
if not self.server.judges.check_priority(priority):
|
||
|
return {'name': 'bad-request'}
|
||
|
self.server.judges.judge(id, problem, language, source, priority)
|
||
|
return {'name': 'submission-received', 'submission-id': id}
|
||
|
|
||
|
def on_termination(self, data):
|
||
|
return {'name': 'submission-received', 'judge-aborted': self.server.judges.abort(data['submission-id'])}
|
||
|
|
||
|
def on_disconnect(self, data):
|
||
|
judge_id = data['judge-id']
|
||
|
force = data['force']
|
||
|
self.server.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
|