cloze-reader / local-server.py
milwright's picture
fix: clean up AI response processing and improve UI
b451c6e
#!/usr/bin/env python3
"""
Local development server for cloze-reader
Serves static files with CORS enabled for local testing
"""
import http.server
import socketserver
import os
from urllib.parse import urlparse
import json
class LocalHandler(http.server.SimpleHTTPRequestHandler):
def end_headers(self):
# Enable CORS for local development
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Headers', 'Content-Type')
super().end_headers()
def do_GET(self):
# Handle root path
if self.path == '/':
self.path = '/index.html'
# Handle icon.png (serve local file if exists, otherwise redirect)
if self.path == '/icon.png':
if os.path.exists('icon.png'):
return super().do_GET()
else:
self.send_response(302)
self.send_header('Location', 'https://raw.githubusercontent.com/zmuhls/cloze-reader/main/icon.png')
self.end_headers()
return
# Serve static files
return super().do_GET()
def do_OPTIONS(self):
self.send_response(200)
self.end_headers()
def run_server(port=8000):
handler = LocalHandler
try:
with socketserver.TCPServer(("", port), handler) as httpd:
print(f"Local development server running at http://localhost:{port}/")
print("Press Ctrl+C to stop")
httpd.serve_forever()
except KeyboardInterrupt:
print("\nServer stopped")
except OSError as e:
if e.errno == 48: # Address already in use
print(f"Port {port} is already in use. Try a different port.")
else:
print(f"Error starting server: {e}")
if __name__ == "__main__":
import sys
port = int(sys.argv[1]) if len(sys.argv) > 1 else 8000
run_server(port)