Chrome
Chrome (version 38 au moment de la rédaction) dispose de 3 façons de déterminer le type MIME et le fait dans un certain ordre. L'extrait ci-dessous provient du fichier src/net/base/mime_util.cc
, méthode 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.
Les listes codées en dur viennent un peu plus tôt dans le fichier: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappings
et kSecondaryMappings
).
Un exemple: lors du téléchargement d'un fichier CSV à partir d'un système Windows avec Microsoft Excel installé, Chrome le signalera comme application/vnd.ms-excel
. C'est parce que .csv
n'est pas spécifié dans la première liste codée en dur, de sorte que le navigateur revient au registre système. HKEY_CLASSES_ROOT\.csv
a une valeur nommée Content Type
définie sur application/vnd.ms-excel
.
Internet Explorer
Toujours en utilisant le même exemple, le navigateur fera un rapport application/vnd.ms-excel
. Je pense qu'il est raisonnable de supposer Internet Explorer (version 11 au moment de la rédaction) utilise le registre. Peut-être qu'il utilise également une liste codée en dur comme Chrome et Firefox, mais sa nature de source fermée le rend difficile à vérifier.
Firefox
Comme indiqué dans le code Chrome, Firefox (version 32 au moment de la rédaction) fonctionne de la même manière. Extrait de fichier uriloader\exthandler\nsExternalHelperAppService.cpp
, méthodensExternalHelperAppService::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
Les listes codées en dur viennent plus tôt dans le fichier, quelque part près de la ligne 441. Vous recherchez defaultMimeEntries
etextraMimeEntries
.
Avec mon profil actuel, le navigateur fera un rapport text/csv
car il y a une entrée pour lui dans mimeTypes.rdf
(élément 2 dans la liste ci-dessus). Avec un nouveau profil, qui n'a pas cette entrée, le navigateur signaleraapplication/vnd.ms-excel
(élément 3 dans la liste).
Sommaire
Les listes codées en dur dans les navigateurs sont assez limitées. Souvent, le type MIME envoyé par le navigateur sera celui signalé par le système d'exploitation. Et c'est exactement pourquoi, comme indiqué dans la question, le type MIME indiqué par le navigateur n'est pas fiable.