Switched from httpx to aiohttp. Hopefully fixes some SSL handshake issues

This commit is contained in:
2025-09-03 08:17:07 +02:00
parent 324f75d100
commit 5b1b43f9ad

View File

@@ -1,36 +1,38 @@
from mem import services, service, db, app from mem import services, service, db, app
import httpx import aiohttp
import asyncio import asyncio
import time import time
from models import log from models import log
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
async def check_service(client: httpx.AsyncClient, s: service) -> log: async def check_service(client: aiohttp.ClientSession, s: service) -> log:
try: try:
timeout = aiohttp.client.ClientTimeout(total=4)
before = time.perf_counter() before = time.perf_counter()
match s.ping_type: match s.ping_type:
case 0: case 0:
r = await client.head( r = await client.head(
url=s.url, url=s.url,
follow_redirects=True, ssl=True if s.public else False,
timeout=4, allow_redirects=True,
timeout=timeout,
) )
case 1: case 1:
r = await client.get( r = await client.get(
url=s.url, url=s.url,
follow_redirects=True, ssl=True if s.public else False,
timeout=4, allow_redirects=True,
headers={"Host": "plex.ihatemen.uk"}, timeout=timeout,
) )
case _: case _:
raise httpx.HTTPError("Unknown ping type") raise Exception("UNKNOWN PING TYPE")
after = time.perf_counter() after = time.perf_counter()
s.set_error(None) s.set_error(None)
s.set_online(r.status_code == 200) s.set_online(r.status == 200)
s.set_status(r.status_code) s.set_status(r.status)
s.set_ping(int((after - before) * 1000)) s.set_ping(int((after - before) * 1000))
except httpx.ConnectTimeout: except aiohttp.ConnectionTimeoutError:
s.set_error("Connection Timeout") s.set_error("Connection Timeout")
s.set_online(False) s.set_online(False)
s.set_status(None) s.set_status(None)
@@ -60,24 +62,18 @@ async def update_services(loop: asyncio.AbstractEventLoop):
print("Starting service updates...") print("Starting service updates...")
with app.app_context(): with app.app_context():
WorkerSession = sessionmaker(bind=db.engine) WorkerSession = sessionmaker(bind=db.engine)
async with ( client = aiohttp.ClientSession()
httpx.AsyncClient() as public_client, while True:
httpx.AsyncClient(verify=False) as local_client, session = WorkerSession()
): tasks = [check_service(client=client, s=s) for s in services]
while True: tasks.append(sleepTask())
session = WorkerSession() logs = await asyncio.gather(*tasks)
tasks = [ logs = logs[:-1]
check_service(public_client if s.public else local_client, s) try:
for s in services session.add_all(logs)
] session.commit()
tasks.append(sleepTask()) except Exception as e:
logs = await asyncio.gather(*tasks) session.rollback()
logs = logs[:-1] raise e
try: finally:
session.add_all(logs) session.close()
session.commit()
except Exception as e:
session.rollback()
raise e
finally:
session.close()