Fixed #6094 -- Middleware exceptions are now caught by the core handler. Thanks, isagalaev
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12165 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
a7dc2c0653
commit
ca6f64a43f
|
@ -68,24 +68,24 @@ class BaseHandler(object):
|
||||||
from django.core import exceptions, urlresolvers
|
from django.core import exceptions, urlresolvers
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
# Set the urlconf for this thread to the one specified above.
|
|
||||||
urlresolvers.set_urlconf(urlconf)
|
|
||||||
|
|
||||||
resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
|
|
||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
|
# Reset the urlconf for this thread.
|
||||||
|
urlresolvers.set_urlconf(None)
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
# Apply request middleware
|
||||||
|
for middleware_method in self._request_middleware:
|
||||||
|
response = middleware_method(request)
|
||||||
|
if response:
|
||||||
|
return response
|
||||||
|
|
||||||
callback, callback_args, callback_kwargs = resolver.resolve(
|
callback, callback_args, callback_kwargs = resolver.resolve(
|
||||||
request.path_info)
|
request.path_info)
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,8 @@ class CommonMiddleware(object):
|
||||||
settings.APPEND_SLASH and settings.PREPEND_WWW
|
settings.APPEND_SLASH and settings.PREPEND_WWW
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
assert False, 1
|
||||||
|
|
||||||
# Check for denied User-Agents
|
# Check for denied User-Agents
|
||||||
if 'HTTP_USER_AGENT' in request.META:
|
if 'HTTP_USER_AGENT' in request.META:
|
||||||
for user_agent_regex in settings.DISALLOWED_USER_AGENTS:
|
for user_agent_regex in settings.DISALLOWED_USER_AGENTS:
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
from django.db import models
|
|
@ -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', ))
|
|
@ -0,0 +1,8 @@
|
||||||
|
# coding: utf-8
|
||||||
|
from django.conf.urls.defaults import *
|
||||||
|
|
||||||
|
import views
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
(r'^$', views.index),
|
||||||
|
)
|
|
@ -0,0 +1,4 @@
|
||||||
|
from django import http
|
||||||
|
|
||||||
|
def index(request):
|
||||||
|
return http.HttpResponse('')
|
|
@ -36,6 +36,9 @@ urlpatterns = patterns('',
|
||||||
# conditional get views
|
# conditional get views
|
||||||
(r'condition/', include('regressiontests.conditional_processing.urls')),
|
(r'condition/', include('regressiontests.conditional_processing.urls')),
|
||||||
|
|
||||||
|
# middleware exceptions tests
|
||||||
|
(r'middleware_exceptions/', include('regressiontests.middleware_exceptions.urls')),
|
||||||
|
|
||||||
# special headers views
|
# special headers views
|
||||||
(r'special_headers/', include('regressiontests.special_headers.urls')),
|
(r'special_headers/', include('regressiontests.special_headers.urls')),
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue