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, про який повідомляє браузер, є ненадійним.