mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #11193 -- WSGI handler not properly handling lock on error in load_middleware. Thanks to Phillip Sitbon.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@15205 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -242,10 +242,16 @@ class WSGIHandler(base.BaseHandler): | ||||
|         # 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__) | ||||
|   | ||||
							
								
								
									
										0
									
								
								tests/regressiontests/handlers/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								tests/regressiontests/handlers/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								tests/regressiontests/handlers/models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								tests/regressiontests/handlers/models.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										25
									
								
								tests/regressiontests/handlers/tests.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								tests/regressiontests/handlers/tests.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user