Skip to content

Latest commit

 

History

History
592 lines (481 loc) · 16 KB

File metadata and controls

592 lines (481 loc) · 16 KB

ADB Frontend Server - Complete Reference Guide

File Information

  • Location: c:\Projects\ultron_agent\adb_frontend_server.py
  • Purpose: Serves static HTML interface on port 8080
  • Lines: 240+ (fully documented with comments)
  • Status: ✅ Production Ready
  • Integration: Launched by run.bat Step 7

Architecture Overview

Three-Tier System

┌─────────────────────────────────────────────┐
│        Browser Client (Port 8080)            │
│     gui/ultron_enhanced/web/adb.html        │
│     - 7 tabs, 45+ JavaScript functions      │
└────────────────┬────────────────────────────┘
                 │ HTTP GET requests
                 │ + Socket.IO connection
┌────────────────▼────────────────────────────┐
│  Frontend Server (adb_frontend_server.py)   │
│           Port 8080 - HTTP                  │
│  - Serves HTML file                         │
│  - Handles CORS preflight                   │
│  - Routes requests to adb.html              │
└────────────────┬────────────────────────────┘
                 │ Socket.IO bridge
                 │ (real-time bidirectional)
┌────────────────▼────────────────────────────┐
│  Backend Server (adb_backend_enhanced.py)   │
│           Port 5003 - Socket.IO             │
│  - Handles ADB commands                     │
│  - Manages device connections               │
│  - Executes shell commands                  │
└─────────────────────────────────────────────┘

Core Components

1. Module Imports

from http.server import HTTPServer, SimpleHTTPRequestHandler
# - HTTPServer: Python's built-in HTTP server class
# - SimpleHTTPRequestHandler: Basic HTTP request handler

import os
# - Path operations: construct file paths dynamically
# - File existence checks: verify HTML file location

import sys
# - Exit codes: return success (0) or error (1) status
# - Standard I/O: print messages to console

Reference: Python http.server Documentation


2. CORSRequestHandler Class

Purpose

Custom HTTP request handler that:

  • Adds CORS headers to all responses
  • Routes requests to adb.html
  • Handles preflight requests (OPTIONS)
  • Provides custom logging

Key Methods

end_headers()
def end_headers(self):
    """Add CORS headers to all HTTP responses"""
    self.send_header('Access-Control-Allow-Origin', '*')
    # ↑ Allow all origins (frontend can connect from anywhere)

    self.send_header('Access-Control-Allow-Methods', '*')
    # ↑ Allow all HTTP methods (GET, POST, PUT, DELETE, etc.)

    self.send_header('Access-Control-Allow-Headers', '*')
    # ↑ Allow all custom headers in requests

    self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
    # ↑ Prevent browser caching (always get fresh copy)

    self.send_header('Content-Type', 'text/html; charset=utf-8')
    # ↑ Specify HTML content type for browser

    super().end_headers()
    # ↑ Call parent class to finalize headers

Why CORS Headers Matter:

  • Socket.IO needs to make cross-origin requests
  • Without these headers: ERR_CONNECTION_REFUSED
  • Browser enforces CORS policy by default
  • We explicitly allow all origins with *

Reference: CORS - MDN Web Docs


do_GET()
def do_GET(self):
    """Handle HTTP GET requests"""

Logic Flow:

1. Check if request is for / or /adb.html
   ├─ YES: Go to step 2
   └─ NO: Use default handler (step 4)

2. Construct path to HTML file
   ├─ __file__ = current script location
   ├─ dirname(__file__) = project root
   └─ Join with: gui/ultron_enhanced/web/adb.html

3. Check if file exists
   ├─ YES: Read file, send 200 OK with content
   ├─ NO: Send 404 Not Found error
   └─ Error on read: Send 500 Internal Server Error

4. For other requests: Use parent class behavior
   └─ Allows serving static files if needed

Error Handling:

try:
    # Read HTML file
    with open(html_path, 'r', encoding='utf-8') as f:
        content = f.read()
