47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Optional
|
|
|
|
from core.logger import get_logger
|
|
|
|
|
|
logger = get_logger("core.webhook_server")
|
|
|
|
|
|
class WebhookServer:
|
|
def __init__(self, app: "OverUB", host: str, port: int) -> None:
|
|
self.app = app
|
|
self.host = host
|
|
self.port = port
|
|
self._runner = None
|
|
|
|
async def start(self) -> None:
|
|
try:
|
|
from aiohttp import web
|
|
except ImportError:
|
|
logger.warning("aiohttp not installed, webhook server disabled")
|
|
return
|
|
|
|
async def handler(request: web.Request) -> web.Response:
|
|
payload = await request.json()
|
|
signature = request.headers.get("X-Gitea-Signature", "")
|
|
try:
|
|
await self.app.update_service.handle_webhook(payload, signature)
|
|
except Exception as exc:
|
|
logger.exception("Webhook handling failed")
|
|
return web.Response(status=400, text=str(exc))
|
|
return web.Response(text="ok")
|
|
|
|
web_app = web.Application()
|
|
web_app.add_routes([web.post("/webhook/gitea", handler)])
|
|
self._runner = web.AppRunner(web_app)
|
|
await self._runner.setup()
|
|
site = web.TCPSite(self._runner, self.host, self.port)
|
|
await site.start()
|
|
logger.info("Webhook server started on %s:%s", self.host, self.port)
|
|
|
|
async def stop(self) -> None:
|
|
if self._runner:
|
|
await self._runner.cleanup()
|
|
self._runner = None
|