#!/usr/bin/env python3 """ Server-Sent Events (SSE) Streaming Server for Aenebris testing """ import time import json from http.server import HTTPServer, BaseHTTPRequestHandler from datetime import datetime class SSEHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == "/health": self.send_response(200) self.send_header("Content-Type", "application/json") self.end_headers() self.wfile.write(json.dumps({"status": "healthy"}).encode()) return if self.path == "/events": self.send_response(200) self.send_header("Content-Type", "text/event-stream") self.send_header("Cache-Control", "no-cache") self.send_header("Connection", "keep-alive") self.send_header("X-Accel-Buffering", "no") self.end_headers() print(f"[SSE] Client connected: {self.client_address}") try: event_id = 0 while True: event_id += 1 data = { "id": event_id, "timestamp": datetime.now().isoformat(), "message": f"Event #{event_id}" } event = f"id: {event_id}\nevent: tick\ndata: {json.dumps(data)}\n\n" self.wfile.write(event.encode()) self.wfile.flush() print(f"[SSE] Sent event #{event_id}") time.sleep(1) except (BrokenPipeError, ConnectionResetError): print(f"[SSE] Client {self.client_address} disconnected") return if self.path == "/stream/fast": self.send_response(200) self.send_header("Content-Type", "text/event-stream") self.send_header("Cache-Control", "no-cache") self.send_header("Connection", "keep-alive") self.end_headers() print(f"[SSE-FAST] Client connected: {self.client_address}") try: for i in range(100): data = {"seq": i, "ts": datetime.now().isoformat()} event = f"data: {json.dumps(data)}\n\n" self.wfile.write(event.encode()) self.wfile.flush() time.sleep(0.05) self.wfile.write(b"event: done\ndata: complete\n\n") self.wfile.flush() print(f"[SSE-FAST] Stream complete") except (BrokenPipeError, ConnectionResetError): print(f"[SSE-FAST] Client disconnected early") return self.send_response(200) self.send_header("Content-Type", "text/html") self.end_headers() html = """