except Exception as e:
    # Handle: permission denied, encoding errors, etc.
    print(f"[ERROR] Failed to read HTML file: {e}")
    self.send_response(500)
    # Send HTTP 500 Internal Server Error
    self.end_headers()
    return

Common Errors & Fixes:

Error Cause Fix
HTTP 404 HTML file not found Check file path, run from correct directory
HTTP 500 Permission denied Check file permissions, run as admin
Encoding error Wrong encoding Ensure UTF-8 encoding in file
Connection refused Port 8080 in use Kill process: netstat -ano | findstr 8080

do_OPTIONS()
def do_OPTIONS(self):
    """Handle HTTP OPTIONS requests (CORS preflight)"""

Why OPTIONS Matters:

  • Browser sends OPTIONS before making POST requests
  • Called during WebSocket upgrade for Socket.IO
  • Must return 200 with CORS headers
  • Without this: Cross-origin requests fail

Flow:

Browser wants to connect to Socket.IO
    ↓
Browser sends OPTIONS request (preflight)
    ↓
Server responds with CORS headers
    ↓
Browser verifies CORS headers are correct
    ↓
Browser allows actual Socket.IO connection

Response Headers:

self.send_response(200)  # ✅ OK
self.send_header('Access-Control-Allow-Origin', '*')  # Allow all origins
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')  # Methods
self.send_header('Access-Control-Allow-Headers', '*')  # All headers
self.end_headers()

log_message()
def log_message(self, format, *args):
    """Override default HTTP logging"""
    print(f"[{self.client_address[0]}] {format % args}")

Output Format:

[127.0.0.1] GET /adb.html HTTP/1.1 200 -
[127.0.0.1] POST /socket.io/?transport=polling HTTP/1.1 200 -
[192.168.1.100] OPTIONS /socket.io/?transport=websocket HTTP/1.1 200 -

Useful for:

  • Debugging: See all client requests
  • Monitoring: Track which IPs connect
  • Troubleshooting: Verify HTML was served

Main Execution Block

Configuration

HOST = '127.0.0.1'  # Localhost only
PORT = 8080         # Must match run.bat configuration

Important:

  • 127.0.0.1 = local machine only (secure)
  • 0.0.0.0 = accessible from network (use if needed)
  • Port 8080 must be available (not in use)

Server Creation

server = HTTPServer((HOST, PORT), CORSRequestHandler)
server.serve_forever()

What Happens:

  1. HTTPServer created on 127.0.0.1:8080
  2. Uses CORSRequestHandler for all requests
  3. serve_forever() blocks until Ctrl+C or error
  4. Handles incoming browser connections

Error Handling

KeyboardInterrupt (Ctrl+C)

except KeyboardInterrupt:
    print("\n[!] Server shutdown by user")
    sys.exit(0)  # Exit code 0 = success

Other Exceptions

except Exception as e:
    print(f"[!] Error: {e}")
    sys.exit(1)  # Exit code 1 = error

Common Exceptions:

Exception Cause Solution
OSError: [Errno 10048] Port in use Kill process on port 8080
PermissionError No admin rights Run as Administrator
FileNotFoundError adb.html missing Check file path
UnicodeDecodeError Wrong file encoding Ensure UTF-8

Integration with run.bat

Run.bat Step 7

REM Step 7: Start ADB Manager services
echo [7/9] Starting ADB Manager Backend (port 5003)...
start "ADB Backend" /MIN python adb_backend_enhanced.py

echo [7/9] Starting ADB Manager Frontend (port 8080)...
start "ADB Frontend" /MIN python adb_frontend_server.py

REM Health checks follow

Execution Order (CRITICAL)

1. run.bat starts
2. run.bat starts adb_backend_enhanced.py (port 5003)
3. run.bat starts adb_frontend_server.py (port 8080) ← We are here
4. run.bat verifies both services are running
5. run.bat opens browser to http://localhost:8080/adb.html
6. Browser loads adb.html from our server
7. adb.html's JavaScript connects to port 5003 (backend)

