from ..dependencies import brotli, requests, urllib3
from ..utils import bug_reports_message, int_or_none, variadic
+from ..utils.networking import normalize_url
if requests is None:
raise ImportError('requests module is not installed')
"""
Ensure unified redirect method handling with our urllib redirect handler.
"""
+
def rebuild_method(self, prepared_request, response):
new_method = get_redirect_method(prepared_request.method, response.status_code)
prepared_request.method = new_method
+ # Requests fails to resolve dot segments on absolute redirect locations
+ # See: https://github.com/yt-dlp/yt-dlp/issues/9020
+ prepared_request.url = normalize_url(prepared_request.url)
+
def rebuild_auth(self, prepared_request, response):
# HACK: undo status code change from rebuild_method, if applicable.
# rebuild_auth runs after requests would remove headers/body based on status code
class Urllib3LoggingHandler(logging.Handler):
"""Redirect urllib3 logs to our logger"""
+
def __init__(self, logger, *args, **kwargs):
super().__init__(*args, **kwargs)
self._logger = logger
# Forward urllib3 debug messages to our logger
logger = logging.getLogger('urllib3')
- handler = Urllib3LoggingHandler(logger=self._logger)
- handler.setFormatter(logging.Formatter('requests: %(message)s'))
- handler.addFilter(Urllib3LoggingFilter())
- logger.addHandler(handler)
+ self.__logging_handler = Urllib3LoggingHandler(logger=self._logger)
+ self.__logging_handler.setFormatter(logging.Formatter('requests: %(message)s'))
+ self.__logging_handler.addFilter(Urllib3LoggingFilter())
+ logger.addHandler(self.__logging_handler)
# TODO: Use a logger filter to suppress pool reuse warning instead
logger.setLevel(logging.ERROR)
def close(self):
self._clear_instances()
+ # Remove the logging handler that contains a reference to our logger
+ # See: https://github.com/yt-dlp/yt-dlp/issues/8922
+ logging.getLogger('urllib3').removeHandler(self.__logging_handler)
def _check_extensions(self, extensions):
super()._check_extensions(extensions)
self, f'Connection to {self.host} timed out. (connect timeout={self.timeout})') from e
except SocksProxyError as e:
raise urllib3.exceptions.ProxyError(str(e), e) from e
- except (OSError, socket.error) as e:
+ except OSError as e:
raise urllib3.exceptions.NewConnectionError(
self, f'Failed to establish a new connection: {e}') from e