Spaces:
Sleeping
Sleeping
DIVYANSHI SINGH
π Fix: Robust environment variable loading to prevent illegal header errors
623da34 | import os | |
| import logging | |
| import asyncio | |
| import httpx | |
| from fastapi import HTTPException | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| log = logging.getLogger(__name__) | |
| GITHUB_API = "https://api.github.com" | |
| GITHUB_TOKEN = os.getenv("GITHUB_TOKEN", "").strip() | |
| HEADERS = { | |
| "Accept": "application/vnd.github+json", | |
| "X-GitHub-Api-Version": "2022-11-28", | |
| } | |
| # We will initialize this in the main.py lifespan | |
| http_client: httpx.AsyncClient = None # type: ignore | |
| async def get_github_data(url: str, params: dict = None, user_token: str = None): | |
| """ | |
| Core function to fetch data from GitHub. | |
| It automatically handles: | |
| 1. BYOK (Bring Your Own Key) if the user provides one in the frontend. | |
| 2. Automatic retries if hitting a 429 Rate Limit. | |
| """ | |
| headers = HEADERS.copy() | |
| # Priority 1: User's provided token (BYOK) | |
| # Priority 2: Server's .env token | |
| token_to_use = user_token if user_token else GITHUB_TOKEN | |
| if token_to_use: | |
| headers["Authorization"] = f"Bearer {token_to_use}" | |
| for attempt in range(3): | |
| res = await http_client.get(url, params=params, headers=headers) | |
| if res.status_code == 429: | |
| log.warning(f"GitHub Rate limit hit. Waiting 2 seconds (Attempt {attempt + 1}/3)") | |
| await asyncio.sleep(2) | |
| continue | |
| return res | |
| raise HTTPException(status_code=429, detail="GitHub API rate limit reached. Please add your own token in Settings.") | |