mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2025-08-01 07:38:25 +02: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:
parent
db97438940
commit
db7b054a61
3 changed files with 65 additions and 11 deletions
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue