Chrome
Chrome (version 38 au moment de l'écriture) a 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
.
// Nous implémentons le même algorithme que Mozilla pour faire correspondre une extension de fichier à
// un type MIME. C'est-à-dire, nous vérifions d'abord une liste codée en dur (qui ne peut pas être
// modifiée), et ensuite, si ce n'est pas trouvé là, nous faisons appel au registre système.
// Enfin, nous parcourons une deuxième liste codée en dur pour capturer les types que nous pouvons
// déduire mais que nous voulons également autoriser au système d'exploitation d'écraser.
Les listes codées en dur se trouvent un peu plus haut dans le fichier : https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 (kPrimaryMappings
et kSecondaryMappings
).
Un exemple : lorsque vous téléchargez un fichier CSV à partir d'un système Windows avec Microsoft Excel installé, Chrome le rapportera comme application/vnd.ms-excel
. Cela est dû au fait que .csv
n'est pas spécifié dans la première liste codée en dur, et le navigateur se rabat alors sur le registre système. HKEY_CLASSES_ROOT\.csv
a une valeur nommée Content Type
qui est définie sur application/vnd.ms-excel
.
Internet Explorer
Reprenant le même exemple, le navigateur rapportera application/vnd.ms-excel
. Je pense qu'il est raisonnable de supposer qu'Internet Explorer (version 11 au moment de l'écriture) utilise le registre. Il est possible qu'il fasse également usage d'une liste codée en dur comme Chrome et Firefox, mais sa nature en source fermée rend difficile la vérification.
Firefox
Comme indiqué dans le code de Chrome, Firefox (version 32 au moment de l'écriture) fonctionne de manière similaire. Extrait du fichier uriloader\exthandler\nsExternalHelperAppService.cpp
, méthode nsExternalHelperAppService::GetTypeFromExtension
// OK. Nous voulons essayer les sources d'information de type MIME suivantes, dans cet ordre :
// 1. tableau defaultMimeEntries
// 2. Préférences définies par l'utilisateur (gérées par le service de gestionnaire)
// 3. Information fournie par le système d'exploitation
// 4. notre tableau "extras"
// 5. Information provenant des plugins
// 6. La catégorie "ext-to-type-mapping"
Les listes codées en dur se trouvent plus haut dans le fichier, quelque part près de la ligne 441. Vous cherchez defaultMimeEntries
et extraMimeEntries
.
Avec mon profil actuel, le navigateur rapportera text/csv
car il y a une entrée pour cela dans mimeTypes.rdf
(élément 2 dans la liste ci-dessus). Avec un profile fraichement créé, qui ne contient pas cette entrée, le navigateur rapportera application/vnd.ms-excel
(élément 3 dans la liste).
Résumé
Les listes codées en dur dans les navigateurs sont assez limitées. Souvent, le type MIME envoyé par le navigateur sera celui rapporté par le système d'exploitation. Et c'est exactement pourquoi, comme indiqué dans la question, le type MIME rapporté par le navigateur est peu fiable.