#29276: Compatibility of charset works not well when there are non-ascii
characters in HTTPResponse headers
-------------------------------------+-------------------------------------
Reporter: sanjiely | Owner: nobody
Type: Bug | Status: new
Component: HTTP handling | Version: 2.0
Severity: Normal | Resolution:
Keywords: HTTPResponse header | Triage Stage:
str bytes | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by sanjiely):
* status: closed => new
* type: Cleanup/optimization => Bug
* resolution: duplicate =>
Old description:
> Python: 3.6.4
> Django: 2.0.3
>
> When I return a HttpResponse object, Django library will do the job for
> me: turn my content from str to bytes silently.
> But Django will not do the same work to the headers of HTTPResponse.
>
> That is to say, the sample as below in the official document is not
> precisely correct.
> (Page: https://docs.djangoproject.com/en/2.0/ref/request-response/)
> {{{
> >>> response = HttpResponse(my_data, content_type='application/vnd.ms-
> excel')
> >>> response['Content-Disposition'] = 'attachment; filename="foo.xls"'
> }}}
> The precise usage should be:
> {{{
> >>> response['Content-Disposition'] = 'attachment;
> filename="foo.xls"'.encode('utf-8')
> }}}
> Otherwise, everthing will out of control If I have a Chinse character in
> the filename.
> Wrong:
> {{{
> >>> response['Content-Disposition'] = 'attachment; filename="中中中中中
> foo.xls"'
> }}}
> Correct:
> {{{
> >>> response['Content-Disposition'] = 'attachment; filename=中中中中中
> foo.xls'.encode('utf-8')
> }}}
> Can we accept this ticket and do a minor improvement? Then we would
> happily only handle str in Django other than str and bytes together.
> Thanks.
>
> Yong Li
New description:
Python: 3.6.4
Django: 2.0.3
Browser: Chrome v65
To tell the browser to download a file, my code as below:
{{{
response = HttpResponse(my_data, content_type='text/plain')
response['Content-Disposition'] = 'attachment; filename="中中foo.xls"'
}}}
(Note: there are non-ascii characters in the filename.)
My code worked well in Python2.7 and Django1.8.
But when I transform my version to Django v2 and Python v3. The behavior
of the browser changed: Chrome opened my file directly and wouldn't
download the file as an attachment any more.
I catch the network packet, and found the response headers become as:
{{{
Content-Disposition:
=?utf-8?b?YXR0YWNobWVudDsgZmlsZW5hbWU9IuS4reS4rWZvby54bHMi?=
Content-Length: 13
Content-Type: text/plain
}}}
Very strange header "Content-Disposition", isn't it?
I guess there is an unexpected code path in the Django lib file
"response.py".
I tracked it, and found the code running into an exception statement, line
125, file "response.py"
{{{
except UnicodeError as e:
if mime_encode:
print(value)
value = Header(value, 'utf-8',
maxlinelen=sys.maxsize).encode()
print(value)
}}}
The output of these two print statement are:
{{{
attachment; filename="中中foo.xls"
=?utf-8?b?YXR0YWNobWVudDsgZmlsZW5hbWU9IuS4reS4rWZvby54bHMi?=
}}}
Thanks.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/29276#comment:6>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/066.cc3dbd146dd23d06cc367632867e114d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.