From 5167a93229cb4d52ef87b95d8c3bf4093ed2f275 Mon Sep 17 00:00:00 2001 From: PIG208 <359101898@qq.com> Date: Fri, 9 Jul 2021 21:30:06 +0800 Subject: [PATCH] request: Move tornado_handler to ZulipRequestNotes. --- zerver/decorator.py | 4 ++-- zerver/lib/test_helpers.py | 1 + zerver/tests/test_decorators.py | 4 ++-- zerver/tornado/handlers.py | 5 ++++- zerver/tornado/views.py | 4 +++- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/zerver/decorator.py b/zerver/decorator.py index 7e8ea45744..18c06e93e1 100644 --- a/zerver/decorator.py +++ b/zerver/decorator.py @@ -809,14 +809,14 @@ def internal_notify_view(is_tornado_view: bool) -> Callable[[ViewFuncT], ViewFun ) -> HttpResponse: if not authenticate_notify(request): raise AccessDeniedError() - is_tornado_request = hasattr(request, "_tornado_handler") + request_notes = get_request_notes(request) + is_tornado_request = request_notes.tornado_handler is not None # These next 2 are not security checks; they are internal # assertions to help us find bugs. if is_tornado_view and not is_tornado_request: raise RuntimeError("Tornado notify view called with no Tornado handler") if not is_tornado_view and is_tornado_request: raise RuntimeError("Django notify view called with Tornado handler") - request_notes = get_request_notes(request) request_notes.requestor_for_logs = "internal" return view_func(request, *args, **kwargs) diff --git a/zerver/lib/test_helpers.py b/zerver/lib/test_helpers.py index c40597b695..7e9d7fdcef 100644 --- a/zerver/lib/test_helpers.py +++ b/zerver/lib/test_helpers.py @@ -323,6 +323,7 @@ class HostRequestMock(HttpRequest): request_notes_map[self] = ZulipRequestNotes( log_data={}, + tornado_handler=DummyHandler(), ) @property diff --git a/zerver/tests/test_decorators.py b/zerver/tests/test_decorators.py index eb7a0e155c..f1866ac48f 100644 --- a/zerver/tests/test_decorators.py +++ b/zerver/tests/test_decorators.py @@ -54,7 +54,7 @@ from zerver.lib.request import ( ) from zerver.lib.response import json_response, json_success from zerver.lib.test_classes import ZulipTestCase -from zerver.lib.test_helpers import HostRequestMock +from zerver.lib.test_helpers import DummyHandler, HostRequestMock from zerver.lib.user_agent import parse_user_agent from zerver.lib.users import get_api_key from zerver.lib.utils import generate_api_key, has_api_key_format @@ -1535,7 +1535,7 @@ class TestInternalNotifyView(ZulipTestCase): with self.assertRaises(RuntimeError): self.internal_notify(True, request) - request._tornado_handler = "set" + get_request_notes(request).tornado_handler = DummyHandler() with self.settings(SHARED_SECRET=secret): self.assertTrue(authenticate_notify(request)) self.assertEqual(self.internal_notify(True, request), self.BORING_RESULT) diff --git a/zerver/tornado/handlers.py b/zerver/tornado/handlers.py index 88d2b41dea..914500b017 100644 --- a/zerver/tornado/handlers.py +++ b/zerver/tornado/handlers.py @@ -111,9 +111,12 @@ class AsyncDjangoHandler(tornado.web.RequestHandler, base.BaseHandler): signals.request_started.send(sender=self.__class__) request = WSGIRequest(environ) + # We do the import during runtime to avoid cyclic dependency + from zerver.lib.request import get_request_notes + # Provide a way for application code to access this handler # given the HttpRequest object. - request._tornado_handler = self + get_request_notes(request).tornado_handler = self return request diff --git a/zerver/tornado/views.py b/zerver/tornado/views.py index 563311447c..343b68b0a9 100644 --- a/zerver/tornado/views.py +++ b/zerver/tornado/views.py @@ -109,7 +109,9 @@ def get_events_backend( raise JsonableError(_("User not authorized for this query")) # Extract the Tornado handler from the request - handler: AsyncDjangoHandler = request._tornado_handler + tornado_handler = get_request_notes(request).tornado_handler + assert tornado_handler is not None + handler: AsyncDjangoHandler = tornado_handler if user_client is None: valid_user_client = request.client