Update main.py
Add detailed logging
This commit is contained in:
parent
386ee0cdcf
commit
be64bd7114
32
app/main.py
32
app/main.py
@ -80,56 +80,60 @@ async def proxy_postgrest(
|
||||
request: Request,
|
||||
x_api_key: str = Header(default=None)
|
||||
):
|
||||
logger.info(f'an API call was made to: /{path} with api key: {x_api_key}')
|
||||
log_prefix = f'{getattr(getattr(request, "client", None), "host", None)} - {datetime.now().timestamp()}'
|
||||
logger.info(f'{log_prefix} - an API call was made to: /{path} with api key: {x_api_key}')
|
||||
if not x_api_key:
|
||||
raise HTTPException(status_code=401, detail="Unauthorized access")
|
||||
|
||||
# Step 1: Check cache
|
||||
user_info = api_key_cache.get(x_api_key)
|
||||
logger.info(f'cached user: {user_info}')
|
||||
logger.info(f'{log_prefix} - cached user: {user_info}')
|
||||
if not user_info:
|
||||
# Step 2: Cache miss → look up in DB
|
||||
logger.info(f'in prod: {PRODUCTION}')
|
||||
logger.info(f'{log_prefix} - in prod: {PRODUCTION}')
|
||||
if PRODUCTION:
|
||||
logger.info(f'looking up user in prod db')
|
||||
logger.info(f'{log_prefix} - looking up user in prod db')
|
||||
user_info = await fetch_user_from_db(app.state.db, x_api_key)
|
||||
else:
|
||||
logger.info(f'looking up user in fake db')
|
||||
logger.info(f'{log_prefix} - looking up user in fake db')
|
||||
user_info = fetch_user_in_dev(x_api_key)
|
||||
logger.info(f'user_info: {user_info}')
|
||||
logger.info(f'{log_prefix} - user_info: {user_info}')
|
||||
if not user_info:
|
||||
raise HTTPException(status_code=401, detail="Invalid or inactive API key")
|
||||
logger.info(f'caching {x_api_key} for {user_info}')
|
||||
logger.info(f'{log_prefix} - caching {x_api_key} for {user_info}')
|
||||
api_key_cache[x_api_key] = user_info # Step 3: Cache it
|
||||
|
||||
# Step 4: Sign JWT
|
||||
logger.info(f'generating jwt for postgrest')
|
||||
logger.info(f'{log_prefix} - generating jwt for postgrest')
|
||||
token = generate_jwt(user_info["user_id"], user_info["role"])
|
||||
|
||||
# Step 5: Forward request to PostgREST
|
||||
method = request.method
|
||||
body = await request.body()
|
||||
headers = dict(request.headers)
|
||||
logger.info(f'{log_prefix} - incoming headers: {headers}')
|
||||
headers["Authorization"] = f"Bearer {token}"
|
||||
forward_headers = {
|
||||
'Authorization': f'Bearer {token}',
|
||||
'Content-Type': headers.get("content-type", "application/json"),
|
||||
'Accept': headers.get('Accept', '*/*')
|
||||
'Content-Type': headers.get("Content-Type", headers.get("content-type", "application/json")),
|
||||
'Accept': headers.get('Accept', headers.get('accept', '*/*'))
|
||||
}
|
||||
|
||||
# TODO: proxy is currently not honoring Accept: text/csv
|
||||
# we were logging 'headers' but passing 'forward_headers'
|
||||
async with httpx.AsyncClient() as client:
|
||||
logger.info(f'sending request to postgrest for {user_info}:\nMethod: {method}\nURL: {POSTGREST_URL}/{path}\nHeaders: {headers}\nBody: {body}\nParams: {request.query_params}')
|
||||
logger.info(f'{log_prefix} - sending request to postgrest for {user_info}:\nMethod: {method}\nURL: {POSTGREST_URL}/{path}\nHeaders: {headers}\nBody: {body}\nParams: {request.query_params}')
|
||||
response = await client.request(
|
||||
method=method,
|
||||
url=f"{POSTGREST_URL}/{path}",
|
||||
headers=forward_headers,
|
||||
headers=headers,
|
||||
content=body,
|
||||
params=request.query_params
|
||||
)
|
||||
|
||||
logger.info(f'{user_info} / Response Code: {response.status_code}')
|
||||
logger.info(f'{log_prefix} - {user_info} / Response Code: {response.status_code}')
|
||||
if response.status_code != 200:
|
||||
logger.warning(f'Response Content: {response.content}')
|
||||
logger.warning(f'{log_prefix} - Response Content: {response.content}')
|
||||
return Response(
|
||||
content=response.content,
|
||||
status_code=response.status_code,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user