Хром
Chrome (версия 38 на момент написания) имеет 3 способа определения типа MIME и делает это в определенном порядке. Приведенный ниже фрагмент взят из файла src/net/base/mime_util.cc
, метода MimeUtil::GetMimeTypeFromExtensionHelper
.
// We implement the same algorithm as Mozilla for mapping a file extension to
// a mime type. That is, we first check a hard-coded list (that cannot be
// overridden), and then if not found there, we defer to the system registry.
// Finally, we scan a secondary hard-coded list to catch types that we can
// deduce but that we also want to allow the OS to override.
Жестко запрограммированные списки находятся в файле немного раньше: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappings
и kSecondaryMappings
).
Пример: при загрузке файла CSV из системы Windows с установленным Microsoft Excel, Chrome сообщит об этом как application/vnd.ms-excel
. Это связано с тем, что .csv
он не указан в первом жестко запрограммированном списке, поэтому браузер возвращается к системному реестру. HKEY_CLASSES_ROOT\.csv
имеет значение с именем Content Type
, равным application/vnd.ms-excel
.
Internet Explorer
Опять же, используя тот же пример, браузер сообщит application/vnd.ms-excel
. Я думаю, что разумно предположить, что Internet Explorer (версия 11 на момент написания) использует реестр. Возможно, он также использует жестко запрограммированный список, такой как Chrome и Firefox, но его закрытый исходный код затрудняет проверку.
Fire Fox
Как указано в коде Chrome, Firefox (версия 32 на момент написания) работает аналогичным образом. Фрагмент из файла uriloader\exthandler\nsExternalHelperAppService.cpp
, методnsExternalHelperAppService::GetTypeFromExtension
// OK. We want to try the following sources of mimetype information, in this order:
// 1. defaultMimeEntries array
// 2. User-set preferences (managed by the handler service)
// 3. OS-provided information
// 4. our "extras" array
// 5. Information from plugins
// 6. The "ext-to-type-mapping" category
Жестко запрограммированные списки находятся в файле раньше, где-то рядом со строкой 441. Вы ищете defaultMimeEntries
и extraMimeEntries
.
В моем текущем профиле браузер сообщит об этом, text/csv
потому что для него есть запись mimeTypes.rdf
(пункт 2 в списке выше). При новом профиле, в котором нет этой записи, браузер отправит отчет application/vnd.ms-excel
(пункт 3 в списке).
Резюме
Жестко заданные списки в браузерах довольно ограничены. Часто тип MIME, отправляемый браузером, совпадает с типом, сообщенным ОС. И именно поэтому, как указано в вопросе, тип MIME, сообщаемый браузером, ненадежен.