From 68a5fe32d3fd46967b02ead4e4479a6abf158a5b Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Sun, 16 Mar 2014 16:08:49 +0100 Subject: [PATCH] Add session id middleware. --- settings/common.py | 1 + taiga/events/middleware.py | 31 +++++++++++++++++++++++++++++++ taiga/events/tests.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 taiga/events/middleware.py create mode 100644 taiga/events/tests.py diff --git a/settings/common.py b/settings/common.py index 3834fcb1..6e57f44e 100644 --- a/settings/common.py +++ b/settings/common.py @@ -117,6 +117,7 @@ TEMPLATE_LOADERS = [ MIDDLEWARE_CLASSES = [ "taiga.base.middleware.cors.CoorsMiddleware", "taiga.domains.middleware.DomainsMiddleware", + "taiga.events.middleware.SessionIDMiddleware", # Common middlewares "django.middleware.common.CommonMiddleware", diff --git a/taiga/events/middleware.py b/taiga/events/middleware.py new file mode 100644 index 00000000..6e28721e --- /dev/null +++ b/taiga/events/middleware.py @@ -0,0 +1,31 @@ +import threading + +_local = threading.local() +_local.session_id = None + +def get_current_session_id(): + global _local + if not hasattr(_local, "session_id"): + raise RuntimeException("No session identifier is found, " + "ara you sure that session id middleware " + "is active?") + return _local.session_id + + +class SessionIDMiddleware(object): + """ + Middleware for extract and store a current web sesion + identifier to thread local storage (that only avaliable for + current thread). + """ + def process_request(self, request): + global _local + session_id = request.META.get("HTTP_X_SESSION_ID", None) + _local.session_id = session_id + request.session_id = session_id + + def process_response(self, request, response): + global _local + _local.session_id = None + + return response diff --git a/taiga/events/tests.py b/taiga/events/tests.py new file mode 100644 index 00000000..87ce318c --- /dev/null +++ b/taiga/events/tests.py @@ -0,0 +1,29 @@ + +from django import test +from django.test.client import RequestFactory +from django.http import HttpResponse + +from . import middleware as mw + + +class SessionIDMiddlewareTests(test.TestCase): + # fixtures = ["initial_domains.json"] + + def setUp(self): + self.factory = RequestFactory() + + def test_process_session_id_01(self): + request = self.factory.get("/") + + mw_instance = mw.SessionIDMiddleware() + mw_instance.process_request(request) + + self.assertEqual(mw.get_current_session_id(), None) + + def test_process_session_id_02(self): + request = self.factory.get("/", HTTP_X_SESSION_ID="foobar") + + mw_instance = mw.SessionIDMiddleware() + mw_instance.process_request(request) + + self.assertEqual(mw.get_current_session_id(), "foobar")