diff --git a/synapse/http/client.py b/synapse/http/client.py
index c34b086eb9..dea61ba1e0 100644
--- a/synapse/http/client.py
+++ b/synapse/http/client.py
@@ -23,6 +23,7 @@ from twisted.web.http_headers import Headers
from synapse.http.endpoint import matrix_endpoint
from synapse.util.async import sleep
+from synapse.util.logcontext import PreserveLoggingContext
from syutil.jsonutil import encode_canonical_json
@@ -108,16 +109,17 @@ class BaseHttpClient(object):
producer = body_callback(method, url_bytes, headers_dict)
try:
- response = yield self.agent.request(
- destination,
- endpoint,
- method,
- path_bytes,
- param_bytes,
- query_bytes,
- Headers(headers_dict),
- producer
- )
+ with PreserveLoggingContext():
+ response = yield self.agent.request(
+ destination,
+ endpoint,
+ method,
+ path_bytes,
+ param_bytes,
+ query_bytes,
+ Headers(headers_dict),
+ producer
+ )
logger.debug("Got response to %s", method)
break
@@ -258,7 +260,13 @@ class MatrixHttpClient(BaseHttpClient):
"""
logger.debug("get_json args: %s", args)
- query_bytes = urllib.urlencode(args, True)
+ encoded_args = {}
+ for k, vs in args.items():
+ if isinstance(vs, basestring):
+ vs = [vs]
+ encoded_args[k] = [v.encode("UTF-8") for v in vs]
+
+ query_bytes = urllib.urlencode(encoded_args, True)
logger.debug("Query bytes: %s Retry DNS: %s", args, retry_on_dns_fail)
def body_callback(method, url_bytes, headers_dict):
diff --git a/synapse/http/content_repository.py b/synapse/http/content_repository.py
index 3159ffff0a..1306b35271 100644
--- a/synapse/http/content_repository.py
+++ b/synapse/http/content_repository.py
@@ -129,6 +129,14 @@ class ContentRepoResource(resource.Resource):
logger.info("Sending file %s", file_path)
f = open(file_path, 'rb')
request.setHeader('Content-Type', content_type)
+
+ # cache for at least a day.
+ # XXX: we might want to turn this off for data we don't want to recommend
+ # caching as it's sensitive or private - or at least select private.
+ # don't bother setting Expires as all our matrix clients are smart enough to
+ # be happy with Cache-Control (right?)
+ request.setHeader('Cache-Control', 'public,max-age=86400,s-maxage=86400')
+
d = FileSender().beginFileTransfer(f, request)
# after the file has been sent, clean up and finish the request
diff --git a/synapse/http/server.py b/synapse/http/server.py
index 8d419c02dd..ed1f1170cb 100644
--- a/synapse/http/server.py
+++ b/synapse/http/server.py
@@ -20,6 +20,7 @@ from syutil.jsonutil import (
from synapse.api.errors import (
cs_exception, SynapseError, CodeMessageException
)
+from synapse.util.logcontext import LoggingContext
from twisted.internet import defer, reactor
from twisted.web import server, resource
@@ -88,9 +89,19 @@ class JsonResource(HttpServer, resource.Resource):
def render(self, request):
""" This get's called by twisted every time someone sends us a request.
"""
- self._async_render(request)
+ self._async_render_with_logging_context(request)
return server.NOT_DONE_YET
+ _request_id = 0
+
+ @defer.inlineCallbacks
+ def _async_render_with_logging_context(self, request):
+ request_id = "%s-%s" % (request.method, JsonResource._request_id)
+ JsonResource._request_id += 1
+ with LoggingContext(request_id) as request_context:
+ request_context.request = request_id
+ yield self._async_render(request)
+
@defer.inlineCallbacks
def _async_render(self, request):
""" This get's called by twisted every time someone sends us a request.
|