diff --git a/deluge/httpdownloader.py b/deluge/httpdownloader.py index b4acd0784..f0fe09ec0 100644 --- a/deluge/httpdownloader.py +++ b/deluge/httpdownloader.py @@ -151,9 +151,12 @@ class HTTPDownloaderAgent(object): self.filename = new_file_name - cont_type = headers.getRawHeaders(b'content-type')[0].decode() - params = cgi.parse_header(cont_type)[1] - encoding = params.get('charset', None) + cont_type_header = headers.getRawHeaders(b'content-type')[0].decode() + cont_type, params = cgi.parse_header(cont_type_header) + # Only re-ecode text content types. + encoding = None + if cont_type.startswith('text/'): + encoding = params.get('charset', None) response.deliverBody( BodyHandler(response.request, finished, body_length, self, encoding) ) diff --git a/deluge/tests/test_httpdownloader.py b/deluge/tests/test_httpdownloader.py index a503e46de..2a52744e1 100644 --- a/deluge/tests/test_httpdownloader.py +++ b/deluge/tests/test_httpdownloader.py @@ -9,6 +9,7 @@ from __future__ import unicode_literals import tempfile from email.utils import formatdate +from io import open from twisted.internet import reactor from twisted.internet.error import CannotListenError @@ -47,9 +48,30 @@ class RenameResource(Resource): class AttachmentResource(Resource): def render(self, request): - request.setHeader(b'Content-Type', b'text/plain') + content_type = b'text/plain' + charset = request.getHeader(b'content-charset') + if charset: + content_type += b'; charset=' + charset + request.setHeader(b'Content-Type', content_type) request.setHeader(b'Content-Disposition', b'attachment') - return b'Attachement with no filename set' + append = request.getHeader(b'content-append') or b'' + content = 'Attachment with no filename set{}'.format(append.decode('utf8')) + return ( + content.encode(charset.decode('utf8')) + if charset + else content.encode('utf8') + ) + + +class TorrentResource(Resource): + def render(self, request): + content_type = b'application/x-bittorrent' + charset = request.getHeader(b'content-charset') + if charset: + content_type += b'; charset=' + charset + request.setHeader(b'Content-Type', content_type) + request.setHeader(b'Content-Disposition', b'attachment; filename=test.torrent') + return 'Binary attachment ignore charset 世丕且\n'.encode('utf8') class CookieResource(Resource): @@ -101,6 +123,7 @@ class TopLevelResource(Resource): self.putChild(b'redirect', self.redirect_rsrc) self.putChild(b'rename', RenameResource()) self.putChild(b'attachment', AttachmentResource()) + self.putChild(b'torrent', TorrentResource()) self.putChild(b'partial', PartialDownloadResource()) def getChild(self, path, request): # NOQA: N802 @@ -110,7 +133,7 @@ class TopLevelResource(Resource): return Resource.getChild(self, path, request) def render(self, request): - if request.getHeader('If-Modified-Since'): + if request.getHeader(b'If-Modified-Since'): request.setResponseCode(NOT_MODIFIED) return b'