|
79 | 79 | from .vendored import requests
|
80 | 80 | from .vendored.requests.adapters import HTTPAdapter
|
81 | 81 | from .vendored.requests.auth import AuthBase
|
82 |
| -from .vendored.requests.exceptions import ConnectionError, ConnectTimeout, ReadTimeout, SSLError |
| 82 | +from .vendored.requests.exceptions import ConnectionError, ConnectTimeout, InvalidProxyURL, ReadTimeout, SSLError |
| 83 | +from .vendored.requests.utils import prepend_scheme_if_needed, select_proxy |
83 | 84 | from .vendored.urllib3.exceptions import ProtocolError, ReadTimeoutError
|
| 85 | +from .vendored.urllib3.util.url import parse_url |
84 | 86 |
|
85 | 87 | logger = logging.getLogger(__name__)
|
86 | 88 |
|
@@ -168,6 +170,32 @@ def is_retryable_http_code(code: int) -> bool:
|
168 | 170 | )
|
169 | 171 |
|
170 | 172 |
|
| 173 | +class ProxySupportAdapter(HTTPAdapter): |
| 174 | + """This Adapter creates proper headers for Proxy CONNECT messages.""" |
| 175 | + |
| 176 | + def get_connection(self, url, proxies=None): |
| 177 | + proxy = select_proxy(url, proxies) |
| 178 | + parsed_url = urlparse(url) |
| 179 | + |
| 180 | + if proxy: |
| 181 | + proxy = prepend_scheme_if_needed(proxy, 'http') |
| 182 | + proxy_url = parse_url(proxy) |
| 183 | + if not proxy_url.host: |
| 184 | + raise InvalidProxyURL("Please check proxy URL. It is malformed" |
| 185 | + " and could be missing the host.") |
| 186 | + proxy_manager = self.proxy_manager_for(proxy) |
| 187 | + |
| 188 | + # Add Host to proxy header SNOW-232777 |
| 189 | + proxy_manager.proxy_headers['Host'] = parsed_url.hostname |
| 190 | + conn = proxy_manager.connection_from_url(url) |
| 191 | + else: |
| 192 | + # Only scheme should be lower case |
| 193 | + url = parsed_url.geturl() |
| 194 | + conn = self.poolmanager.connection_from_url(url) |
| 195 | + |
| 196 | + return conn |
| 197 | + |
| 198 | + |
171 | 199 | class RetryRequest(Exception):
|
172 | 200 | """Signal to retry request."""
|
173 | 201 | pass
|
@@ -897,8 +925,8 @@ def _request_exec(
|
897 | 925 |
|
898 | 926 | def make_requests_session(self):
|
899 | 927 | s = requests.Session()
|
900 |
| - s.mount('http://', HTTPAdapter(max_retries=REQUESTS_RETRY)) |
901 |
| - s.mount('https://', HTTPAdapter(max_retries=REQUESTS_RETRY)) |
| 928 | + s.mount('http://', ProxySupportAdapter(max_retries=REQUESTS_RETRY)) |
| 929 | + s.mount('https://', ProxySupportAdapter(max_retries=REQUESTS_RETRY)) |
902 | 930 | s._reuse_count = itertools.count()
|
903 | 931 | return s
|
904 | 932 |
|
|
0 commit comments