From 3305a25da469635574e84e5c2479fd34ba02c6ef Mon Sep 17 00:00:00 2001 From: Izalia Mae Date: Thu, 10 Nov 2022 12:40:48 -0500 Subject: [PATCH] create View class and fix Response.new_error --- relay/misc.py | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/relay/misc.py b/relay/misc.py index 8b41199..f56c0db 100644 --- a/relay/misc.py +++ b/relay/misc.py @@ -10,7 +10,8 @@ from Crypto.Hash import SHA, SHA256, SHA512 from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from aiohttp import ClientSession -from aiohttp.web import Response as AiohttpResponse +from aiohttp.hdrs import METH_ALL as METHODS +from aiohttp.web import Response as AiohttpResponse, View as AiohttpView from datetime import datetime from json.decoder import JSONDecodeError from urllib.parse import urlparse @@ -31,7 +32,7 @@ MIMETYPES = { 'activity': 'application/activity+json', 'html': 'text/html', 'json': 'application/json', - 'plain': 'text/plain' + 'text': 'text/plain' } NODEINFO_NS = { @@ -483,7 +484,7 @@ class Response(AiohttpResponse): @classmethod - def new_error(cls, status, body, ctype='plain'): + def new_error(cls, status, body, ctype='text'): if ctype == 'json': body = json.dumps({'status': status, 'error': body}) @@ -500,6 +501,39 @@ class Response(AiohttpResponse): self.headers['Location'] = value +class View(AiohttpView): + async def _iter(self): + if self.request.method not in METHODS: + self._raise_allowed_methods() + + method = getattr(self, self.request.method.lower(), None) + + if method is None: + self._raise_allowed_methods() + + return await method(**self.request.match_info) + + + @property + def app(self): + return self._request.app + + + @property + def cache(self): + return self.app.cache + + + @property + def config(self): + return self.app.config + + + @property + def database(self): + return self.app.database + + class WKNodeinfo(DotDict): @classmethod def new(cls, v20, v21):