Chrome
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, но его закрытый исходный код затрудняет проверку.
Firefox
Как указано в коде 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, сообщаемый браузером, ненадежен.