Skip to content

Commit 265a3ab

Browse files
authored
Properly parse proxy urls with credentials in them (#242)
1 parent 31b373d commit 265a3ab

File tree

3 files changed

+17
-15
lines changed

3 files changed

+17
-15
lines changed

cloudfoundry_client/doppler/client.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,20 @@ class DopplerClient(object):
1919
def __init__(self, doppler_endpoint: str, proxy: str, verify_ssl: bool, credentials_manager: CredentialManager):
2020
self.proxy_host = None
2121
self.proxy_port = None
22+
self.proxy_auth = None
2223
self.ws_doppler_endpoint = doppler_endpoint
2324
self.http_doppler_endpoint = re.sub("^ws", "http", doppler_endpoint)
2425
self.verify_ssl = verify_ssl
2526
self.credentials_manager = credentials_manager
2627
if proxy is not None and len(proxy) > 0:
27-
proxy_domain = urlparse(proxy).netloc
28-
idx = proxy_domain.find(":")
29-
if 0 < idx < len(proxy_domain) - 2:
30-
self.proxy_host = proxy_domain[:idx]
31-
self.proxy_port = int(proxy_domain[idx + 1 :])
28+
proxy_parsed = urlparse(proxy)
29+
self.proxy_host = proxy_parsed.hostname
30+
if proxy_parsed.port is not None:
31+
self.proxy_port = proxy_parsed.port
32+
else:
33+
self.proxy_port = 443 if proxy_parsed.scheme == "https" else 80
34+
if proxy_parsed.username is not None and proxy_parsed.password is not None:
35+
self.proxy_auth = (proxy_parsed.username, proxy_parsed.password)
3236

3337
def recent_logs(self, app_guid: str) -> EnvelopeStream:
3438
url = "%s/apps/%s/recentlogs" % (self.http_doppler_endpoint, app_guid)
@@ -46,6 +50,7 @@ def stream_logs(self, app_guid: str) -> EnvelopeStream:
4650
verify_ssl=self.verify_ssl,
4751
proxy_host=self.proxy_host,
4852
proxy_port=self.proxy_port,
53+
proxy_auth=self.proxy_auth,
4954
) as websocket:
5055
for message in websocket:
5156
yield DopplerClient._parse_envelope(message)

cloudfoundry_client/doppler/websocket_envelope_reader.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import ssl
2-
from typing import Callable, Optional
2+
from typing import Callable, Optional, Tuple
33

44
import websocket
55

@@ -12,6 +12,7 @@ def __init__(
1212
verify_ssl: bool = True,
1313
proxy_host: Optional[str] = None,
1414
proxy_port: Optional[int] = None,
15+
proxy_auth: Optional[Tuple[str, str]] = None,
1516
):
1617
if not verify_ssl:
1718
self._ws = websocket.WebSocket(sslopt=dict(cert_reqs=ssl.CERT_NONE))
@@ -20,13 +21,15 @@ def __init__(
2021
self._url = url
2122
self._proxy_host = proxy_host
2223
self._proxy_port = proxy_port
24+
self._proxy_auth = proxy_auth
2325
self._access_token_provider = access_token_provider
2426

2527
def connect(self):
2628
kw_args = dict(header=dict(Authorization="Bearer %s" % self._access_token_provider()))
2729
if self._proxy_host is not None and self._proxy_port is not None:
2830
kw_args["http_proxy_host"] = self._proxy_host
2931
kw_args["http_proxy_port"] = str(self._proxy_port)
32+
kw_args["http_proxy_auth"] = self._proxy_auth
3033
self._ws.connect(self._url, **kw_args)
3134

3235
def close(self):

cloudfoundry_client/rlpgateway/client.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import logging
2-
from urllib.parse import urlparse
32

43
import aiohttp
54

@@ -15,18 +14,13 @@ class RLPGatewayClient(object):
1514
"""
1615

1716
def __init__(self, rlp_gateway_endpoint, proxy, verify_ssl, credentials_manager):
18-
self.proxy_host = None
19-
self.proxy_port = None
17+
self.proxy = None
2018
self.rlp_gateway_endpoint = rlp_gateway_endpoint
2119
self.verify_ssl = verify_ssl
2220
self.credentials_manager = credentials_manager
2321

2422
if proxy is not None and len(proxy) > 0:
25-
proxy_domain = urlparse(proxy).netloc
26-
idx = proxy_domain.find(":")
27-
if 0 < idx < len(proxy_domain) - 2:
28-
self.proxy_host = proxy_domain[:idx]
29-
self.proxy_port = int(proxy_domain[idx + 1 :])
23+
self.proxy = proxy
3024

3125
async def stream_logs(self, app_guid, **kwargs):
3226
url = f"{self.rlp_gateway_endpoint}/v2/read"
@@ -40,7 +34,7 @@ async def stream_logs(self, app_guid, **kwargs):
4034
headers.update(kwargs["headers"])
4135
if "params" in kwargs:
4236
params.update(kwargs["params"])
43-
async with aiohttp.ClientSession(headers=headers) as session:
37+
async with aiohttp.ClientSession(headers=headers, proxy=self.proxy) as session:
4438
async with session.get(url=url, params=params) as response:
4539
if response.status == 204:
4640
yield {}

0 commit comments

Comments
 (0)