diff --git a/changelog.d/15578.misc b/changelog.d/15578.misc new file mode 100644 index 000000000000..a54422239bb9 --- /dev/null +++ b/changelog.d/15578.misc @@ -0,0 +1 @@ +Allow connecting to HTTP Replication Endpoints by using `worker_name` when constructing the request. diff --git a/synapse/http/replicationagent.py b/synapse/http/replicationagent.py index 0b8259b33bfc..62e2fdd2db41 100644 --- a/synapse/http/replicationagent.py +++ b/synapse/http/replicationagent.py @@ -60,11 +60,18 @@ def endpointForURI(self, uri: URI) -> IStreamClientEndpoint: Returns: The correct client endpoint object """ + # The place to connect to now comes in as the name of the worker, similar to + # a hostname in placement. Use the instance_map data to get the actual + # connection information. + netloc = self.instance_map[uri.netloc.decode("utf-8")].netloc() if uri.scheme in (b"http", b"https"): - endpoint = HostnameEndpoint(self.reactor, uri.host, uri.port) + host, port = netloc.split(":", maxsplit=1) + endpoint = HostnameEndpoint(self.reactor, host, int(port)) if uri.scheme == b"https": endpoint = wrapClientTLS( - self.context_factory.creatorForNetloc(uri.host, uri.port), endpoint + # The 'port' argument below isn't actually used by the function + self.context_factory.creatorForNetloc(host, port), + endpoint, ) return endpoint else: diff --git a/synapse/replication/http/_base.py b/synapse/replication/http/_base.py index dc7820f9637d..4423f5708baf 100644 --- a/synapse/replication/http/_base.py +++ b/synapse/replication/http/_base.py @@ -219,11 +219,7 @@ async def send_request( with outgoing_gauge.track_inprogress(): if instance_name == local_instance_name: raise Exception("Trying to send HTTP request to self") - if instance_name in instance_map: - host = instance_map[instance_name].host - port = instance_map[instance_name].port - tls = instance_map[instance_name].tls - else: + if instance_name not in instance_map: raise Exception( "Instance %r not in 'instance_map' config" % (instance_name,) ) @@ -271,13 +267,11 @@ async def send_request( "Unknown METHOD on %s replication endpoint" % (cls.NAME,) ) - # Here the protocol is hard coded to be http by default or https in case the replication - # port is set to have tls true. - scheme = "https" if tls else "http" - uri = "%s://%s:%s/_synapse/replication/%s/%s" % ( - scheme, - host, - port, + # Use the instance_map data to retrieve the correct scheme and use the + # instance_name to abstract the connection details into the Agent + uri = "%s://%s/_synapse/replication/%s/%s" % ( + instance_map[instance_name].scheme(), + instance_name, cls.NAME, "/".join(url_args), )