Cromo
Chrome (versione 38 al momento della scrittura) ha 3 modi per determinare il tipo MIME e lo fa in un certo ordine. Lo snippet di seguito è da file src/net/base/mime_util.cc
, metodo 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.
Gli elenchi hard-coded sono un po 'prima nel file: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappings
ekSecondaryMappings
).
Un esempio: quando si carica un file CSV da un sistema Windows con Microsoft Excel installato, Chrome lo segnalerà come application/vnd.ms-excel
. Questo perché .csv
non è specificato nel primo elenco hardcoded, quindi il browser torna al registro di sistema. HKEY_CLASSES_ROOT\.csv
ha un valore denominato Content Type
che è impostato suapplication/vnd.ms-excel
.
Internet Explorer
Sempre usando lo stesso esempio, il browser riporterà application/vnd.ms-excel
. Penso che sia ragionevole presumere che Internet Explorer (versione 11 al momento della scrittura) utilizzi il registro. Forse fa anche uso di un elenco hard-coded come Chrome e Firefox, ma la sua natura closed source lo rende difficile da verificare.
Firefox
Come indicato nel codice Chrome, Firefox (versione 32 al momento della scrittura) funziona in modo simile. Snippet da file uriloader\exthandler\nsExternalHelperAppService.cpp
, metodonsExternalHelperAppService::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
Gli elenchi hard-coded sono presenti in precedenza nel file, da qualche parte vicino alla riga 441. Stai cercando defaultMimeEntries
e extraMimeEntries
.
Con il mio profilo attuale, il browser segnalerà text/csv
perché c'è una voce per esso inmimeTypes.rdf
(elemento 2 nell'elenco sopra). Con un nuovo profilo, che non ha questa voce, il browser segnaleràapplication/vnd.ms-excel
(elemento 3 nell'elenco).
Sommario
Gli elenchi hard-coded nei browser sono piuttosto limitati. Spesso il tipo MIME inviato dal browser sarà quello segnalato dal sistema operativo. Ed è proprio per questo che, come affermato nella domanda, il tipo MIME segnalato dal browser non è affidabile.