Index: django/core/handlers/base.py
===================================================================
--- django/core/handlers/base.py	(revision 6658)
+++ django/core/handlers/base.py	(working copy)
@@ -50,10 +50,6 @@
 
     def get_response(self, request):
         "Returns an HttpResponse object for the given HttpRequest"
-        response = self._real_get_response(request)
-        return fix_location_header(request, response)
-
-    def _real_get_response(self, request):
         from django.core import exceptions, urlresolvers
         from django.core.mail import mail_admins
         from django.conf import settings
@@ -129,6 +125,13 @@
                 callback, param_dict = resolver.resolve500()
                 return callback(request, **param_dict)
 
+    def fix_up_response(self, request, response):
+        "Fix up a response to try and meet basic HTTP requirements."
+        fixes = (fix_location_header, remove_unallowed_response_content)
+        for fix in fixes:
+            response = fix(request, response)
+        return response
+
     def _get_traceback(self, exc_info=None):
         "Helper function to return the traceback as a string"
         import traceback
@@ -146,3 +149,15 @@
         response['Location'] = request.build_absolute_uri(response['Location'])
     return response
 
+def remove_unallowed_response_content(request, response):
+    """
+    Removes the content of responses to HEAD requests, and of responses with
+    status codes 1xx (Informational), 204 (No Content), and 304 (Not Modified)
+    that must not have content.  This is required by RFC 2616, section 4.3.
+    """
+    if 100 <= response.status_code < 200 or response.status_code in (204, 304):
+        response.content = ''
+        response['Content-Length'] = 0
+    if request.method == 'HEAD':
+        response.content = ''
+    return response
Index: django/core/handlers/modpython.py
===================================================================
--- django/core/handlers/modpython.py	(revision 6658)
+++ django/core/handlers/modpython.py	(working copy)
@@ -162,6 +162,7 @@
                 # Apply response middleware
                 for middleware_method in self._response_middleware:
                     response = middleware_method(request, response)
+                response = self.fix_up_response(request, response)
         finally:
             dispatcher.send(signal=signals.request_finished)
 
Index: django/core/handlers/wsgi.py
===================================================================
--- django/core/handlers/wsgi.py	(revision 6658)
+++ django/core/handlers/wsgi.py	(working copy)
@@ -207,6 +207,7 @@
                 # Apply response middleware
                 for middleware_method in self._response_middleware:
                     response = middleware_method(request, response)
+                response = self.fix_up_response(request, response)
         finally:
             dispatcher.send(signal=signals.request_finished)
 
Index: django/middleware/http.py
===================================================================
--- django/middleware/http.py	(revision 6658)
+++ django/middleware/http.py	(working copy)
@@ -6,8 +6,6 @@
     Last-Modified header, and the request has If-None-Match or
     If-Modified-Since, the response is replaced by an HttpNotModified.
 
-    Removes the content from any response to a HEAD request.
-
     Also sets the Date and Content-Length response-headers.
     """
     def process_response(self, request, response):
@@ -19,19 +17,12 @@
             if_none_match = request.META.get('HTTP_IF_NONE_MATCH', None)
             if if_none_match == response['ETag']:
                 response.status_code = 304
-                response.content = ''
-                response['Content-Length'] = '0'
 
         if response.has_header('Last-Modified'):
             if_modified_since = request.META.get('HTTP_IF_MODIFIED_SINCE', None)
             if if_modified_since == response['Last-Modified']:
                 response.status_code = 304
-                response.content = ''
-                response['Content-Length'] = '0'
 
-        if request.method == 'HEAD':
-            response.content = ''
-
         return response
 
 class SetRemoteAddrFromForwardedFor(object):
