diff options
author | Florian Bruhin <me@the-compiler.org> | 2021-01-04 19:27:53 +0100 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2021-01-04 19:49:03 +0100 |
commit | 0a6c488b88fc37c07f6cecaaa03167a89063da74 (patch) | |
tree | 3ec5e7628e8686a391f6a3fe92bf938c949df6ad | |
parent | e513745e205423df2255e35768b0ece7d1d74b36 (diff) | |
download | qutebrowser-0a6c488b88fc37c07f6cecaaa03167a89063da74.tar.gz qutebrowser-0a6c488b88fc37c07f6cecaaa03167a89063da74.zip |
urlutils: Handle data URLs in filename_from_url
-rw-r--r-- | qutebrowser/utils/urlutils.py | 9 | ||||
-rw-r--r-- | tests/unit/utils/test_urlutils.py | 5 |
2 files changed, 14 insertions, 0 deletions
diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 24285404a..fa7867d4d 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -25,6 +25,7 @@ import os.path import ipaddress import posixpath import urllib.parse +import mimetypes from typing import Optional, Tuple, Union from PyQt5.QtCore import QUrl @@ -452,6 +453,14 @@ def filename_from_url(url: QUrl, fallback: str = None) -> Optional[str]: if not url.isValid(): return fallback + if url.scheme().lower() == 'data': + media_type, _params, _data = parse_data_url(url) + if not media_type: + return fallback + + ext = mimetypes.guess_extension(media_type, strict=False) or '' + return 'download' + ext + pathname = posixpath.basename(url.path()) if pathname: return pathname diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index 54d195d1a..3372c67a1 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -651,6 +651,11 @@ def test_parse_data_url_hypothesis(s): (QUrl('http://user:password@qutebrowser.org/foo?bar=baz#fish'), 'foo'), (QUrl('http://qutebrowser.org/'), 'qutebrowser.org.html'), (QUrl('qute://'), None), + # data URL support + (QUrl('data:text/plain,'), 'download.txt'), + (QUrl('data:application/pdf,'), 'download.pdf'), + (QUrl('data:foo/bar,'), 'download'), # unknown extension + (QUrl('data:text/xul,'), 'download.xul'), # strict=False ]) def test_filename_from_url(qurl, output): assert urlutils.filename_from_url(qurl) == output |