.. index:: pair: MIME; headers
- Guess the type of a file based on its filename or URL, given by *url*. The
- return value is a tuple ``(type, encoding)`` where *type* is ``None`` if the
+ Guess the type of a file based on its filename, path or URL, given by *url*.
+ URL can be a string or a :term:`path-like object`.
+
+ The return value is a tuple ``(type, encoding)`` where *type* is ``None`` if the
type can't be guessed (missing or unknown suffix) or a string of the form
``'type/subtype'``, usable for a MIME :mailheader:`content-type` header.
*strict* is ``False``, some additional non-standard but commonly used MIME types
are also recognized.
+ .. versionchanged:: 3.8
+ Added support for url being a :term:`path-like object`.
+
.. function:: guess_all_extensions(type, strict=True)
exts.append(ext)
def guess_type(self, url, strict=True):
- """Guess the type of a file based on its URL.
+ """Guess the type of a file which is either a URL or a path-like object.
Return value is a tuple (type, encoding) where type is None if
the type can't be guessed (no or unknown suffix) or a string
Optional `strict' argument when False adds a bunch of commonly found,
but non-standard types.
"""
+ url = os.fspath(url)
scheme, url = urllib.parse._splittype(url)
if scheme == 'data':
# syntax of data URLs:
import io
import locale
import mimetypes
+import pathlib
import sys
import unittest
strict=True)
self.assertEqual(exts, ['.g3', '.g\xb3'])
+ def test_path_like_ob(self):
+ filename = "LICENSE.txt"
+ filepath = pathlib.Path(filename)
+ filepath_with_abs_dir = pathlib.Path('/dir/'+filename)
+ filepath_relative = pathlib.Path('../dir/'+filename)
+ path_dir = pathlib.Path('./')
+
+ expected = self.db.guess_type(filename)
+
+ self.assertEqual(self.db.guess_type(filepath), expected)
+ self.assertEqual(self.db.guess_type(
+ filepath_with_abs_dir), expected)
+ self.assertEqual(self.db.guess_type(filepath_relative), expected)
+ self.assertEqual(self.db.guess_type(path_dir), (None, None))
+
+ def test_keywords_args_api(self):
+ self.assertEqual(self.db.guess_type(
+ url="foo.html", strict=True), ("text/html", None))
+ self.assertEqual(self.db.guess_all_extensions(
+ type='image/jpg', strict=True), [])
+ self.assertEqual(self.db.guess_extension(
+ type='image/jpg', strict=False), '.jpg')
+
@unittest.skipUnless(sys.platform.startswith("win"), "Windows only")
class Win32MimeTypesTestCase(unittest.TestCase):