mirror of
https://github.com/nexus-stc/hyperboria
synced 2024-12-03 08:22:53 +01:00
43be16e4bc
- [nexus] Remove outdated protos - [nexus] Development - [nexus] Development - [nexus] Development - [nexus] Development - [nexus] Development - [nexus] Refactor views - [nexus] Update aiosumma - [nexus] Add tags - [nexus] Development - [nexus] Update repository - [nexus] Update repository - [nexus] Update dependencies - [nexus] Update dependencies - [nexus] Fixes for MetaAPI - [nexus] Support for new queries - [nexus] Adopt new versions of search - [nexus] Improving Nexus - [nexus] Various fixes - [nexus] Add profile - [nexus] Fixes for ingestion - [nexus] Refactorings and bugfixes - [idm] Add profile methods - [nexus] Fix stalled nexus-meta bugs - [nexus] Various bugfixes - [nexus] Restore IDM API functionality GitOrigin-RevId: a0842345a6dde5b321279ab5510a50c0def0e71a
55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
from typing import Dict
|
|
|
|
import aiohttp.client_exceptions
|
|
from aiohttp_socks import ProxyError
|
|
from nexus.pylon.drivers.base import BaseDriver
|
|
from nexus.pylon.exceptions import (
|
|
BadResponseError,
|
|
NotFoundError,
|
|
)
|
|
from nexus.pylon.prepared_request import PreparedRequest
|
|
from nexus.pylon.proto.file_pb2 import Chunk as ChunkPb
|
|
from nexus.pylon.proto.file_pb2 import FileResponse as FileResponsePb
|
|
from python_socks import ProxyTimeoutError
|
|
from tenacity import (
|
|
retry,
|
|
retry_if_exception_type,
|
|
stop_after_attempt,
|
|
wait_random,
|
|
)
|
|
|
|
|
|
class DirectDriver(BaseDriver):
|
|
allowed_content_type = None
|
|
|
|
@retry(
|
|
reraise=True,
|
|
wait=wait_random(min=1, max=2),
|
|
stop=stop_after_attempt(7),
|
|
retry=retry_if_exception_type((ProxyError, aiohttp.client_exceptions.ClientPayloadError, ProxyTimeoutError)),
|
|
)
|
|
async def execute_prepared_file_request(self, prepared_file_request: PreparedRequest, params: Dict):
|
|
async with self.get_session() as session:
|
|
async with prepared_file_request.execute_with(session=session) as resp:
|
|
if resp.status == 404:
|
|
raise NotFoundError(url=prepared_file_request.url)
|
|
elif (
|
|
resp.status != 200
|
|
or (
|
|
self.allowed_content_type
|
|
and resp.headers.get('Content-Type', '').lower() not in self.allowed_content_type
|
|
)
|
|
):
|
|
raise BadResponseError(
|
|
request_headers=prepared_file_request.headers,
|
|
url=prepared_file_request.url,
|
|
status=resp.status,
|
|
headers=str(resp.headers),
|
|
)
|
|
file_validator = self.validator(params)
|
|
yield FileResponsePb(status=FileResponsePb.Status.BEGIN_TRANSMISSION, source=prepared_file_request.url)
|
|
async for content, _ in resp.content.iter_chunks():
|
|
file_validator.update(content)
|
|
yield FileResponsePb(chunk=ChunkPb(content=content), source=prepared_file_request.url)
|
|
file_validator.validate()
|