fetch / fetch.py
pup-py's picture
capturing requests
bceb9b7
raw
history blame
1.62 kB
from datetime import datetime
from fastapi import FastAPI, Request
from fastapi.responses import Response, FileResponse
from typing import Any
import json
import subprocess
class PrettyJSONResponse(Response):
media_type = "application/json"
def render(self, content: Any) -> bytes:
return json.dumps(content, indent=2).encode("utf-8")
app = FastAPI()
@app.middleware("http")
async def log_request(request: Request, call_next: Any):
ts = datetime.now().strftime("%y%m%d%H%M%S%f")
data = {
"day": int(ts[:6]),
"dt": int(ts[:-3]),
"url": request.url,
"query_params": request.query_params,
"client": request.client.host,
"method": request.method,
"headers": dict(request.headers),
}
output = json.dumps(
obj=data,
default=str,
indent=None,
separators=(", ", ":"),
)
with open("a.json", "a") as f:
separator = "\n" if f.tell() else ""
f.write(separator + output)
response = await call_next(request)
return response
@app.get("/")
def read_root(request: Request):
return {"Hello": request.client.host}
@app.get("/a", response_class=PrettyJSONResponse)
def get_analytics(n: int = 5):
if n == 0:
cmd = "cat a.json"
else:
cmd = f"tail -{n} a.json"
json_lines = subprocess.run(cmd.split(), capture_output=True).stdout
content = json.loads(f"[{json_lines.replace(b"\n", b",").decode()}]")
return content
@app.api_route("/qa", response_class=FileResponse, methods=["GET", "HEAD"])
def query_analytics():
return "a.json"