File size: 2,741 Bytes
08a3216
949dc99
08a3216
9ebd969
08a3216
 
 
61d6fd1
9ebd969
 
949dc99
61d6fd1
5a86b8e
08a3216
61d6fd1
9ebd969
 
 
 
 
61d6fd1
9ebd969
 
61d6fd1
9ebd969
08a3216
5a86b8e
9ebd969
b07bcdd
 
9ebd969
b07bcdd
 
5a86b8e
08a3216
61d6fd1
08a3216
 
61d6fd1
 
 
 
 
 
 
08a3216
61d6fd1
08a3216
 
61d6fd1
 
 
 
08a3216
949dc99
 
 
 
 
61d6fd1
9ebd969
949dc99
 
61d6fd1
949dc99
9ebd969
61d6fd1
949dc99
61d6fd1
949dc99
 
 
 
 
 
 
08a3216
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from fastapi import FastAPI, Request, Header, HTTPException
from fastapi.responses import JSONResponse, Response
import httpx
import socket

app = FastAPI()

# Real secret API key (used internally, never exposed)
REAL_API_KEY = "sk-qO9N6kQEEULMWtF4YGVlTTSjIPllEm1h1wfEBzSmnSbxiXwe"
BASE_URL = "https://fast.typegpt.net"

# Public key that users must use in Authorization header
PUBLIC_AUTH_TOKEN = "TypeGPT-Free4ALL"

# Show server IP at startup
@app.on_event("startup")
async def startup_event():
    try:
        hostname = socket.gethostname()
        server_ip = socket.gethostbyname(hostname)
        print("===== Server Started =====")
        print(f"📡 Server IP: {server_ip}")
    except Exception as e:
        print(f"⚠️ Could not determine server IP: {e}")

@app.api_route("/{path:path}", methods=["GET", "POST"])
async def proxy(request: Request, path: str, authorization: str = Header(None)):
    # Validate Authorization token
    if not authorization or not authorization.startswith("Bearer "):
        raise HTTPException(status_code=401, detail="Missing or malformed Authorization header.")

    token = authorization.replace("Bearer ", "").strip()
    if token != PUBLIC_AUTH_TOKEN:
        raise HTTPException(status_code=401, detail="Invalid Authorization token. Use 'TypeGPT-Free4ALL'.")

    # Rebuild the target URL
    target_url = f"{BASE_URL}/{path}"

    # Use clean headers to avoid Cloudflare issues
    headers = {
        "Authorization": f"Bearer {REAL_API_KEY}",
        "Content-Type": request.headers.get("content-type", "application/json"),
        "Accept": "application/json",
        "User-Agent": "FastAPI-Proxy"
    }

    # Read the body
    body = await request.body()

    # Log for debugging
    print(f"🔄 Forwarding to: {target_url}")
    print(f"📦 Request Body (first 200 chars): {body[:200]}")

    async with httpx.AsyncClient() as client:
        try:
            response = await client.request(
                method=request.method,
                url=target_url,
                headers=headers,
                content=body,
                timeout=60
            )
        except httpx.RequestError as e:
            raise HTTPException(status_code=502, detail=f"Failed to reach backend: {e}")

    print(f"↩️ TypeGPT Status: {response.status_code}")
    print(f"🧾 Response Snippet: {response.text[:200]}")

    # Return JSON if possible, else fallback
    try:
        return JSONResponse(content=response.json(), status_code=response.status_code)
    except Exception:
        return Response(
            content=response.content,
            status_code=response.status_code,
            media_type=response.headers.get("content-type", "text/plain")
        )