Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #6094 -- Middleware exceptions are now caught by the core handl…

…er. Thanks, isagalaev

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12165 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit ca6f64a43f668749c395c8c47dbb47aa175dfe25 1 parent a7dc2c0
@adrianholovaty adrianholovaty authored
View
28 django/core/handlers/base.py
@@ -68,24 +68,24 @@ def get_response(self, request):
from django.core import exceptions, urlresolvers
from django.conf import settings
- # Reset the urlconf for this thread.
- urlresolvers.set_urlconf(None)
+ try:
+ try:
+ # Reset the urlconf for this thread.
+ urlresolvers.set_urlconf(None)
- # Apply request middleware
- for middleware_method in self._request_middleware:
- response = middleware_method(request)
- if response:
- return response
+ # Get urlconf from request object, if available. Otherwise use default.
+ urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF)
- # Get urlconf from request object, if available. Otherwise use default.
- urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF)
+ # Set the urlconf for this thread to the one specified above.
+ urlresolvers.set_urlconf(urlconf)
+ resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
- # Set the urlconf for this thread to the one specified above.
- urlresolvers.set_urlconf(urlconf)
+ # Apply request middleware
+ for middleware_method in self._request_middleware:
+ response = middleware_method(request)
+ if response:
+ return response
- resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
- try:
- try:
callback, callback_args, callback_kwargs = resolver.resolve(
request.path_info)
View
2  django/middleware/common.py
@@ -34,6 +34,8 @@ def process_request(self, request):
settings.APPEND_SLASH and settings.PREPEND_WWW
"""
+ assert False, 1
+
# Check for denied User-Agents
if 'HTTP_USER_AGENT' in request.META:
for user_agent_regex in settings.DISALLOWED_USER_AGENTS:
View
1  tests/regressiontests/middleware_exceptions/models.py
@@ -0,0 +1 @@
+from django.db import models
View
37 tests/regressiontests/middleware_exceptions/tests.py
@@ -0,0 +1,37 @@
+import sys
+
+from django.test import TestCase
+from django.core.signals import got_request_exception
+
+class RequestMiddleware(object):
+ def process_request(self, request):
+ raise Exception('Exception')
+
+class MiddlewareExceptionTest(TestCase):
+ def __init__(self, *args, **kwargs):
+ super(MiddlewareExceptionTest, self).__init__(*args, **kwargs)
+ self.exceptions = []
+ got_request_exception.connect(self._on_request_exception)
+
+ def setUp(self):
+ self.client.handler.load_middleware()
+
+ def tearDown(self):
+ self.exceptions = []
+
+ def _on_request_exception(self, sender, request, **kwargs):
+ self.exceptions.append(sys.exc_info())
+
+ def test_process_request(self):
+ self.client.handler._request_middleware.insert(0, RequestMiddleware().process_request)
+ try:
+ response = self.client.get('/')
+ except:
+ # Test client indefinitely re-raises any exceptions being raised
+ # during request handling. Hence actual testing that exception was
+ # properly handled is done by relying on got_request_exception
+ # signal being sent.
+ pass
+ self.assertEquals(len(self.exceptions), 1)
+ exception, value, tb = self.exceptions[0]
+ self.assertEquals(value.args, ('Exception', ))
View
8 tests/regressiontests/middleware_exceptions/urls.py
@@ -0,0 +1,8 @@
+# coding: utf-8
+from django.conf.urls.defaults import *
+
+import views
+
+urlpatterns = patterns('',
+ (r'^$', views.index),
+)
View
4 tests/regressiontests/middleware_exceptions/views.py
@@ -0,0 +1,4 @@
+from django import http
+
+def index(request):
+ return http.HttpResponse('')
View
3  tests/urls.py
@@ -36,6 +36,9 @@
# conditional get views
(r'condition/', include('regressiontests.conditional_processing.urls')),
+ # middleware exceptions tests
+ (r'middleware_exceptions/', include('regressiontests.middleware_exceptions.urls')),
+
# special headers views
(r'special_headers/', include('regressiontests.special_headers.urls')),
)
Please sign in to comment.
Something went wrong with that request. Please try again.