mirror of
https://git.pleroma.social/pleroma/relay.git
synced 2024-11-23 23:17:58 +00:00
Fix error on 'relay inbox follow'
This commit is contained in:
parent
af7fcc66fd
commit
9842494fc6
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -99,3 +99,9 @@ viera.jsonld
|
|||
|
||||
# config file
|
||||
relay.yaml
|
||||
|
||||
# JSON-LD file
|
||||
relay.jsonld
|
||||
|
||||
# VS Code Launch Configuration
|
||||
launch.json
|
|
@ -36,34 +36,30 @@ class HttpClient:
|
|||
self._conn = None
|
||||
self._session = None
|
||||
|
||||
|
||||
@property
|
||||
def limit(self):
|
||||
return self.cfg['limit']
|
||||
|
||||
|
||||
@property
|
||||
def timeout(self):
|
||||
return self.cfg['timeout']
|
||||
|
||||
|
||||
async def open(self):
|
||||
if self._session:
|
||||
return
|
||||
|
||||
self._conn = TCPConnector(
|
||||
limit = self.limit,
|
||||
ttl_dns_cache = 300,
|
||||
limit=self.limit,
|
||||
ttl_dns_cache=300,
|
||||
)
|
||||
|
||||
self._session = ClientSession(
|
||||
connector = self._conn,
|
||||
headers = HEADERS,
|
||||
connector_owner = True,
|
||||
timeout = ClientTimeout(total=self.timeout)
|
||||
connector=self._conn,
|
||||
headers=HEADERS,
|
||||
connector_owner=True,
|
||||
timeout=ClientTimeout(total=self.timeout)
|
||||
)
|
||||
|
||||
|
||||
async def close(self):
|
||||
if not self._session:
|
||||
return
|
||||
|
@ -74,12 +70,13 @@ class HttpClient:
|
|||
self._conn = None
|
||||
self._session = None
|
||||
|
||||
|
||||
async def get(self, url, sign_headers=False, loads=None, force=False):
|
||||
await self.open()
|
||||
|
||||
try: url, _ = url.split('#', 1)
|
||||
except: pass
|
||||
try:
|
||||
url, _ = url.split('#', 1)
|
||||
except:
|
||||
pass
|
||||
|
||||
if not force and url in self.cache:
|
||||
return self.cache[url]
|
||||
|
@ -87,18 +84,20 @@ class HttpClient:
|
|||
headers = {}
|
||||
|
||||
if sign_headers:
|
||||
headers.update(self.database.signer.sign_headers('GET', url, algorithm='original'))
|
||||
headers.update(self.database.signer.sign_headers(
|
||||
'GET', url, algorithm='original'))
|
||||
|
||||
try:
|
||||
logging.verbose(f'Fetching resource: {url}')
|
||||
|
||||
async with self._session.get(url, headers=headers) as resp:
|
||||
## Not expecting a response with 202s, so just return
|
||||
# Not expecting a response with 202s, so just return
|
||||
if resp.status == 202:
|
||||
return
|
||||
|
||||
elif resp.status != 200:
|
||||
logging.verbose(f'Received error when requesting {url}: {resp.status}')
|
||||
logging.verbose(
|
||||
f'Received error when requesting {url}: {resp.status}')
|
||||
logging.verbose(await resp.read()) # change this to debug
|
||||
return
|
||||
|
||||
|
@ -113,7 +112,8 @@ class HttpClient:
|
|||
|
||||
else:
|
||||
# todo: raise TypeError or something
|
||||
logging.verbose(f'Invalid Content-Type for "{url}": {resp.content_type}')
|
||||
logging.verbose(
|
||||
f'Invalid Content-Type for "{url}": {resp.content_type}')
|
||||
return logging.debug(f'Response: {resp.read()}')
|
||||
|
||||
logging.debug(f'{url} >> resp {message.to_json(4)}')
|
||||
|
@ -131,13 +131,10 @@ class HttpClient:
|
|||
traceback.print_exc()
|
||||
raise e
|
||||
|
||||
|
||||
async def post(self, url, message):
|
||||
await self.open()
|
||||
|
||||
instance = self.database.get_inbox(url)
|
||||
|
||||
## Using the old algo by default is probably a better idea right now
|
||||
# Using the old algo by default is probably a better idea right now
|
||||
if instance and instance.get('software') in {'mastodon'}:
|
||||
algorithm = 'hs2019'
|
||||
|
||||
|
@ -145,37 +142,74 @@ class HttpClient:
|
|||
algorithm = 'original'
|
||||
|
||||
headers = {'Content-Type': 'application/activity+json'}
|
||||
headers.update(self.database.signer.sign_headers('POST', url, message, algorithm=algorithm))
|
||||
headers.update(self.database.signer.sign_headers(
|
||||
'POST', url, message, algorithm=algorithm))
|
||||
|
||||
try:
|
||||
logging.verbose(f'Sending "{message.type}" to {url}')
|
||||
logging.verbose(
|
||||
f'url: {url}\nheaders: {headers}\ndata: {message.to_json()}')
|
||||
|
||||
async with self._session.post(url, headers=headers, data=message.to_json()) as resp:
|
||||
## Not expecting a response, so just return
|
||||
# The following does not work and throws exception on 'relay inbox follow':
|
||||
# Traceback (most recent call last):
|
||||
# File "/home/vriess/Dokumente/Repos/relay-1/relay/http_client.py", line 153, in post
|
||||
# async with self._session.post(url, headers=headers, data=message.to_json()) as resp:
|
||||
# File "/home/vriess/Dokumente/Repos/relay-1/.venv/lib/python3.10/site-packages/aiohttp/client.py", line 1141, in __aenter__
|
||||
# self._resp = await self._coro
|
||||
# File "/home/vriess/Dokumente/Repos/relay-1/.venv/lib/python3.10/site-packages/aiohttp/client.py", line 448, in _request
|
||||
# handle = tm.start()
|
||||
# File "/home/vriess/Dokumente/Repos/relay-1/.venv/lib/python3.10/site-packages/aiohttp/helpers.py", line 651, in start
|
||||
# return self._loop.call_at(when, self.__call__)
|
||||
# File "/usr/lib/python3.10/asyncio/base_events.py", line 732, in call_at
|
||||
# self._check_closed()
|
||||
# File "/usr/lib/python3.10/asyncio/base_events.py", line 515, in _check_closed
|
||||
# raise RuntimeError('Event loop is closed')
|
||||
# RuntimeError: Event loop is closed
|
||||
# ↓↓↓↓
|
||||
# async with self._session.post(url, headers=headers, data=message.to_json()) as resp:
|
||||
# ## Not expecting a response, so just return
|
||||
# if resp.status in {200, 202}:
|
||||
# return logging.info(f'Successfully sent "{message.type}" to {url}')
|
||||
|
||||
# logging.info(f'Received error when pushing to {url}: {resp.status}')
|
||||
# return logging.info(await resp.read()) # change this to debug
|
||||
|
||||
# Creating a session here works for some reason and does not throw an error
|
||||
async with ClientSession(
|
||||
connector=TCPConnector(
|
||||
limit=self.limit, ttl_dns_cache=300),
|
||||
headers=HEADERS,
|
||||
connector_owner=True,
|
||||
timeout=ClientTimeout(total=self.timeout)) as session:
|
||||
async with session.post(url, headers=headers, data=message.to_json()) as resp:
|
||||
# Not expecting a response, so just return
|
||||
if resp.status in {200, 202}:
|
||||
return logging.verbose(f'Successfully sent "{message.type}" to {url}')
|
||||
return logging.info(f'Successfully sent "{message.type}" to {url}')
|
||||
|
||||
logging.verbose(f'Received error when pushing to {url}: {resp.status}')
|
||||
return logging.verbose(await resp.read()) # change this to debug
|
||||
logging.info(
|
||||
f'Received error when pushing to {url}: {resp.status}')
|
||||
# change this to debug
|
||||
return logging.info(await resp.read())
|
||||
|
||||
except (ClientConnectorError, ServerTimeoutError):
|
||||
logging.verbose(f'Failed to connect to {url}')
|
||||
|
||||
## prevent workers from being brought down
|
||||
# prevent workers from being brought down
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
## Additional methods ##
|
||||
|
||||
async def fetch_nodeinfo(self, domain):
|
||||
nodeinfo_url = None
|
||||
wk_nodeinfo = await self.get(
|
||||
f'https://{domain}/.well-known/nodeinfo',
|
||||
loads = WellKnownNodeinfo.new_from_json
|
||||
loads=WellKnownNodeinfo.new_from_json
|
||||
)
|
||||
|
||||
if not wk_nodeinfo:
|
||||
logging.verbose(f'Failed to fetch well-known nodeinfo url for domain: {domain}')
|
||||
logging.verbose(
|
||||
f'Failed to fetch well-known nodeinfo url for domain: {domain}')
|
||||
return False
|
||||
|
||||
for version in ['20', '21']:
|
||||
|
@ -186,7 +220,8 @@ class HttpClient:
|
|||
pass
|
||||
|
||||
if not nodeinfo_url:
|
||||
logging.verbose(f'Failed to fetch nodeinfo url for domain: {domain}')
|
||||
logging.verbose(
|
||||
f'Failed to fetch nodeinfo url for domain: {domain}')
|
||||
return False
|
||||
|
||||
return await self.get(nodeinfo_url, loads=Nodeinfo.new_from_json) or False
|
||||
|
|
Loading…
Reference in a new issue