Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 372432e

Browse files
SNOW-232777 Subclass-ed HTTPAdapter to add the header to proxy headers (snowflakedb#599)
* Subclass-ed HTTPAdapter to add the header to proxy headers
1 parent d935d53 commit 372432e

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

src/snowflake/connector/network.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,10 @@
7979
from .vendored import requests
8080
from .vendored.requests.adapters import HTTPAdapter
8181
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
8384
from .vendored.urllib3.exceptions import ProtocolError, ReadTimeoutError
85+
from .vendored.urllib3.util.url import parse_url
8486

8587
logger = logging.getLogger(__name__)
8688

@@ -168,6 +170,32 @@ def is_retryable_http_code(code: int) -> bool:
168170
)
169171

170172

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+
171199
class RetryRequest(Exception):
172200
"""Signal to retry request."""
173201
pass
@@ -897,8 +925,8 @@ def _request_exec(
897925

898926
def make_requests_session(self):
899927
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))
902930
s._reuse_count = itertools.count()
903931
return s
904932

0 commit comments

Comments
 (0)