Django

Code

Ticket #1569: 1569.trunk.2.diff

File 1569.trunk.2.diff, 4.9 kB (added by Maniac <Maniac@SoftwareManiacs.Org>, 3 years ago)

More correct patch for trunk

  • django/utils/httpwrappers.py

    old new  
    143143        cookiedict[key] = c.get(key).value 
    144144    return cookiedict 
    145145 
    146 class HttpResponse
     146class HttpResponse(object)
    147147    "A basic HTTP response, with content and dictionary-accessed headers" 
    148148    def __init__(self, content='', mimetype=None): 
     149        from django.conf.settings import DEFAULT_CONTENT_TYPE, DEFAULT_CHARSET 
     150        self._charset = DEFAULT_CHARSET 
    149151        if not mimetype: 
    150             from django.conf.settings import DEFAULT_CONTENT_TYPE, DEFAULT_CHARSET 
    151152            mimetype = "%s; charset=%s" % (DEFAULT_CONTENT_TYPE, DEFAULT_CHARSET) 
    152         self.content = content 
     153        if hasattr(content,'__iter__'): 
     154            self.iterator = content 
     155            self._is_string = False 
     156        else: 
     157            self.iterator = [content] 
     158            self._is_string = True 
    153159        self.headers = {'Content-Type':mimetype} 
    154160        self.cookies = SimpleCookie() 
    155161        self.status_code = 200 
     
    193199        except KeyError: 
    194200            pass 
    195201 
    196     def get_content_as_string(self, encoding): 
    197         """ 
    198         Returns the content as a string, encoding it from a Unicode object if 
    199         necessary. 
    200         """ 
    201         if isinstance(self.content, unicode): 
    202             return self.content.encode(encoding) 
    203         return self.content 
     202    def _get_content(self): 
     203        content = ''.join(self.iterator) 
     204        if isinstance(content, unicode): 
     205            content = content.encode(self._charset) 
     206        return content 
    204207 
     208    def _set_content(self, value): 
     209        self.iterator = [value] 
     210        self._is_string = True 
     211 
     212    content = property(_get_content,_set_content) 
     213 
    205214    # The remaining methods partially implement the file-like object interface. 
    206215    # See http://docs.python.org/lib/bltin-file-objects.html 
    207216    def write(self, content): 
    208         self.content += content 
     217        if not self._is_string: 
     218            raise Exception, "This %s instance is not writable"%self.__class__ 
     219        self.iterator.append(content) 
    209220 
    210221    def flush(self): 
    211222        pass 
    212223 
    213224    def tell(self): 
    214         return len(self.content) 
     225        if not self._is_string: 
     226            raise Exception, "This %s instance cannot tell its position"%self.__class__ 
     227        return sum(len(chunk) for chunk in self.iterator) 
    215228 
    216229class HttpResponseRedirect(HttpResponse): 
    217230    def __init__(self, redirect_to): 
  • django/utils/cache.py

    old new  
    7474        cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS 
    7575    now = datetime.datetime.utcnow() 
    7676    if not response.has_header('ETag'): 
    77         response['ETag'] = md5.new(response.get_content_as_string('utf8')).hexdigest() 
     77        response['ETag'] = md5.new(response.content).hexdigest() 
    7878    if not response.has_header('Last-Modified'): 
    7979        response['Last-Modified'] = now.strftime('%a, %d %b %Y %H:%M:%S GMT') 
    8080    if not response.has_header('Expires'): 
  • django/core/handlers/wsgi.py

    old new  
    172172        response_headers = response.headers.items() 
    173173        for c in response.cookies.values(): 
    174174            response_headers.append(('Set-Cookie', c.output(header=''))) 
    175         output = [response.get_content_as_string(settings.DEFAULT_CHARSET)] 
    176175        start_response(status, response_headers) 
    177         return output 
     176        return response.iterator 
  • django/core/handlers/modpython.py

    old new  
    162162    for c in http_response.cookies.values(): 
    163163        mod_python_req.headers_out.add('Set-Cookie', c.output(header='')) 
    164164    mod_python_req.status = http_response.status_code 
    165     mod_python_req.write(http_response.get_content_as_string(settings.DEFAULT_CHARSET)) 
     165    for chunk in http_response.iterator: 
     166        mod_python_req.write(chunk) 
    166167 
    167168def handler(req): 
    168169    # mod_python hooks into this function. 
  • django/middleware/common.py

    old new  
    6767 
    6868        # Use ETags, if requested. 
    6969        if settings.USE_ETAGS: 
    70             etag = md5.new(response.get_content_as_string(settings.DEFAULT_CHARSET)).hexdigest() 
     70            etag = md5.new(response.content).hexdigest() 
    7171            if request.META.get('HTTP_IF_NONE_MATCH') == etag: 
    7272                response = httpwrappers.HttpResponseNotModified() 
    7373            else: