Author: andrewgodwin
Date: 2011-01-14 17:18:21 -0600 (Fri, 14 Jan 2011)
New Revision: 15205

Added:
   django/trunk/tests/regressiontests/handlers/
   django/trunk/tests/regressiontests/handlers/__init__.py
   django/trunk/tests/regressiontests/handlers/models.py
   django/trunk/tests/regressiontests/handlers/tests.py
Modified:
   django/trunk/django/core/handlers/wsgi.py
Log:
Fixed #11193 -- WSGI handler not properly handling lock on error in 
load_middleware. Thanks to Phillip Sitbon.

Modified: django/trunk/django/core/handlers/wsgi.py
===================================================================
--- django/trunk/django/core/handlers/wsgi.py   2011-01-14 08:31:14 UTC (rev 
15204)
+++ django/trunk/django/core/handlers/wsgi.py   2011-01-14 23:18:21 UTC (rev 
15205)
@@ -242,10 +242,16 @@
         # settings weren't available.
         if self._request_middleware is None:
             self.initLock.acquire()
-            # Check that middleware is still uninitialised.
-            if self._request_middleware is None:
-                self.load_middleware()
-            self.initLock.release()
+            try:
+                # Check that middleware is still uninitialised.
+                if self._request_middleware is None:
+                    self.load_middleware()
+            except:
+                # Unload whatever middleware we got
+                self._request_middleware = None
+                raise
+            finally:
+                self.initLock.release()
 
         set_script_prefix(base.get_script_name(environ))
         signals.request_started.send(sender=self.__class__)

Added: django/trunk/tests/regressiontests/handlers/__init__.py
===================================================================

Added: django/trunk/tests/regressiontests/handlers/models.py
===================================================================

Added: django/trunk/tests/regressiontests/handlers/tests.py
===================================================================
--- django/trunk/tests/regressiontests/handlers/tests.py                        
        (rev 0)
+++ django/trunk/tests/regressiontests/handlers/tests.py        2011-01-14 
23:18:21 UTC (rev 15205)
@@ -0,0 +1,25 @@
+from django.utils import unittest
+from django.conf import settings
+from django.core.handlers.wsgi import WSGIHandler
+
+class HandlerTests(unittest.TestCase):
+
+    def test_lock_safety(self):
+        """
+        Tests for bug #11193 (errors inside middleware shouldn't leave
+        the initLock locked).
+        """
+        # Mangle settings so the handler will fail
+        old_middleware_classes = settings.MIDDLEWARE_CLASSES
+        settings.MIDDLEWARE_CLASSES = 42
+        # Try running the handler, it will fail in load_middleware
+        handler = WSGIHandler()
+        self.assertEqual(handler.initLock.locked(), False)
+        try:
+            handler(None, None)
+        except:
+            pass
+        self.assertEqual(handler.initLock.locked(), False)
+        # Reset settings
+        settings.MIDDLEWARE_CLASSES = old_middleware_classes
+

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to