If Order Wrong:

  • ❌ Frontend starts before backend → Socket.IO fails
  • ❌ Backend not running → Browser shows "unavailable"
  • ❌ Port 8080 not listening → Browser can't load HTML

File Structure & Paths

HTML File Location

c:\Projects\ultron_agent\
├── adb_frontend_server.py      ← This file
├── adb_backend_enhanced.py
├── run.bat
└── gui\
    └── ultron_enhanced\
        └── web\
            └── adb.html        ← What we serve

Path Construction

html_path = os.path.join(
    os.path.dirname(__file__),           # Project root directory
    'gui/ultron_enhanced/web/adb.html'   # Relative path to HTML
)
# Result: C:\Projects\ultron_agent\gui\ultron_enhanced\web\adb.html

Why Dynamic Paths Matter

  • Works regardless of project installation location
  • Handles different Windows drive letters
  • Supports UNC network paths
  • Compatible with symbolic links

Socket.IO Communication Flow

Frontend (Browser)

// adb.html includes Socket.IO client library
<script src="https://cdn.socket.io/4.5.4/socket.io.min.js"></script>

// JavaScript connects to backend via port 5003
const socket = io('http://localhost:5003');

// Socket.IO tries multiple transports:
// 1. WebSocket (preferred)
// 2. HTTP Long-polling (fallback)

Our Server's Role

Browser Request:
  GET http://localhost:8080/
    ↓
Our server (do_GET):
  Sends adb.html with HTML content
    ↓
Browser loads adb.html:
  Executes JavaScript
    ↓
JavaScript tries to connect to Socket.IO:
  OPTIONS http://localhost:5003/socket.io/
    ↓
Our server (do_OPTIONS):
  Sends CORS headers
    ↓
Browser: "CORS headers OK, connecting..."
  ↓
Browser connects via Socket.IO to port 5003 (backend)

Why CORS Headers Essential

WITHOUT CORS Headers:
  Browser: "GET /adb.html from port 8080"
  Server: Responds with HTML ✅
  Browser: "Run JavaScript from adb.html"
  JavaScript: "Connect to port 5003"
  Browser: "❌ BLOCKED - Different origin!"
  Result: Socket.IO connection fails

WITH CORS Headers:
  Browser: "OPTIONS request to port 5003"
  Server: "✅ CORS-Allow-Origin: *"
  Browser: "Great! Connecting to Socket.IO..."
  JavaScript: "Successfully connected to port 5003"
  Result: ✅ Real-time communication works!

Debugging & Troubleshooting

Check Server Status

# Test if server is running and responding
curl -I http://localhost:8080/adb.html

# Expected output:
# HTTP/1.0 200 OK
# Server: BaseHTTP/0.6 Python/3.10.0
# Content-Type: text/html; charset=utf-8
# Access-Control-Allow-Origin: *

View Server Logs

# Start server and see logs
python adb_frontend_server.py

# Expected logs:
# [+] ADB Frontend Server Starting...
# [+] Serving on: http://127.0.0.1:8080
# [+] Backend: http://localhost:5003
# [+] Press Ctrl+C to stop
#
# [127.0.0.1] GET /adb.html HTTP/1.1 200 -
# [127.0.0.1] POST /socket.io/?transport=polling HTTP/1.1 200 -

Browser Developer Tools

// In browser console (F12):

// Check if adb.html loaded
console.log(document.title);  // "ADB Manager"

// Check if Socket.IO loaded
console.log(typeof io);  // "function" (loaded)
console.log(typeof io);  // "undefined" (not loaded)

// Check Socket.IO connection
socket.on('connect', () => {
  console.log('✅ Connected to backend');
});

socket.on('connect_error', (error) => {
  console.log('❌ Connection error:', error);
});

// View network requests
// Press F12 → Network tab → See all requests
// Look for: adb.html (200 OK), Socket.IO polling (200 OK)

