| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- from django.conf import settings
- from django.utils.module_loading import import_string
- from urllib.parse import urlparse
- __all__ = (
- 'DefaultProxyRouter',
- 'resolve_proxies',
- )
- class DefaultProxyRouter:
- """
- Base class for a proxy router.
- """
- @staticmethod
- def _get_protocol_from_url(url):
- """
- Determine the applicable protocol (e.g. HTTP or HTTPS) from the given URL.
- """
- return urlparse(url).scheme
- def route(self, url=None, protocol=None, context=None):
- """
- Returns the appropriate proxy given a URL or protocol. Arbitrary context data may also be passed where
- available.
- Args:
- url: The specific request URL for which the proxy will be used (if known)
- protocol: The protocol in use (e.g. http or https) (if known)
- context: Additional context to aid in proxy selection. May include e.g. the requesting client.
- """
- if url and protocol is None:
- protocol = self._get_protocol_from_url(url)
- if protocol and protocol in settings.HTTP_PROXIES:
- return {
- protocol: settings.HTTP_PROXIES[protocol]
- }
- return settings.HTTP_PROXIES
- def resolve_proxies(url=None, protocol=None, context=None):
- """
- Return a dictionary of candidate proxies (compatible with the requests module), or None.
- Args:
- url: The specific request URL for which the proxy will be used (optional)
- protocol: The protocol in use (e.g. http or https) (optional)
- context: Arbitrary additional context to aid in proxy selection (optional)
- """
- context = context or {}
- for item in settings.PROXY_ROUTERS:
- router = import_string(item) if type(item) is str else item
- if proxies := router().route(url=url, protocol=protocol, context=context):
- return proxies
|