Skip to content

Commit 29fd011

Browse files
Improve proxy support for the federation_client.py dev script (#19300)
Co-authored-by: Andrew Morgan <[email protected]>
1 parent 0f2b295 commit 29fd011

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

changelog.d/19300.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve proxy support for the `federation_client.py` dev script. Contributed by Denis Kasak (@dkasak).

scripts-dev/federation_client.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def request(
145145
print("Requesting %s" % dest, file=sys.stderr)
146146

147147
s = requests.Session()
148-
s.mount("matrix-federation://", MatrixConnectionAdapter())
148+
s.mount("matrix-federation://", MatrixConnectionAdapter(verify_tls=verify_tls))
149149

150150
headers: dict[str, str] = {
151151
"Authorization": authorization_headers[0],
@@ -267,6 +267,17 @@ def read_args_from_config(args: argparse.Namespace) -> None:
267267

268268

269269
class MatrixConnectionAdapter(HTTPAdapter):
270+
"""
271+
A Matrix federation-aware HTTP Adapter.
272+
"""
273+
274+
verify_tls: bool
275+
"""whether to verify the remote server's TLS certificate."""
276+
277+
def __init__(self, verify_tls: bool = True) -> None:
278+
self.verify_tls = verify_tls
279+
super().__init__()
280+
270281
def send(
271282
self,
272283
request: PreparedRequest,
@@ -280,7 +291,7 @@ def send(
280291
assert isinstance(request.url, str)
281292
parsed = urlparse.urlsplit(request.url)
282293
server_name = parsed.netloc
283-
well_known = self._get_well_known(parsed.netloc)
294+
well_known = self._get_well_known(parsed.netloc, verify_tls=self.verify_tls)
284295

285296
if well_known:
286297
server_name = well_known
@@ -318,6 +329,21 @@ def get_connection_with_tls_context(
318329
print(
319330
f"Connecting to {host}:{port} with SNI {ssl_server_name}", file=sys.stderr
320331
)
332+
333+
if proxies:
334+
scheme = parsed.scheme
335+
if isinstance(scheme, bytes):
336+
scheme = scheme.decode("utf-8")
337+
338+
proxy_for_scheme = proxies.get(scheme)
339+
if proxy_for_scheme:
340+
return self.proxy_manager_for(proxy_for_scheme).connection_from_host(
341+
host,
342+
port=port,
343+
scheme="https",
344+
pool_kwargs={"server_hostname": ssl_server_name},
345+
)
346+
321347
return self.poolmanager.connection_from_host(
322348
host,
323349
port=port,
@@ -368,7 +394,7 @@ def _lookup(server_name: str) -> tuple[str, int, str]:
368394
return server_name, 8448, server_name
369395

370396
@staticmethod
371-
def _get_well_known(server_name: str) -> str | None:
397+
def _get_well_known(server_name: str, verify_tls: bool = True) -> str | None:
372398
if ":" in server_name:
373399
# explicit port, or ipv6 literal. Either way, no .well-known
374400
return None
@@ -379,7 +405,7 @@ def _get_well_known(server_name: str) -> str | None:
379405
print(f"fetching {uri}", file=sys.stderr)
380406

381407
try:
382-
resp = requests.get(uri)
408+
resp = requests.get(uri, verify=verify_tls)
383409
if resp.status_code != 200:
384410
print("%s gave %i" % (uri, resp.status_code), file=sys.stderr)
385411
return None

0 commit comments

Comments
 (0)