diff --git a/synapse/http/client.py b/synapse/http/client.py
index 0933388c04..9a5869abee 100644
--- a/synapse/http/client.py
+++ b/synapse/http/client.py
@@ -67,7 +67,9 @@ class SimpleHttpClient(object):
connectTimeout=15,
contextFactory=hs.get_http_client_context_factory()
)
- self.version_string = hs.version_string
+ self.user_agent = hs.version_string
+ if hs.config.user_agent_suffix:
+ self.user_agent = "%s %s" % (self.user_agent, hs.config.user_agent_suffix,)
def request(self, method, uri, *args, **kwargs):
# A small wrapper around self.agent.request() so we can easily attach
@@ -112,7 +114,7 @@ class SimpleHttpClient(object):
uri.encode("ascii"),
headers=Headers({
b"Content-Type": [b"application/x-www-form-urlencoded"],
- b"User-Agent": [self.version_string],
+ b"User-Agent": [self.user_agent],
}),
bodyProducer=FileBodyProducer(StringIO(query_bytes))
)
@@ -131,7 +133,8 @@ class SimpleHttpClient(object):
"POST",
uri.encode("ascii"),
headers=Headers({
- "Content-Type": ["application/json"]
+ b"Content-Type": [b"application/json"],
+ b"User-Agent": [self.user_agent],
}),
bodyProducer=FileBodyProducer(StringIO(json_str))
)
@@ -157,16 +160,40 @@ class SimpleHttpClient(object):
On a non-2xx HTTP response. The response body will be used as the
error message.
"""
+ body = yield self.get_raw(uri, args)
+ defer.returnValue(json.loads(body))
+
+ @defer.inlineCallbacks
+ def put_json(self, uri, json_body, args={}):
+ """ Puts some json to the given URI.
+
+ Args:
+ uri (str): The URI to request, not including query parameters
+ json_body (dict): The JSON to put in the HTTP body,
+ args (dict): A dictionary used to create query strings, defaults to
+ None.
+ **Note**: The value of each key is assumed to be an iterable
+ and *not* a string.
+ Returns:
+ Deferred: Succeeds when we get *any* 2xx HTTP response, with the
+ HTTP body as JSON.
+ Raises:
+ On a non-2xx HTTP response.
+ """
if len(args):
query_bytes = urllib.urlencode(args, True)
uri = "%s?%s" % (uri, query_bytes)
+ json_str = encode_canonical_json(json_body)
+
response = yield self.request(
- "GET",
+ "PUT",
uri.encode("ascii"),
headers=Headers({
- b"User-Agent": [self.version_string],
- })
+ b"User-Agent": [self.user_agent],
+ "Content-Type": ["application/json"]
+ }),
+ bodyProducer=FileBodyProducer(StringIO(json_str))
)
body = yield preserve_context_over_fn(readBody, response)
@@ -180,46 +207,39 @@ class SimpleHttpClient(object):
raise CodeMessageException(response.code, body)
@defer.inlineCallbacks
- def put_json(self, uri, json_body, args={}):
- """ Puts some json to the given URI.
+ def get_raw(self, uri, args={}):
+ """ Gets raw text from the given URI.
Args:
uri (str): The URI to request, not including query parameters
- json_body (dict): The JSON to put in the HTTP body,
args (dict): A dictionary used to create query strings, defaults to
None.
**Note**: The value of each key is assumed to be an iterable
and *not* a string.
Returns:
Deferred: Succeeds when we get *any* 2xx HTTP response, with the
- HTTP body as JSON.
+ HTTP body at text.
Raises:
- On a non-2xx HTTP response.
+ On a non-2xx HTTP response. The response body will be used as the
+ error message.
"""
if len(args):
query_bytes = urllib.urlencode(args, True)
uri = "%s?%s" % (uri, query_bytes)
- json_str = encode_canonical_json(json_body)
-
response = yield self.request(
- "PUT",
+ "GET",
uri.encode("ascii"),
headers=Headers({
- b"User-Agent": [self.version_string],
- "Content-Type": ["application/json"]
- }),
- bodyProducer=FileBodyProducer(StringIO(json_str))
+ b"User-Agent": [self.user_agent],
+ })
)
body = yield preserve_context_over_fn(readBody, response)
if 200 <= response.code < 300:
- defer.returnValue(json.loads(body))
+ defer.returnValue(body)
else:
- # NB: This is explicitly not json.loads(body)'d because the contract
- # of CodeMessageException is a *string* message. Callers can always
- # load it into JSON if they want.
raise CodeMessageException(response.code, body)
@@ -241,7 +261,7 @@ class CaptchaServerHttpClient(SimpleHttpClient):
bodyProducer=FileBodyProducer(StringIO(query_bytes)),
headers=Headers({
b"Content-Type": [b"application/x-www-form-urlencoded"],
- b"User-Agent": [self.version_string],
+ b"User-Agent": [self.user_agent],
})
)
|