Ticket #4148: 4148-fixed.diff

File 4148-fixed.diff, 2.9 KB (added by Malcolm Tredinnick, 16 years ago)

Updated and corrected(?) patch

  • django/core/handlers/base.py

    diff --git a/django/core/handlers/base.py b/django/core/handlers/base.py
    index 1fdd7c3..21c71bf 100644
    a b from django.dispatch import dispatcher  
    66
    77class BaseHandler(object):
    88    # Changes that are always applied to a response (in this order).
    9     response_fixes = [http.fix_location_header,
    10             http.conditional_content_removal]
     9    response_fixes = [
     10        http.fix_location_header,
     11        http.conditional_content_removal,
     12        http.fix_IE_for_attach,
     13        http.fix_IE_for_vary,
     14    ]
    1115
    1216    def __init__(self):
    1317        self._request_middleware = self._view_middleware = self._response_middleware = self._exception_middleware = None
  • django/http/utils.py

    diff --git a/django/http/utils.py b/django/http/utils.py
    index f98ca93..4dc05a2 100644
    a b def conditional_content_removal(request, response):  
    3131    if request.method == 'HEAD':
    3232        response.content = ''
    3333    return response
     34
     35def fix_IE_for_attach(request, response):
     36    """
     37    This function will prevent Django from serving a Content-Disposition header
     38    while expecting the browser to cache it (only when the browser is IE). This
     39    leads to IE not allowing the client to download.
     40    """
     41    if 'MSIE' not in request.META.get('HTTP_USER_AGENT', '').upper():
     42        return response
     43
     44    offending_headers = ('no-cache', 'no-store')
     45    if response.has_header('Content-Disposition'):
     46        try:
     47            del response['Pragma']
     48        except KeyError:
     49            pass
     50        if response.has_header('Cache-Control'):
     51            cache_control_values = [value.strip() for value in
     52                    response['Cache-Control'].split(',')
     53                    if value.strip().lower() not in offending_headers]
     54
     55            if not len(cache_control_values):
     56                del response['Cache-Control']
     57            else:
     58                response['Cache-Control'] = ', '.join(cache_control_values)
     59
     60    return response
     61
     62def fix_IE_for_vary(request, response):
     63    """
     64    This function will fix the bug reported at
     65    http://support.microsoft.com/kb/824847/en-us?spid=8722&sid=global
     66    by clearing the Vary header whenever the mime-type is not safe
     67    enough for Internet Explorer to handle.  Poor thing.
     68    """
     69    if 'MSIE' not in request.META.get('HTTP_USER_AGENT', '').upper():
     70        return response
     71
     72    # These mime-types that are decreed "Vary-safe" for IE:
     73    safe_mime_types = ('text/html', 'text/plain', 'text/sgml')
     74
     75    # The first part of the Content-Type field will be the MIME type,
     76    # everything after ';', such as character-set, can be ignored.
     77    if response['Content-Type'].split(';')[0] not in safe_mime_types:
     78        try:
     79            del response['Vary']
     80        except KeyError:
     81            pass
     82
     83    return response
     84
Back to Top