diff options
author | Kegsay <kegsay@gmail.com> | 2017-05-05 11:52:43 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-05 11:52:43 +0100 |
commit | a59b0ad1a125049dedad9943586d4d2d3c000318 (patch) | |
tree | e59da662b3b5c8967130b963a0c81f489fa2e899 /synapse | |
parent | Merge pull request #2176 from matrix-org/erikj/faster_get_joined (diff) | |
parent | Remember how twisted works (diff) | |
download | synapse-a59b0ad1a125049dedad9943586d4d2d3c000318.tar.xz |
Merge pull request #2192 from matrix-org/kegan/simple-http-client-timeouts
Rewrite SimpleHttpClient.request to include timeouts
Diffstat (limited to 'synapse')
-rw-r--r-- | synapse/http/client.py | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/synapse/http/client.py b/synapse/http/client.py index 9cf797043a..9eba046bbf 100644 --- a/synapse/http/client.py +++ b/synapse/http/client.py @@ -19,6 +19,7 @@ from synapse.api.errors import ( CodeMessageException, MatrixCodeMessageException, SynapseError, Codes, ) from synapse.util.logcontext import preserve_context_over_fn +from synapse.util import logcontext import synapse.metrics from synapse.http.endpoint import SpiderEndpoint @@ -72,39 +73,45 @@ class SimpleHttpClient(object): contextFactory=hs.get_http_client_context_factory() ) self.user_agent = hs.version_string + self.clock = hs.get_clock() if hs.config.user_agent_suffix: self.user_agent = "%s %s" % (self.user_agent, hs.config.user_agent_suffix,) + @defer.inlineCallbacks def request(self, method, uri, *args, **kwargs): # A small wrapper around self.agent.request() so we can easily attach # counters to it outgoing_requests_counter.inc(method) - d = preserve_context_over_fn( - self.agent.request, - method, uri, *args, **kwargs - ) + + def send_request(): + request_deferred = self.agent.request( + method, uri, *args, **kwargs + ) + + return self.clock.time_bound_deferred( + request_deferred, + time_out=60, + ) logger.info("Sending request %s %s", method, uri) - def _cb(response): + try: + with logcontext.PreserveLoggingContext(): + response = yield send_request() + incoming_responses_counter.inc(method, response.code) logger.info( "Received response to %s %s: %s", method, uri, response.code ) - return response - - def _eb(failure): + defer.returnValue(response) + except Exception as e: incoming_responses_counter.inc(method, "ERR") logger.info( "Error sending request to %s %s: %s %s", - method, uri, failure.type, failure.getErrorMessage() + method, uri, type(e).__name__, e.message ) - return failure - - d.addCallbacks(_cb, _eb) - - return d + raise e @defer.inlineCallbacks def post_urlencoded_get_json(self, uri, args={}): |