Django

Code

Ticket #5898: http_requirements.diff

File http_requirements.diff, 4.2 kB (added by arien <regexbot@gmail.com>, 1 year ago)

Try to ensure responses meet basic HTTP requirements.

  • django/core/handlers/base.py

    old new  
    5050 
    5151    def get_response(self, request): 
    5252        "Returns an HttpResponse object for the given HttpRequest" 
    53         response = self._real_get_response(request) 
    54         return fix_location_header(request, response) 
    55  
    56     def _real_get_response(self, request): 
    5753        from django.core import exceptions, urlresolvers 
    5854        from django.core.mail import mail_admins 
    5955        from django.conf import settings 
     
    129125                callback, param_dict = resolver.resolve500() 
    130126                return callback(request, **param_dict) 
    131127 
     128    def fix_up_response(self, request, response): 
     129        "Fix up a response to try and meet basic HTTP requirements." 
     130        fixes = (fix_location_header, remove_unallowed_response_content) 
     131        for fix in fixes: 
     132            response = fix(request, response) 
     133        return response 
     134 
    132135    def _get_traceback(self, exc_info=None): 
    133136        "Helper function to return the traceback as a string" 
    134137        import traceback 
     
    146149        response['Location'] = request.build_absolute_uri(response['Location']) 
    147150    return response 
    148151 
     152def remove_unallowed_response_content(request, response): 
     153    """ 
     154    Removes the content of responses to HEAD requests, and of responses with 
     155    status codes 1xx (Informational), 204 (No Content), and 304 (Not Modified) 
     156    that must not have content.  This is required by RFC 2616, section 4.3. 
     157    """ 
     158    if 100 <= response.status_code < 200 or response.status_code in (204, 304): 
     159        response.content = '' 
     160        response['Content-Length'] = 0 
     161    if request.method == 'HEAD': 
     162        response.content = '' 
     163    return response 
  • django/core/handlers/modpython.py

    old new  
    162162                # Apply response middleware 
    163163                for middleware_method in self._response_middleware: 
    164164                    response = middleware_method(request, response) 
     165                response = self.fix_up_response(request, response) 
    165166        finally: 
    166167            dispatcher.send(signal=signals.request_finished) 
    167168 
  • django/core/handlers/wsgi.py

    old new  
    207207                # Apply response middleware 
    208208                for middleware_method in self._response_middleware: 
    209209                    response = middleware_method(request, response) 
     210                response = self.fix_up_response(request, response) 
    210211        finally: 
    211212            dispatcher.send(signal=signals.request_finished) 
    212213 
  • django/middleware/http.py

    old new  
    66    Last-Modified header, and the request has If-None-Match or 
    77    If-Modified-Since, the response is replaced by an HttpNotModified. 
    88 
    9     Removes the content from any response to a HEAD request. 
    10  
    119    Also sets the Date and Content-Length response-headers. 
    1210    """ 
    1311    def process_response(self, request, response): 
     
    1917            if_none_match = request.META.get('HTTP_IF_NONE_MATCH', None) 
    2018            if if_none_match == response['ETag']: 
    2119                response.status_code = 304 
    22                 response.content = '' 
    23                 response['Content-Length'] = '0' 
    2420 
    2521        if response.has_header('Last-Modified'): 
    2622            if_modified_since = request.META.get('HTTP_IF_MODIFIED_SINCE', None) 
    2723            if if_modified_since == response['Last-Modified']: 
    2824                response.status_code = 304 
    29                 response.content = '' 
    30                 response['Content-Length'] = '0' 
    3125 
    32         if request.method == 'HEAD': 
    33             response.content = '' 
    34  
    3526        return response 
    3627 
    3728class SetRemoteAddrFromForwardedFor(object):