#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.

Reply via email to