Skip to content
6 changes: 5 additions & 1 deletion Lib/mimetypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,15 +180,19 @@ def _guess_file_type(self, path, strict, splitext):
base, ext = splitext(base)
else:
encoding = None
ext = ext.lower()
ext_lower = ext.lower()
types_map = self.types_map[True]
if ext in types_map:
return types_map[ext], encoding
if ext_lower in types_map:
return types_map[ext_lower], encoding
elif strict:
return None, encoding
types_map = self.types_map[False]
if ext in types_map:
return types_map[ext], encoding
if ext_lower in types_map:
return types_map[ext_lower], encoding
else:
return None, encoding

Expand Down
24 changes: 24 additions & 0 deletions Lib/test/test_mimetypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,30 @@ def test_case_sensitivity(self):
eq(self.db.guess_file_type("foobar.tar.z"), (None, None))
eq(self.db.guess_type("scheme:foobar.tar.z"), (None, None))

def test_added_types_case_sensitive_preferred(self):
self.db.add_type("text/x-test-uppercase-r", ".R")
self.db.add_type("text/x-test-lowercase-r", ".r")
self.assertEqual(
self.db.guess_file_type("example.R"),
("text/x-test-uppercase-r", None),
)
self.assertEqual(
self.db.guess_file_type("example.r"),
("text/x-test-lowercase-r", None),
)
self.db.add_type("text/x-test-uppercase-non-strict",
".NON-STRICT-EXT", strict=False)
self.db.add_type("text/x-test-lowercase-non-strict",
".non-strict-ext", strict=False)
self.assertEqual(
self.db.guess_file_type("example.NON-STRICT-EXT", strict=False),
("text/x-test-uppercase-non-strict", None),
)
self.assertEqual(
self.db.guess_file_type("example.non-strict-ext", strict=False),
("text/x-test-lowercase-non-strict", None),
)

def test_default_data(self):
eq = self.assertEqual
eq(self.db.guess_file_type("foo.html"), ("text/html", None))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix :mod:`mimetypes` to prefer case-sensitive matches for MIME type suffixes
registered with :func:`mimetypes.add_type` before falling back to
case-insensitive matches. Contributed by Xiao Yuan.
Loading