Skip to content

Commit

Permalink
Fixed #1569 -- Made streaming HttpResponse unicode-aware
Browse files Browse the repository at this point in the history
git-svn-id: http://code.djangoproject.com/svn/django/trunk@2675 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
adrianholovaty committed Apr 11, 2006
1 parent a0485f5 commit 63e7f20
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions django/utils/httpwrappers.py
Expand Up @@ -151,10 +151,10 @@ def __init__(self, content='', mimetype=None):
if not mimetype:
mimetype = "%s; charset=%s" % (settings.DEFAULT_CONTENT_TYPE, settings.DEFAULT_CHARSET)
if hasattr(content, '__iter__'):
self.iterator = content
self._iterator = content
self._is_string = False
else:
self.iterator = [content]
self._iterator = [content]
self._is_string = True
self.headers = {'Content-Type': mimetype}
self.cookies = SimpleCookie()
Expand Down Expand Up @@ -200,31 +200,40 @@ def delete_cookie(self, key):
pass

def _get_content(self):
content = ''.join(self.iterator)
content = ''.join(self._iterator)
if isinstance(content, unicode):
content = content.encode(self._charset)
return content

def _set_content(self, value):
self.iterator = [value]
self._iterator = [value]
self._is_string = True

content = property(_get_content, _set_content)

def _get_iterator(self):
"Output iterator. Converts data into client charset if necessary."
for chunk in self._iterator:
if isinstance(chunk, unicode):
chunk = chunk.encode(self._charset)
yield chunk

iterator = property(_get_iterator)

# The remaining methods partially implement the file-like object interface.
# See http://docs.python.org/lib/bltin-file-objects.html
def write(self, content):
if not self._is_string:
raise Exception, "This %s instance is not writable" % self.__class__
self.iterator.append(content)
self._iterator.append(content)

def flush(self):
pass

def tell(self):
if not self._is_string:
raise Exception, "This %s instance cannot tell its position" % self.__class__
return sum([len(chunk) for chunk in self.iterator])
return sum([len(chunk) for chunk in self._iterator])

class HttpResponseRedirect(HttpResponse):
def __init__(self, redirect_to):
Expand Down

0 comments on commit 63e7f20

Please sign in to comment.