99 lines
4.0 KiB
Python
99 lines
4.0 KiB
Python
import json
|
|
import threading
|
|
from http.server import HTTPServer, BaseHTTPRequestHandler
|
|
import logging
|
|
|
|
class HookServerInstance(HTTPServer):
|
|
def __init__(self, server_address, RequestHandlerClass, app):
|
|
super().__init__(server_address, RequestHandlerClass)
|
|
self.app = app
|
|
|
|
class HookHandler(BaseHTTPRequestHandler):
|
|
def do_GET(self):
|
|
app = self.server.app
|
|
if self.path == '/status':
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({'status': 'ok'}).encode('utf-8'))
|
|
elif self.path == '/api/project':
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({'project': app.project}).encode('utf-8'))
|
|
elif self.path == '/api/session':
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({'session': {'entries': app.disc_entries}}).encode('utf-8'))
|
|
else:
|
|
self.send_response(404)
|
|
self.end_headers()
|
|
|
|
def do_POST(self):
|
|
app = self.server.app
|
|
content_length = int(self.headers.get('Content-Length', 0))
|
|
body = self.rfile.read(content_length)
|
|
|
|
try:
|
|
data = json.loads(body.decode('utf-8')) if body else {}
|
|
if self.path == '/api/project':
|
|
app.project = data.get('project', app.project)
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({'status': 'updated'}).encode('utf-8'))
|
|
elif self.path == '/api/session':
|
|
app.disc_entries = data.get('session', {}).get('entries', app.disc_entries)
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({'status': 'updated'}).encode('utf-8'))
|
|
elif self.path == '/api/gui':
|
|
if not hasattr(app, '_pending_gui_tasks'):
|
|
app._pending_gui_tasks = []
|
|
if not hasattr(app, '_pending_gui_tasks_lock'):
|
|
app._pending_gui_tasks_lock = threading.Lock()
|
|
|
|
with app._pending_gui_tasks_lock:
|
|
app._pending_gui_tasks.append(data)
|
|
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({'status': 'queued'}).encode('utf-8'))
|
|
else:
|
|
self.send_response(404)
|
|
self.end_headers()
|
|
except Exception as e:
|
|
self.send_response(500)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({'error': str(e)}).encode('utf-8'))
|
|
|
|
def log_message(self, format, *args):
|
|
logging.info("Hook API: " + format % args)
|
|
|
|
class HookServer:
|
|
def __init__(self, app, port=8999):
|
|
self.app = app
|
|
self.port = port
|
|
self.server = None
|
|
self.thread = None
|
|
|
|
def start(self):
|
|
if not getattr(self.app, 'test_hooks_enabled', False):
|
|
return
|
|
self.server = HookServerInstance(('127.0.0.1', self.port), HookHandler, self.app)
|
|
self.thread = threading.Thread(target=self.server.serve_forever, daemon=True)
|
|
self.thread.start()
|
|
logging.info(f"Hook server started on port {self.port}")
|
|
|
|
def stop(self):
|
|
if self.server:
|
|
self.server.shutdown()
|
|
self.server.server_close()
|
|
if self.thread:
|
|
self.thread.join()
|
|
logging.info("Hook server stopped")
|