55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
from fastapi import APIRouter, Request
|
|
from fastapi.openapi.docs import get_swagger_ui_html
|
|
from fastapi.responses import HTMLResponse, Response
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/.well-known/appspecific/com.chrome.devtools.json", include_in_schema=False)
|
|
async def chrome_devtools_probe() -> Response:
|
|
"""Chrome DevTools probes this path whenever DevTools opens. Return an
|
|
empty 204 so it doesn't show as a 404 in the access log."""
|
|
return Response(status_code=204)
|
|
|
|
|
|
@router.get("/api/docs", include_in_schema=False)
|
|
async def swagger_ui_dark(request: Request) -> HTMLResponse:
|
|
base = get_swagger_ui_html(
|
|
openapi_url=request.app.openapi_url,
|
|
title="Recon Ranger — API Docs",
|
|
swagger_js_url="/static/api/swagger-ui-bundle.js",
|
|
swagger_css_url="/static/api/swagger-ui.css",
|
|
swagger_favicon_url="/static/api/favicon.png",
|
|
)
|
|
html = base.body.decode()
|
|
|
|
html = html.replace(
|
|
"</head>",
|
|
(
|
|
'<link rel="stylesheet" href="/static/css/styles.css">\n'
|
|
'<link rel="stylesheet" href="/static/api/swagger-dark.css">\n'
|
|
"<style>.swagger-ui .topbar { display: none; }</style>\n"
|
|
"</head>"
|
|
),
|
|
)
|
|
|
|
nav_html = """
|
|
<header>
|
|
<nav>
|
|
<div class=\"menu\">
|
|
<div class=\"logo\"><a href=\"/\">Recon Ranger</a></div>
|
|
<ul>
|
|
<li><a href=\"/\">Home</a></li>
|
|
<li><a href=\"/api/docs\">API</a></li>
|
|
<li><a href=\"mailto:someone@example.com\">Contact</a></li>
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
</header>
|
|
<div style=\"padding-top:70px; position:relative; z-index:1\">
|
|
"""
|
|
html = html.replace("<body>", "<body>" + nav_html)
|
|
html = html.replace("</body>", "</div></body>")
|
|
|
|
return HTMLResponse(html)
|