Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
refactor JsonResource
Browse files Browse the repository at this point in the history
rephrase the OPTIONS and unrecognised request handling so that they look
similar to the common flow.
  • Loading branch information
richvdh committed Mar 9, 2018
1 parent 89b7232 commit dbe80a2
Showing 1 changed file with 46 additions and 32 deletions.
78 changes: 46 additions & 32 deletions synapse/http/server.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright 2014-2016 OpenMarket Ltd
# Copyright 2018 New Vector Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -276,49 +277,54 @@ def _async_render(self, request, request_metrics):
This checks if anyone has registered a callback for that method and
path.
"""
if request.method == "OPTIONS":
self._send_response(request, 200, {})
return
callback, group_dict = self._get_handler_for_request(request)

# Loop through all the registered callbacks to check if the method
# and path regex match
for path_entry in self.path_regexs.get(request.method, []):
m = path_entry.pattern.match(request.path)
if not m:
continue
servlet_instance = getattr(callback, "__self__", None)
if servlet_instance is not None:
servlet_classname = servlet_instance.__class__.__name__
else:
servlet_classname = "%r" % callback

# We found a match! First update the metrics object to indicate
# which servlet is handling the request.
request_metrics.name = servlet_classname

callback = path_entry.callback
# Now trigger the callback. If it returns a response, we send it
# here. If it throws an exception, that is handled by the wrapper
# installed by @request_handler.

servlet_instance = getattr(callback, "__self__", None)
if servlet_instance is not None:
servlet_classname = servlet_instance.__class__.__name__
else:
servlet_classname = "%r" % callback
kwargs = intern_dict({
name: urllib.unquote(value).decode("UTF-8") if value else value
for name, value in group_dict.items()
})

request_metrics.name = servlet_classname
callback_return = yield callback(request, **kwargs)
if callback_return is not None:
code, response = callback_return
self._send_response(request, code, response)

# Now trigger the callback. If it returns a response, we send it
# here. If it throws an exception, that is handled by the wrapper
# installed by @request_handler.
def _get_handler_for_request(self, request):
"""Finds a callback method to handle the given request
kwargs = intern_dict({
name: urllib.unquote(value).decode("UTF-8") if value else value
for name, value in m.groupdict().items()
})
Args:
request (twisted.web.http.Request):
callback_return = yield callback(request, **kwargs)
if callback_return is not None:
code, response = callback_return
self._send_response(request, code, response)
Returns:
Tuple[Callable, dict[str, str]]: callback method, and the dict
mapping keys to path components as specified in the handler's
path match regexp
"""
if request.method == "OPTIONS":
return _options_handler, {}

return
# Loop through all the registered callbacks to check if the method
# and path regex match
for path_entry in self.path_regexs.get(request.method, []):
m = path_entry.pattern.match(request.path)
if m:
# We found a match!
return path_entry.callback, m.groupdict()

# Huh. No one wanted to handle that? Fiiiiiine. Send 400.
request_metrics.name = self.__class__.__name__ + ".UnrecognizedRequest"
raise UnrecognizedRequestError()
return _unrecognised_request_handler, {}

def _send_response(self, request, code, response_json_object,
response_code_message=None):
Expand All @@ -335,6 +341,14 @@ def _send_response(self, request, code, response_json_object,
)


def _options_handler(request):
return {}


def _unrecognised_request_handler(request):
raise UnrecognizedRequestError()


class RequestMetrics(object):
def start(self, clock, name):
self.start = clock.time_msec()
Expand Down

0 comments on commit dbe80a2

Please sign in to comment.