38 lines
1.0 KiB
Python
38 lines
1.0 KiB
Python
|
|
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
|