From 6e1ad283cf671e0ff1b04856a2f711643900c436 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 14 May 2015 16:39:19 +0100 Subject: Support gzip encoding for client, client v2 and web client resources (SYN-176). --- synapse/app/homeserver.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index c227265190..dfb5314ff7 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -32,9 +32,9 @@ from synapse.server import HomeServer from twisted.internet import reactor from twisted.application import service from twisted.enterprise import adbapi -from twisted.web.resource import Resource +from twisted.web.resource import Resource, EncodingResourceWrapper from twisted.web.static import File -from twisted.web.server import Site +from twisted.web.server import Site, GzipEncoderFactory from twisted.web.http import proxiedLogFormatter, combinedLogFormatter from synapse.http.server import JsonResource, RootRedirect from synapse.rest.media.v0.content_repository import ContentRepoResource @@ -69,16 +69,26 @@ import subprocess logger = logging.getLogger("synapse.app.homeserver") +class GzipFile(File): + def getChild(self, path, request): + child = File.getChild(self, path, request) + return EncodingResourceWrapper(child, [GzipEncoderFactory()]) + + +def gz_wrap(r): + return EncodingResourceWrapper(r, [GzipEncoderFactory()]) + + class SynapseHomeServer(HomeServer): def build_http_client(self): return MatrixFederationHttpClient(self) def build_resource_for_client(self): - return ClientV1RestResource(self) + return gz_wrap(ClientV1RestResource(self)) def build_resource_for_client_v2_alpha(self): - return ClientV2AlphaRestResource(self) + return gz_wrap(ClientV2AlphaRestResource(self)) def build_resource_for_federation(self): return JsonResource(self) @@ -87,9 +97,10 @@ class SynapseHomeServer(HomeServer): import syweb syweb_path = os.path.dirname(syweb.__file__) webclient_path = os.path.join(syweb_path, "webclient") - return File(webclient_path) # TODO configurable? + return GzipFile(webclient_path) # TODO configurable? def build_resource_for_static_content(self): + # This is old and should go away: not going to bother adding gzip return File("static") def build_resource_for_content_repo(self): -- cgit 1.5.1 From 2b7120e233999c4c89edb46b2714238e828aacc6 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 19 May 2015 12:49:38 +0100 Subject: SYN-383: Handle the fact the server might not have signed things --- synapse/app/homeserver.py | 6 +++--- synapse/crypto/keyring.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index dfb5314ff7..2e11ac062f 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -85,10 +85,10 @@ class SynapseHomeServer(HomeServer): return MatrixFederationHttpClient(self) def build_resource_for_client(self): - return gz_wrap(ClientV1RestResource(self)) + return ClientV1RestResource(self) def build_resource_for_client_v2_alpha(self): - return gz_wrap(ClientV2AlphaRestResource(self)) + return ClientV2AlphaRestResource(self) def build_resource_for_federation(self): return JsonResource(self) @@ -97,7 +97,7 @@ class SynapseHomeServer(HomeServer): import syweb syweb_path = os.path.dirname(syweb.__file__) webclient_path = os.path.join(syweb_path, "webclient") - return GzipFile(webclient_path) # TODO configurable? + return File(webclient_path) # TODO configurable? def build_resource_for_static_content(self): # This is old and should go away: not going to bother adding gzip diff --git a/synapse/crypto/keyring.py b/synapse/crypto/keyring.py index 1f24e58ba0..a061def16a 100644 --- a/synapse/crypto/keyring.py +++ b/synapse/crypto/keyring.py @@ -329,7 +329,7 @@ class Keyring(object): verify_key.time_added = time_now_ms old_verify_keys[key_id] = verify_key - for key_id in response_json["signatures"][server_name]: + for key_id in response_json["signatures"].get(server_name, {}): if key_id not in response_json["verify_keys"]: raise ValueError( "Key response must include verification keys for all" -- cgit 1.5.1 From 677be13ffc5c463acacf2d420ca9c47f2f7cba65 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 19 May 2015 13:12:28 +0100 Subject: Revert accidental commit --- synapse/app/homeserver.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 2e11ac062f..dfb5314ff7 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -85,10 +85,10 @@ class SynapseHomeServer(HomeServer): return MatrixFederationHttpClient(self) def build_resource_for_client(self): - return ClientV1RestResource(self) + return gz_wrap(ClientV1RestResource(self)) def build_resource_for_client_v2_alpha(self): - return ClientV2AlphaRestResource(self) + return gz_wrap(ClientV2AlphaRestResource(self)) def build_resource_for_federation(self): return JsonResource(self) @@ -97,7 +97,7 @@ class SynapseHomeServer(HomeServer): import syweb syweb_path = os.path.dirname(syweb.__file__) webclient_path = os.path.join(syweb_path, "webclient") - return File(webclient_path) # TODO configurable? + return GzipFile(webclient_path) # TODO configurable? def build_resource_for_static_content(self): # This is old and should go away: not going to bother adding gzip -- cgit 1.5.1 From 19505e03921e2e239e99233f3faae083c105501a Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 19 May 2015 13:19:47 +0100 Subject: Disable GZip encoding on static file resources as per comment --- synapse/app/homeserver.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index dfb5314ff7..fa43211415 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -97,7 +97,13 @@ class SynapseHomeServer(HomeServer): import syweb syweb_path = os.path.dirname(syweb.__file__) webclient_path = os.path.join(syweb_path, "webclient") - return GzipFile(webclient_path) # TODO configurable? + # GZip is disabled here due to + # https://twistedmatrix.com/trac/ticket/7678 + # (It can stay enabled for the API resources: they call + # write() with the whole body and then finish() straight + # after and so do not trigger the bug. + # return GzipFile(webclient_path) # TODO configurable? + return File(webclient_path) # TODO configurable? def build_resource_for_static_content(self): # This is old and should go away: not going to bother adding gzip -- cgit 1.5.1 From 59a0682f3e9fe64c7ab35c011b0af7b87ee54f71 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 22 May 2015 13:13:07 +0100 Subject: Enable changing the interface the metrics listener binds to --- synapse/app/homeserver.py | 2 +- synapse/config/metrics.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index fa43211415..70a7be60b8 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -277,7 +277,7 @@ class SynapseHomeServer(HomeServer): config, metrics_resource, ), - interface="127.0.0.1", + interface=config.metrics_interface, ) logger.info("Metrics now running on 127.0.0.1 port %d", config.metrics_port) diff --git a/synapse/config/metrics.py b/synapse/config/metrics.py index 71a1b1d189..c843c079cf 100644 --- a/synapse/config/metrics.py +++ b/synapse/config/metrics.py @@ -20,6 +20,7 @@ class MetricsConfig(Config): def read_config(self, config): self.enable_metrics = config["enable_metrics"] self.metrics_port = config.get("metrics_port") + self.metrics_interface = config.get("metrics_interface", "127.0.0.1") def default_config(self, config_dir_path, server_name): return """\ @@ -28,6 +29,9 @@ class MetricsConfig(Config): # Enable collection and rendering of performance metrics enable_metrics: False - # Separate port to accept metrics requests on (on localhost) + # Separate port to accept metrics requests on # metrics_port: 8081 + + # Which interface to bind the metric listener to + # metrics_interface: 127.0.0.1 """ -- cgit 1.5.1 From 8bb85c8c5a24f5a937fbd66eace23bd680ca728f Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 22 May 2015 14:48:06 +0100 Subject: Update log line --- synapse/app/homeserver.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 70a7be60b8..b887562f93 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -279,7 +279,10 @@ class SynapseHomeServer(HomeServer): ), interface=config.metrics_interface, ) - logger.info("Metrics now running on 127.0.0.1 port %d", config.metrics_port) + logger.info( + "Metrics now running on %s port %d", + config.metrics_interface, config.metrics_port, + ) def run_startup_checks(self, db_conn, database_engine): all_users_native = are_all_users_on_domain( -- cgit 1.5.1 From 1ce1509989ae5eba67acbe0824d82177ab10917f Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 22 May 2015 14:51:22 +0100 Subject: s/metric_interface/metric_bind_host/ --- synapse/app/homeserver.py | 4 ++-- synapse/config/metrics.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index b887562f93..f3513abb55 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -277,11 +277,11 @@ class SynapseHomeServer(HomeServer): config, metrics_resource, ), - interface=config.metrics_interface, + interface=config.metrics_bind_host, ) logger.info( "Metrics now running on %s port %d", - config.metrics_interface, config.metrics_port, + config.metrics_bind_host, config.metrics_port, ) def run_startup_checks(self, db_conn, database_engine): diff --git a/synapse/config/metrics.py b/synapse/config/metrics.py index c843c079cf..0cfb30ce7f 100644 --- a/synapse/config/metrics.py +++ b/synapse/config/metrics.py @@ -20,7 +20,7 @@ class MetricsConfig(Config): def read_config(self, config): self.enable_metrics = config["enable_metrics"] self.metrics_port = config.get("metrics_port") - self.metrics_interface = config.get("metrics_interface", "127.0.0.1") + self.metrics_bind_host = config.get("metrics_bind_host", "127.0.0.1") def default_config(self, config_dir_path, server_name): return """\ @@ -32,6 +32,6 @@ class MetricsConfig(Config): # Separate port to accept metrics requests on # metrics_port: 8081 - # Which interface to bind the metric listener to - # metrics_interface: 127.0.0.1 + # Which host to bind the metric listener to + # metrics_bind_host: 127.0.0.1 """ -- cgit 1.5.1