import json from fastapi import FastAPI, Request, HTTPException MAX_WEBHOOK_BODY_BYTES = 1 * 1024 * 1024 DEFAULT_WEBHOOK_PATH = "/api/channel/webex/webhook" def create_webhook_app( verify_signature, handle_webhook, webhook_path: str = DEFAULT_WEBHOOK_PATH, ) -> FastAPI: app = FastAPI(title="Cisco Webex Webhook", docs_url=None, redoc_url=None) @app.post(webhook_path) async def webhook_endpoint(request: Request): body = await request.body() if len(body) > MAX_WEBHOOK_BODY_BYTES: raise HTTPException(status_code=413, detail="Payload too large") x_spark_signature = request.headers.get("X-Spark-Signature", "") if not verify_signature(body, x_spark_signature): raise HTTPException(status_code=401, detail="Invalid signature") payload = json.loads(body.decode()) result = await handle_webhook(payload) return result @app.get(webhook_path) async def health_check(): return {"status": "healthy", "channel": "webex"} return app