ishingiro / tests /run_frontend.py
IZERE HIRWA Roger
ishingiro
c024705
import os
import argparse
import webbrowser
import logging
from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler
from urllib.parse import urlparse
class ChatBotHandler(SimpleHTTPRequestHandler):
def log_message(self, format, *args):
# Suppress logging for Chrome DevTools and other browser noise
if (len(args) > 0 and
('.well-known' in str(args) or
'favicon.ico' in str(args) or
'apple-touch-icon' in str(args) or
'robots.txt' in str(args) or
'sitemap.xml' in str(args))):
return
# Log other requests normally
super().log_message(format, *args)
def do_GET(self):
# Parse the URL path
parsed_path = urlparse(self.path)
path = parsed_path.path
# Handle Chrome DevTools and other browser requests silently
if (path.startswith('/.well-known/') or
path.startswith('/favicon.ico') or
path.startswith('/apple-touch-icon') or
path.startswith('/robots.txt') or
path.startswith('/sitemap.xml')):
self.send_response(404)
self.end_headers()
return
# Handle routing for SPA
if path == '/':
# Default to the new landing page
self.serve_file('landing.html')
elif path == '/landing' or path == '/landing.html':
self.serve_file('landing.html')
elif path == '/index.html':
self.serve_file('index.html')
elif path == '/login':
self.serve_file('login.html')
elif path == '/register':
self.serve_file('register.html')
elif path == '/admin_login.html':
self.serve_file('admin_login.html')
elif path == '/admin_dashboard.html':
self.serve_file('admin_dashboard.html')
elif path == '/professional_login.html':
self.serve_file('professional_login.html')
elif path == '/professional_dashboard.html':
self.serve_file('professional_dashboard.html')
elif path.startswith('/') and '.' in path:
# Static file request (css, js, etc.)
super().do_GET()
else:
# Fallback to index.html for SPA routing
self.serve_file('index.html')
def serve_file(self, filename):
"""Serve a specific HTML file"""
try:
if os.path.exists(filename):
self.path = '/' + filename
super().do_GET()
else:
self.send_error(404, f"File not found: {filename}")
except Exception as e:
self.send_error(500, f"Server error: {str(e)}")
def run_server(port: int):
base_dir = os.path.dirname(os.path.abspath(__file__))
chatbot_dir = os.path.join(base_dir, "chatbot")
if not os.path.isdir(chatbot_dir):
print("ERROR: chatbot/ directory not found. Create c:\\aimhsa-rag\\chatbot with index.html, style.css, app.js")
return
# Change to chatbot directory so files are served correctly
os.chdir(chatbot_dir)
addr = ("", port)
httpd = ThreadingHTTPServer(addr, ChatBotHandler)
url = f"http://localhost:{port}/"
print(f"Serving frontend at {url} (serving directory: {chatbot_dir})")
print("Routes available:")
print(f" - {url} (landing)")
print(f" - {url}landing (landing page)")
print(f" - {url}login (login page)")
print(f" - {url}register (register page)")
try:
webbrowser.open(url)
except Exception:
pass
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("Shutting down server...")
httpd.server_close()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Serve the chatbot frontend with proper routing.")
parser.add_argument("--port", "-p", type=int, default=8000, help="Port to serve the frontend on (default: 8000)")
args = parser.parse_args()
run_server(args.port)