Add logic to recreate conn if one is terminated

This commit is contained in:
syeopite 2021-05-23 03:57:47 -07:00
parent a972722fdb
commit 43957e90ec
No known key found for this signature in database
GPG Key ID: 6FA616E5A5294A82
1 changed files with 21 additions and 10 deletions

View File

@ -9,7 +9,6 @@ import collections
import time import time
import logging import logging
from urllib.parse import urlparse from urllib.parse import urlparse
from typing import cast
from aioquic.asyncio.protocol import QuicConnectionProtocol from aioquic.asyncio.protocol import QuicConnectionProtocol
from aioquic.h3.connection import H3_ALPN, H3Connection from aioquic.h3.connection import H3_ALPN, H3Connection
@ -17,8 +16,9 @@ from aioquic.h3.events import (
DataReceived, DataReceived,
HeadersReceived, HeadersReceived,
) )
from aioquic.quic.events import ConnectionTerminated
from aioquic.quic.configuration import QuicConfiguration from aioquic.quic.configuration import QuicConfiguration
from aioquic.asyncio.client import connect as connect_quic_client from aioquic.asyncio.client import connect
logger = logging.getLogger("client") logger = logging.getLogger("client")
logger.setLevel(logging.INFO) logger.setLevel(logging.INFO)
@ -181,16 +181,27 @@ class RequestProcessor:
def __init__(self): def __init__(self):
# {InvidiousRequest, storage_dict} # {InvidiousRequest, storage_dict}
self.requests_to_do = asyncio.Queue(0) self.requests_to_do = asyncio.Queue(0)
self.processors = []
async def request_worker(self): async def request_worker(self):
configuration = QuicConfiguration(is_client=True, alpn_protocols=H3_ALPN) configuration = QuicConfiguration(is_client=True, alpn_protocols=H3_ALPN)
async with connect_quic_client("youtube.com", 443, configuration=configuration,
create_protocol=HttpClient) as client:
while True:
request, storage = await self.requests_to_do.get()
await perform_http_request(client=client, url=request.url, method=request.method, while self.recreate_connection_check():
headers=request.headers, data=request.content, async with connect("youtube.com", 443, configuration=configuration, create_protocol=HttpClient) as client:
store_at=storage) while client._quic._state is not ConnectionTerminated:
await self._handle_request(client)
request.completed.set() async def _handle_request(self, client):
request, storage = await self.requests_to_do.get()
await perform_http_request(client=client, url=request.url, method=request.method,
headers=request.headers, data=request.content,
store_at=storage)
request.completed.set()
def recreate_connection_check(self):
# TODO in the future this code should calculate whether or not to recreate a connection based on the amount
# of connections currently available and the amount of traffic we're currently receiving. For now we'll
# just have it recreate a connection anytime it's broken.
return True