peijun1's picture
Deploy AI Studio Proxy API to Hugging Face Spaces
a5784e9
Raw
History Blame Contribute Delete
3.91 kB
import argparse
import asyncio
import logging
import sys
from pathlib import Path
from typing import Any, Optional
from logging_utils import GridFormatter, set_source
from stream.proxy_server import ProxyServer
def parse_args() -> argparse.Namespace:
"""Parse command line arguments"""
parser = argparse.ArgumentParser(
description="HTTPS Proxy Server with SSL Inspection"
)
parser.add_argument(
"--host", default="127.0.0.1", help="Host to bind the proxy server"
)
parser.add_argument(
"--port", type=int, default=3120, help="Port to bind the proxy server"
)
parser.add_argument(
"--domains",
nargs="+",
default=["*.google.com"],
help="List of domain patterns to intercept (regex)",
)
parser.add_argument(
"--proxy", help="Upstream proxy URL (e.g., http://user:pass@host:port)"
)
return parser.parse_args()
async def main() -> None:
"""Main entry point"""
args = parse_args()
# Set up logging with GridFormatter for consistent output
set_source("PROXY")
console_handler = logging.StreamHandler(sys.stderr)
console_handler.setFormatter(GridFormatter(show_tree=True, colorize=True))
console_handler.setLevel(logging.INFO)
# Configure proxy_server logger specifically (not root)
logger = logging.getLogger("proxy_server")
logger.handlers.clear() # Remove any existing handlers
logger.addHandler(console_handler)
logger.setLevel(logging.INFO)
logger.propagate = False # Prevent double logging
logging.getLogger("asyncio").setLevel(logging.ERROR)
logging.getLogger("websockets").setLevel(logging.ERROR)
# Create certs directory
cert_dir = Path("certs")
cert_dir.mkdir(exist_ok=True)
# Print startup information
logger.info(f"Starting proxy server on {args.host}:{args.port}")
logger.info(f"Intercepting domains: {args.domains}")
if args.proxy:
logger.info(f"Using upstream proxy: {args.proxy}")
# Create and start the proxy server
proxy_server = ProxyServer(
host=args.host,
port=args.port,
intercept_domains=args.domains,
upstream_proxy=args.proxy,
queue=None,
)
try:
await proxy_server.start()
except KeyboardInterrupt:
logger.info("Shutting down proxy server")
except asyncio.CancelledError:
raise
except Exception as e:
logger.error(f"Error starting proxy server: {e}", exc_info=True)
sys.exit(1)
async def builtin(
queue: Optional[Any] = None, port: Optional[int] = None, proxy: Optional[str] = None
) -> None:
# Set up logging with GridFormatter for consistent output
set_source("PROXY")
console_handler = logging.StreamHandler(sys.stderr)
console_handler.setFormatter(GridFormatter(show_tree=True, colorize=True))
console_handler.setLevel(logging.INFO)
# Configure proxy_server logger specifically (not root)
logger = logging.getLogger("proxy_server")
logger.handlers.clear() # Remove any existing handlers
logger.addHandler(console_handler)
logger.setLevel(logging.INFO)
logger.propagate = False # Prevent double logging
# Create certs directory
cert_dir = Path("certs")
cert_dir.mkdir(exist_ok=True)
if port is None:
port = 3120
# Create and start the proxy server
proxy_server = ProxyServer(
host="127.0.0.1",
port=port,
intercept_domains=["*.google.com"],
upstream_proxy=proxy,
queue=queue,
)
try:
await proxy_server.start()
except KeyboardInterrupt:
logger.info("Shutting down proxy server")
except asyncio.CancelledError:
raise
except Exception as e:
logger.error(f"Error starting proxy server: {e}", exc_info=True)
sys.exit(1)
if __name__ == "__main__":
asyncio.run(main())