Monorepo: consolidate 7 repos into one
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m5s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m5s
Combines shared, blog, market, cart, events, federation, and account into a single repository. Eliminates submodule sync, sibling model copying at build time, and per-app CI orchestration. Changes: - Remove per-app .git, .gitmodules, .gitea, submodule shared/ dirs - Remove stale sibling model copies from each app - Update all 6 Dockerfiles for monorepo build context (root = .) - Add build directives to docker-compose.yml - Add single .gitea/workflows/ci.yml with change detection - Add .dockerignore for monorepo build context - Create __init__.py for federation and account (cross-app imports)
This commit is contained in:
58
shared/browser/app/middleware.py
Normal file
58
shared/browser/app/middleware.py
Normal file
@@ -0,0 +1,58 @@
|
||||
|
||||
def register(app):
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
def _decode_headers(scope) -> dict[str, str]:
|
||||
out = {}
|
||||
for k, v in scope.get("headers", []):
|
||||
try:
|
||||
out[k.decode("latin1")] = v.decode("latin1")
|
||||
except Exception:
|
||||
out[repr(k)] = repr(v)
|
||||
return out
|
||||
|
||||
def _safe(obj: Any):
|
||||
# make scope json-serialisable; fall back to repr()
|
||||
try:
|
||||
json.dumps(obj)
|
||||
return obj
|
||||
except Exception:
|
||||
return repr(obj)
|
||||
|
||||
class ScopeDumpMiddleware:
|
||||
def __init__(self, app, *, log_bodies: bool = False):
|
||||
self.app = app
|
||||
self.log_bodies = log_bodies # keep False; bodies aren't needed for routing
|
||||
|
||||
async def __call__(self, scope, receive, send):
|
||||
if scope["type"] in ("http", "websocket"):
|
||||
# Build a compact view of keys relevant to routing
|
||||
scope_view = {
|
||||
"type": scope.get("type"),
|
||||
"asgi": scope.get("asgi"),
|
||||
"http_version": scope.get("http_version"),
|
||||
"scheme": scope.get("scheme"),
|
||||
"method": scope.get("method"),
|
||||
"server": scope.get("server"),
|
||||
"client": scope.get("client"),
|
||||
"root_path": scope.get("root_path"),
|
||||
"path": scope.get("path"),
|
||||
"raw_path": scope.get("raw_path").decode("latin1") if scope.get("raw_path") else None,
|
||||
"query_string": scope.get("query_string", b"").decode("latin1"),
|
||||
"headers": _decode_headers(scope),
|
||||
}
|
||||
|
||||
print("\n=== ASGI SCOPE (routing) ===")
|
||||
print(json.dumps({_safe(k): _safe(v) for k, v in scope_view.items()}, indent=2))
|
||||
print("=== END SCOPE ===\n", flush=True)
|
||||
|
||||
return await self.app(scope, receive, send)
|
||||
|
||||
# wrap LAST so you see what hits Quart
|
||||
#app.asgi_app = ScopeDumpMiddleware(app.asgi_app)
|
||||
|
||||
|
||||
from hypercorn.middleware import ProxyFixMiddleware
|
||||
# trust a single proxy hop; use legacy X-Forwarded-* headers
|
||||
app.asgi_app = ProxyFixMiddleware(app.asgi_app, mode="legacy", trusted_hops=1)
|
||||
Reference in New Issue
Block a user