Common Issues & Solutions

Issue 1: ERR_CONNECTION_REFUSED on port 8080

Symptom: Browser shows error, "Cannot reach server"
Cause: Frontend server not running on port 8080
Solution:
  1. Start server: python adb_frontend_server.py
  2. Check port: netstat -ano | findstr 8080
  3. Check firewall: Allow port 8080
  4. Verify run.bat launches it: Step 7

Issue 2: Socket.IO fails to connect

Symptom: Browser console shows Socket.IO errors
Cause: CORS headers missing or incorrect
Solution:
  1. Check do_GET() has CORS headers
  2. Check do_OPTIONS() responds with 200
  3. View Network tab in DevTools
  4. Look for OPTIONS request response headers
  5. Verify "Access-Control-Allow-Origin: *" present

Issue 3: HTML file not found (404 error)

Symptom: "HTML file not found" message
Cause: Path to adb.html incorrect
Solution:
  1. Verify file exists: gui/ultron_enhanced/web/adb.html
  2. Check path construction in do_GET()
  3. Print html_path for debugging
  4. Run from project root: c:\Projects\ultron_agent
  5. Check file permissions: Can read HTML file?

Issue 4: Port 8080 already in use

Symptom: "OSError: [Errno 10048] Only one usage of socket address"
Cause: Another process using port 8080
Solution:
  # Find process using port 8080
  netstat -ano | findstr 8080

  # Kill process (replace PID with actual number)
  taskkill /PID 1234 /F

  # Or use different port (edit both here and run.bat)
  PORT = 8081

Performance Considerations

Single-Threaded Server

server = HTTPServer((HOST, PORT), CORSRequestHandler)
# Handles one request at a time
# Sufficient for: small number of concurrent users
# Limitation: Can't handle high load efficiently

For Production:

Consider upgrading to:
- Gunicorn (WSGI server)
- Waitress (threaded server)
- Uvicorn (ASGI server, async)
- Nginx (reverse proxy)

CORS Header Overhead

# Every response includes CORS headers (~200 bytes)
# Small impact on bandwidth (~0.2% typical)
# Essential for functionality (worth the cost)

File Caching

Cache-Control: no-store, no-cache, must-revalidate
# Always gets fresh copy from disk
# Prevents stale HTML in browser cache
# Small performance cost (negligible for updates)
# Ensures latest adb.html always loaded

Enhancement Ideas

Future Improvements

  1. Serve Static Assets

    • Serve CSS/JS files from static/ directory
    • Compress files (gzip)
    • Add expires headers for caching
  2. Add Logging

    • Log all requests to file
    • Track errors for debugging
    • Performance metrics
  3. Authentication

    • Add login form
    • Token-based auth
    • HTTPS/SSL support
  4. Load Balancing

    • Multiple instances
    • Nginx reverse proxy
    • Session persistence
  5. Compression

    • Gzip HTML content
    • Reduce bandwidth usage
    • Faster page load

Summary

What This File Does

  1. Serves HTML - gui/ultron_enhanced/web/adb.html on port 8080
  2. Enables CORS - Allows Socket.IO communication with backend
  3. Routes Requests - Maps / and /adb.html to the same file
  4. Handles Preflight - Responds to OPTIONS for CORS verification
  5. Provides Logging - Shows incoming requests for debugging

Why It Matters

  • ✅ Frontend needs HTTP server to load in browser
  • ✅ Socket.IO requires CORS headers for cross-origin access
  • ✅ Simple, lightweight, perfect for our use case
  • ✅ Integrated into run.bat for one-click startup
  • ✅ Production-ready with error handling

Key Takeaways

  • Always start frontend server BEFORE loading in browser
  • CORS headers are CRITICAL for Socket.IO communication
  • Path construction handles different system configurations
  • Error handling covers common failure scenarios
  • Comprehensive comments make code maintainable

Last Updated: November 1, 2025 Status: ✅ Production Ready Fully Commented & Documented