mirror of
https://github.com/yt-dlp/yt-dlp
synced 2025-07-03 12:32:52 -05:00
[networking] Add request handler preference framework (#7603)
Preference functions that take a request and a request handler instance can be registered to prioritize different request handlers per request. Authored by: coletdjnz Co-authored-by: pukkandan <pukkandan.ytdlp@gmail.com>
This commit is contained in:
@ -1035,17 +1035,17 @@ class TestRequestDirector:
|
||||
assert isinstance(director.send(Request('http://')), FakeResponse)
|
||||
|
||||
def test_unsupported_handlers(self):
|
||||
director = RequestDirector(logger=FakeLogger())
|
||||
director.add_handler(FakeRH(logger=FakeLogger()))
|
||||
|
||||
class SupportedRH(RequestHandler):
|
||||
_SUPPORTED_URL_SCHEMES = ['http']
|
||||
|
||||
def _send(self, request: Request):
|
||||
return Response(fp=io.BytesIO(b'supported'), headers={}, url=request.url)
|
||||
|
||||
# This handler should by default take preference over FakeRH
|
||||
director = RequestDirector(logger=FakeLogger())
|
||||
director.add_handler(SupportedRH(logger=FakeLogger()))
|
||||
director.add_handler(FakeRH(logger=FakeLogger()))
|
||||
|
||||
# First should take preference
|
||||
assert director.send(Request('http://')).read() == b'supported'
|
||||
assert director.send(Request('any://')).read() == b''
|
||||
|
||||
@ -1072,6 +1072,27 @@ class TestRequestDirector:
|
||||
director.add_handler(UnexpectedRH(logger=FakeLogger))
|
||||
assert director.send(Request('any://'))
|
||||
|
||||
def test_preference(self):
|
||||
director = RequestDirector(logger=FakeLogger())
|
||||
director.add_handler(FakeRH(logger=FakeLogger()))
|
||||
|
||||
class SomeRH(RequestHandler):
|
||||
_SUPPORTED_URL_SCHEMES = ['http']
|
||||
|
||||
def _send(self, request: Request):
|
||||
return Response(fp=io.BytesIO(b'supported'), headers={}, url=request.url)
|
||||
|
||||
def some_preference(rh, request):
|
||||
return (0 if not isinstance(rh, SomeRH)
|
||||
else 100 if 'prefer' in request.headers
|
||||
else -1)
|
||||
|
||||
director.add_handler(SomeRH(logger=FakeLogger()))
|
||||
director.preferences.add(some_preference)
|
||||
|
||||
assert director.send(Request('http://')).read() == b''
|
||||
assert director.send(Request('http://', headers={'prefer': '1'})).read() == b'supported'
|
||||
|
||||
|
||||
# XXX: do we want to move this to test_YoutubeDL.py?
|
||||
class TestYoutubeDLNetworking:
|
||||
|
Reference in New Issue
Block a user