﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
11522	UnicodeEncodeError on redirect to non-ASCII Location	Ilya Semenov	nobody	"If a view for a URL which contains unicode characters returns a HttpResponseRedirect to a non-absolute URL, django crashes.

Example, 

{{{
#!python
def myview(request):
    print request.path # '/info/Интеграция_CMS/'
    return HttpResponseRedirect('?edit=1')
}}}

gives the following error message:

{{{
URI:            '/info/\xd0\x98\xd0\xbd\xd1\x82\xd0\xb5\xd0\xb3\xd1\x80\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f_CMS/'

...

Traceback (most recent call last):

  ...

  File ""/usr/lib/python2.5/site-packages/django/http/utils.py"", line 20, in fix_location_header
    response['Location'] = request.build_absolute_uri(response['Location'])

  File ""/usr/lib/python2.5/site-packages/django/http/__init__.py"", line 314, in __setitem__
    header, value = self._convert_to_ascii(header, value)

  File ""/usr/lib/python2.5/site-packages/django/http/__init__.py"", line 306, in _convert_to_ascii
    yield value.encode('us-ascii')

UnicodeEncodeError: 'ascii' codec can't encode characters in position 28-37: ordinal not in range(128), HTTP response headers must be in US-ASCII format
}}}

The cause of the problem is that #10267 was incorrectly fixed by [10539], leaving many other cases open. The call to iri_to_uri should be moved from HttpResponseRedirect?.init (and other places where it had been copy-pasted) deeper to django.utils.http.fix_location_header.

Apart of my problem, it was reported in #10267 that django.views.generic.simple.redirect_to and django.contrib.redirects also suffer from the similar encoding issue, which would also be resolved once fix_location_header is fixed appropriately.

For those Google strangers who are interested in a workaround, you can do as follows:
{{{
#!python
def myview(request):
    print request.path # '/info/Интеграция_CMS/'
    return HttpResponseRedirect('?edit=1') # crashes
    return HttpResponseRedirect(request.path + '?edit=1') # doesn't crash
}}}"		closed	HTTP handling	dev		fixed		yoanblanc oldium.pro@…	Accepted	1	0	0	1	0	0
