|
|
|
@ -190,6 +190,41 @@ def _parse_auth_header(header_bytes): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BaseFederationServlet(object): |
|
|
|
|
"""Abstract base class for federation servlet classes. |
|
|
|
|
|
|
|
|
|
The servlet object should have a PATH attribute which takes the form of a regexp to |
|
|
|
|
match against the request path (excluding the /federation/v1 prefix). |
|
|
|
|
|
|
|
|
|
The servlet should also implement one or more of on_GET, on_POST, on_PUT, to match |
|
|
|
|
the appropriate HTTP method. These methods have the signature: |
|
|
|
|
|
|
|
|
|
on_<METHOD>(self, origin, content, query, **kwargs) |
|
|
|
|
|
|
|
|
|
With arguments: |
|
|
|
|
|
|
|
|
|
origin (unicode|None): The authenticated server_name of the calling server, |
|
|
|
|
unless REQUIRE_AUTH is set to False and authentication failed. |
|
|
|
|
|
|
|
|
|
content (unicode|None): decoded json body of the request. None if the |
|
|
|
|
request was a GET. |
|
|
|
|
|
|
|
|
|
query (dict[bytes, list[bytes]]): Query params from the request. url-decoded |
|
|
|
|
(ie, '+' and '%xx' are decoded) but note that it is *not* utf8-decoded |
|
|
|
|
yet. |
|
|
|
|
|
|
|
|
|
**kwargs (dict[unicode, unicode]): the dict mapping keys to path |
|
|
|
|
components as specified in the path match regexp. |
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
Deferred[(int, object)|None]: either (response code, response object) to |
|
|
|
|
return a JSON response, or None if the request has already been handled. |
|
|
|
|
|
|
|
|
|
Raises: |
|
|
|
|
SynapseError: to return an error code |
|
|
|
|
|
|
|
|
|
Exception: other exceptions will be caught, logged, and a 500 will be |
|
|
|
|
returned. |
|
|
|
|
""" |
|
|
|
|
REQUIRE_AUTH = True |
|
|
|
|
|
|
|
|
|
def __init__(self, handler, authenticator, ratelimiter, server_name): |
|
|
|
@ -204,6 +239,18 @@ class BaseFederationServlet(object): |
|
|
|
|
@defer.inlineCallbacks |
|
|
|
|
@functools.wraps(func) |
|
|
|
|
def new_func(request, *args, **kwargs): |
|
|
|
|
""" A callback which can be passed to HttpServer.RegisterPaths |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
request (twisted.web.http.Request): |
|
|
|
|
*args: unused? |
|
|
|
|
**kwargs (dict[unicode, unicode]): the dict mapping keys to path |
|
|
|
|
components as specified in the path match regexp. |
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
Deferred[(int, object)|None]: (response code, response object) as returned |
|
|
|
|
by the callback method. None if the request has already been handled. |
|
|
|
|
""" |
|
|
|
|
content = None |
|
|
|
|
if request.method in ["PUT", "POST"]: |
|
|
|
|
# TODO: Handle other method types? other content types? |
|
|
|
|