summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/handlers.py24
-rw-r--r--server/prolog_session.py5
-rw-r--r--server/python_session.py20
-rw-r--r--server/socket.py2
4 files changed, 42 insertions, 9 deletions
diff --git a/server/handlers.py b/server/handlers.py
index 52a33f5..08994a0 100644
--- a/server/handlers.py
+++ b/server/handlers.py
@@ -106,7 +106,27 @@ class Query(CodeqService):
request.reply(result)
-# Push stdin to the session's Python interpreter. TODO: convert to async handling
+# Push user program to the Python interpreter to be exec'd.
+class PythonExec(CodeqService):
+ def process(self, request):
+ program = request.data.get('program')
+ if program is None:
+ request.reply({'code': 1, 'message': 'No program specified'})
+ else:
+ python = request.session.get_python()
+ python.exec(program)
+ request.reply({'code': 0, 'message': 'ok'})
+
+
+# Send an interrupt to the Python interpreter.
+class PythonStop(CodeqService):
+ def process(self, request):
+ python = request.session.get_python()
+ python.stop()
+ request.reply({'code': 0, 'message': 'ok'})
+
+
+# Push stdin to the Python interpreter.
class PythonPush(CodeqService):
def process(self, request):
text = request.data.get('text')
@@ -194,7 +214,9 @@ incoming_handlers = {
'logout': None,
'activity': Activity(),
'query': Query(),
+ 'python_exec': PythonExec(),
'python_push': PythonPush(),
+ 'python_stop': PythonStop(),
'hint': Hint(),
'test': Test()
}
diff --git a/server/prolog_session.py b/server/prolog_session.py
index 8d9926d..ebd53fb 100644
--- a/server/prolog_session.py
+++ b/server/prolog_session.py
@@ -118,10 +118,9 @@ class PrologSession(object):
solved_problems = [p for p in CodeqUser.solved_problems(session.get_uid(), language)
if p != (problem_group, problem)]
try:
- n_correct, n_all = problem_module.test(program, solved_problems)
- hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': n_all}}]
+ passed, hints = problem_module.test(program, solved_problems)
except AttributeError as ex:
- hints = [{'id': 'test_results', 'args': {'passed': 0, 'total': 0}}]
+ hints = [{'id': 'system_error', 'args': {'message': 'test function does not exist'}}]
self._instantiate_and_save_hints(language_module, problem_module, hints)
return hints
diff --git a/server/python_session.py b/server/python_session.py
index 7ffb070..85e1d2e 100644
--- a/server/python_session.py
+++ b/server/python_session.py
@@ -6,6 +6,7 @@ import io
import multiprocessing
import os
import queue
+import signal
import subprocess
import sys
import threading
@@ -55,9 +56,15 @@ class PythonSession(object):
p.terminate()
return results
+ def exec(self, program):
+ self._control.put_nowait(('exec', program))
+
def push(self, stdin):
self._control.put_nowait(('push', stdin))
+ def stop(self):
+ self._control.put_nowait(('stop', None))
+
def destroy(self):
self._control.put_nowait(('done', None))
@@ -86,10 +93,9 @@ class PythonSession(object):
problem_module = problems.load_problem(language, problem_group, problem, 'common')
try:
- n_correct, n_all = problem_module.test(self.run, program)
- hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': n_all}}]
+ passed, hints = problem_module.test(self.run, program)
except AttributeError as ex:
- hints = [{'id': 'test_results', 'args': {'passed': 0, 'total': 0}}]
+ hints = [{'id': 'system_error', 'args': {'message': 'test function does not exist'}}]
self._instantiate_and_save_hints(language_module, problem_module, hints)
return hints
@@ -125,9 +131,15 @@ def _interpreter(control, callback):
# Get a control command.
try:
cmd, data = control.get_nowait()
- if cmd == 'push':
+ if cmd == 'exec':
+ exec_str = 'exec("""\\\n{}\n""")\n'.format(data.replace('"', '\\"'))
+ proc.stdin.write(exec_str.encode('utf-8'))
+ proc.stdin.flush()
+ elif cmd == 'push':
proc.stdin.write(data.encode('utf-8'))
proc.stdin.flush()
+ elif cmd == 'stop':
+ proc.send_signal(signal.SIGINT)
elif cmd == 'done':
break
except:
diff --git a/server/socket.py b/server/socket.py
index ce505e3..60f0704 100644
--- a/server/socket.py
+++ b/server/socket.py
@@ -18,7 +18,7 @@ _transactions_to_socket = {} # keyed by tid, used only when there is no sid ava
def processIncomingPacket(receiving_socket, packet):
- print('Decocoding JSON: {}'.format(packet))
+ print('Decoding JSON: {}'.format(packet))
obj = json.loads(packet)
req_type = obj.get('type') # private (meta) requests have the 'type'
if req_type == 'connect':