parent
450d1ab70d
commit
7dbbfedd3b
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import os.path
|
import os.path
|
||||||
import shutil
|
import shutil
|
||||||
import functools
|
import functools
|
||||||
@ -385,6 +386,10 @@ class DownloadItem(QObject):
|
|||||||
"existing: {}, fileobj {}".format(
|
"existing: {}, fileobj {}".format(
|
||||||
filename, self._filename, self.fileobj))
|
filename, self._filename, self.fileobj))
|
||||||
filename = os.path.expanduser(filename)
|
filename = os.path.expanduser(filename)
|
||||||
|
# Remove chars which can't be encoded in the filename encoding.
|
||||||
|
# See https://github.com/The-Compiler/qutebrowser/issues/427
|
||||||
|
encoding = sys.getfilesystemencoding()
|
||||||
|
filename = utils.force_encoding(filename, encoding)
|
||||||
if os.path.isabs(filename) and os.path.isdir(filename):
|
if os.path.isabs(filename) and os.path.isdir(filename):
|
||||||
# We got an absolute directory from the user, so we save it under
|
# We got an absolute directory from the user, so we save it under
|
||||||
# the default filename in that directory.
|
# the default filename in that directory.
|
||||||
@ -639,7 +644,10 @@ class DownloadManager(QAbstractListModel):
|
|||||||
return self.fetch_request(request, filename, fileobj, page,
|
return self.fetch_request(request, filename, fileobj, page,
|
||||||
auto_remove)
|
auto_remove)
|
||||||
q = self._prepare_question()
|
q = self._prepare_question()
|
||||||
q.default = urlutils.filename_from_url(request.url())
|
filename = urlutils.filename_from_url(request.url())
|
||||||
|
encoding = sys.getfilesystemencoding()
|
||||||
|
filename = utils.force_encoding(filename, encoding)
|
||||||
|
q.default = filename
|
||||||
message_bridge = objreg.get('message-bridge', scope='window',
|
message_bridge = objreg.get('message-bridge', scope='window',
|
||||||
window=self._win_id)
|
window=self._win_id)
|
||||||
q.answered.connect(
|
q.answered.connect(
|
||||||
@ -719,6 +727,9 @@ class DownloadManager(QAbstractListModel):
|
|||||||
download.autoclose = False
|
download.autoclose = False
|
||||||
else:
|
else:
|
||||||
q = self._prepare_question()
|
q = self._prepare_question()
|
||||||
|
encoding = sys.getfilesystemencoding()
|
||||||
|
suggested_filename = utils.force_encoding(suggested_filename,
|
||||||
|
encoding)
|
||||||
q.default = suggested_filename
|
q.default = suggested_filename
|
||||||
q.answered.connect(download.set_filename)
|
q.answered.connect(download.set_filename)
|
||||||
q.cancelled.connect(download.cancel)
|
q.cancelled.connect(download.cancel)
|
||||||
|
@ -383,5 +383,25 @@ class RaisesTests(unittest.TestCase):
|
|||||||
utils.raises(ValueError, self.do_raise)
|
utils.raises(ValueError, self.do_raise)
|
||||||
|
|
||||||
|
|
||||||
|
class ForceEncodingTests(unittest.TestCase):
|
||||||
|
|
||||||
|
"""Test force_encoding."""
|
||||||
|
|
||||||
|
def test_fitting_ascii(self):
|
||||||
|
"""Test with a text fitting into ascii."""
|
||||||
|
text = 'hello world'
|
||||||
|
self.assertEqual(utils.force_encoding(text, 'ascii'), text)
|
||||||
|
|
||||||
|
def test_fitting_utf8(self):
|
||||||
|
"""Test with a text fitting into utf-8."""
|
||||||
|
text = 'hellö wörld'
|
||||||
|
self.assertEqual(utils.force_encoding(text, 'utf-8'), text)
|
||||||
|
|
||||||
|
def test_not_fitting_ascii(self):
|
||||||
|
"""Test with a text not fitting into ascii."""
|
||||||
|
text = 'hellö wörld'
|
||||||
|
self.assertEqual(utils.force_encoding(text, 'ascii'), 'hell? w?rld')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
@ -542,3 +542,11 @@ def raises(exc, func, *args):
|
|||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def force_encoding(text, encoding):
|
||||||
|
"""Make sure a given text is encodable with the given encoding.
|
||||||
|
|
||||||
|
This replaces all chars not encodable with question marks.
|
||||||
|
"""
|
||||||
|
return text.encode(encoding, errors='replace').decode(encoding)
|
||||||
|
Loading…
Reference in New Issue
Block a user