Author: aaugustin
Date: 2011-12-11 00:58:14 -0800 (Sun, 11 Dec 2011)
New Revision: 17196

Modified:
   django/trunk/django/http/utils.py
   django/trunk/tests/regressiontests/utils/http.py
Log:
Fixed #16632 -- Crash on responses without Content-Type with IE. Thanks juan 
for the report and kenth for the patch.


Modified: django/trunk/django/http/utils.py
===================================================================
--- django/trunk/django/http/utils.py   2011-12-11 08:43:01 UTC (rev 17195)
+++ django/trunk/django/http/utils.py   2011-12-11 08:58:14 UTC (rev 17196)
@@ -76,7 +76,8 @@
 
     # The first part of the Content-Type field will be the MIME type,
     # everything after ';', such as character-set, can be ignored.
-    if response['Content-Type'].split(';')[0] not in safe_mime_types:
+    mime_type = response.get('Content-Type', '').partition(';')[0]
+    if mime_type not in safe_mime_types:
         try:
             del response['Vary']
         except KeyError:

Modified: django/trunk/tests/regressiontests/utils/http.py
===================================================================
--- django/trunk/tests/regressiontests/utils/http.py    2011-12-11 08:43:01 UTC 
(rev 17195)
+++ django/trunk/tests/regressiontests/utils/http.py    2011-12-11 08:58:14 UTC 
(rev 17196)
@@ -1,6 +1,8 @@
 from django.utils import http
 from django.utils import unittest
 from django.utils.datastructures import MultiValueDict
+from django.http import HttpResponse, utils
+from django.test import RequestFactory
 
 class TestUtilsHttp(unittest.TestCase):
 
@@ -51,3 +53,48 @@
             'position=Developer&name=Adrian&name=Simon'
         ]
         self.assertTrue(result in acceptable_results)
+
+    def test_fix_IE_for_vary(self):
+        """
+        Regression for #16632.
+
+        `fix_IE_for_vary` shouldn't crash when there's no Content-Type header.
+        """
+
+        # functions to generate responses
+        def response_with_unsafe_content_type():
+            r = HttpResponse(content_type="text/unsafe")
+            r['Vary'] = 'Cookie'
+            return r
+
+        def no_content_response_with_unsafe_content_type():
+            # 'Content-Type' always defaulted, so delete it
+            r = response_with_unsafe_content_type()
+            del r['Content-Type']
+            return r
+
+        # request with & without IE user agent
+        rf = RequestFactory()
+        request = rf.get('/')
+        ie_request = rf.get('/', HTTP_USER_AGENT='MSIE')
+
+        # not IE, unsafe_content_type
+        response = response_with_unsafe_content_type()
+        utils.fix_IE_for_vary(request, response)
+        self.assertTrue('Vary' in response)
+
+        # IE, unsafe_content_type
+        response = response_with_unsafe_content_type()
+        utils.fix_IE_for_vary(ie_request, response)
+        self.assertFalse('Vary' in response)
+
+        # not IE, no_content
+        response = no_content_response_with_unsafe_content_type()
+        utils.fix_IE_for_vary(request, response)
+        self.assertTrue('Vary' in response)
+
+        # IE, no_content
+        response = no_content_response_with_unsafe_content_type()
+        utils.fix_IE_for_vary(ie_request, response)
+        self.assertFalse('Vary' in response)
+

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

Reply via email to