mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-22 09:36:49 +03:00
Browser UA tests passing
This commit is contained in:
parent
e198165989
commit
196c21f376
|
@ -17,6 +17,8 @@ import re
|
||||||
__all__ = ['Resource']
|
__all__ = ['Resource']
|
||||||
|
|
||||||
|
|
||||||
|
_MSIE_USER_AGENT = re.compile(r'^Mozilla/[0-9]+\.[0-9]+ \([^)]*; MSIE [0-9]+\.[0-9]+[a-z]?;[^)]*\)(?!.* Opera )')
|
||||||
|
|
||||||
|
|
||||||
class Resource(object):
|
class Resource(object):
|
||||||
"""Handles incoming requests and maps them to REST operations,
|
"""Handles incoming requests and maps them to REST operations,
|
||||||
|
@ -57,6 +59,7 @@ class Resource(object):
|
||||||
CONTENT_PARAM = '_content' # Allow override of body content in form params (allows sending arbitrary content with standard forms)
|
CONTENT_PARAM = '_content' # Allow override of body content in form params (allows sending arbitrary content with standard forms)
|
||||||
CSRF_PARAM = 'csrfmiddlewaretoken' # Django's CSRF token used in form params
|
CSRF_PARAM = 'csrfmiddlewaretoken' # Django's CSRF token used in form params
|
||||||
|
|
||||||
|
_MUNGE_IE_ACCEPT_HEADER = True
|
||||||
|
|
||||||
def __new__(cls, *args, **kwargs):
|
def __new__(cls, *args, **kwargs):
|
||||||
"""Make the class callable so it can be used as a Django view."""
|
"""Make the class callable so it can be used as a Django view."""
|
||||||
|
@ -312,6 +315,8 @@ class Resource(object):
|
||||||
if self.ACCEPT_QUERY_PARAM and request.GET.get(self.ACCEPT_QUERY_PARAM, None):
|
if self.ACCEPT_QUERY_PARAM and request.GET.get(self.ACCEPT_QUERY_PARAM, None):
|
||||||
# Use _accept parameter override
|
# Use _accept parameter override
|
||||||
accept_list = [request.GET.get(self.ACCEPT_QUERY_PARAM)]
|
accept_list = [request.GET.get(self.ACCEPT_QUERY_PARAM)]
|
||||||
|
elif self._MUNGE_IE_ACCEPT_HEADER and request.META.has_key('HTTP_USER_AGENT') and _MSIE_USER_AGENT.match(request.META['HTTP_USER_AGENT']):
|
||||||
|
accept_list = ['text/html', '*/*']
|
||||||
elif request.META.has_key('HTTP_ACCEPT'):
|
elif request.META.has_key('HTTP_ACCEPT'):
|
||||||
# Use standard HTTP Accept negotiation
|
# Use standard HTTP Accept negotiation
|
||||||
accept_list = request.META["HTTP_ACCEPT"].split(',')
|
accept_list = request.META["HTTP_ACCEPT"].split(',')
|
||||||
|
|
|
@ -50,27 +50,40 @@ OPERA_11_0_MSIE_USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_
|
||||||
OPERA_11_0_OPERA_USER_AGENT = 'Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00'
|
OPERA_11_0_OPERA_USER_AGENT = 'Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00'
|
||||||
|
|
||||||
class UserAgentMungingTest(TestCase):
|
class UserAgentMungingTest(TestCase):
|
||||||
""""""
|
"""We need to fake up the accept headers when we deal with MSIE. Blergh.
|
||||||
|
http://www.gethifi.com/blog/browser-rest-http-accept-headers"""
|
||||||
class MockResource(Resource):
|
|
||||||
anon_allowed_methods = allowed_methods = ('GET',)
|
|
||||||
def get(self, request, auth):
|
|
||||||
return {'a':1, 'b':2, 'c':3}
|
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
class MockResource(Resource):
|
||||||
|
anon_allowed_methods = allowed_methods = ('GET',)
|
||||||
|
def get(self, request, auth):
|
||||||
|
return {'a':1, 'b':2, 'c':3}
|
||||||
self.rf = RequestFactory()
|
self.rf = RequestFactory()
|
||||||
|
self.MockResource = MockResource
|
||||||
|
|
||||||
def test_msie8_ua_munge_accept(self):
|
def test_munge_msie_accept_header(self):
|
||||||
"""Send MSIE user agent strings and ensure that we get an HTML response,
|
"""Send MSIE user agent strings and ensure that we get an HTML response,
|
||||||
even if we set a */* accept header. (Which MSIE annoyingly does)"""
|
even if we set a */* accept header."""
|
||||||
for user_agent in (MSIE_9_USER_AGENT,
|
for user_agent in (MSIE_9_USER_AGENT,
|
||||||
MSIE_8_USER_AGENT,
|
MSIE_8_USER_AGENT,
|
||||||
MSIE_7_USER_AGENT):
|
MSIE_7_USER_AGENT):
|
||||||
req = self.rf.get('/', HTTP_ACCEPT='*/*', HTTP_USER_AGENT=user_agent)
|
req = self.rf.get('/', HTTP_ACCEPT='*/*', HTTP_USER_AGENT=user_agent)
|
||||||
resp = self.MockResource(req)
|
resp = self.MockResource(req)
|
||||||
self.assertEqual(resp['Content-Type'], 'text/html')
|
self.assertEqual(resp['Content-Type'], 'text/html')
|
||||||
|
|
||||||
|
def test_dont_munge_msie_accept_header(self):
|
||||||
|
"""Turn off _MUNGE_IE_ACCEPT_HEADER, send MSIE user agent strings and ensure
|
||||||
|
that we get a JSON response if we set a */* accept header."""
|
||||||
|
self.MockResource._MUNGE_IE_ACCEPT_HEADER = False
|
||||||
|
|
||||||
|
for user_agent in (MSIE_9_USER_AGENT,
|
||||||
|
MSIE_8_USER_AGENT,
|
||||||
|
MSIE_7_USER_AGENT):
|
||||||
|
req = self.rf.get('/', HTTP_ACCEPT='*/*', HTTP_USER_AGENT=user_agent)
|
||||||
|
resp = self.MockResource(req)
|
||||||
|
self.assertEqual(resp['Content-Type'], 'application/json')
|
||||||
|
|
||||||
def test_other_ua_dont_munge_accept(self):
|
def test_dont_munge_nice_browsers_accept_header(self):
|
||||||
"""Send Non-MSIE user agent strings and ensure that we get a JSON response,
|
"""Send Non-MSIE user agent strings and ensure that we get a JSON response,
|
||||||
if we set a */* Accept header. (Other browsers will correctly set the Accept header)"""
|
if we set a */* Accept header. (Other browsers will correctly set the Accept header)"""
|
||||||
for user_agent in (FIREFOX_4_0_USER_AGENT,
|
for user_agent in (FIREFOX_4_0_USER_AGENT,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user