cromada
O Chrome (versão 38 no momento da escrita) tem 3 maneiras de determinar o tipo MIME e faz isso em uma determinada ordem. O trecho abaixo é de arquivo src/net/base/mime_util.cc
, método 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.
As listas embutidas em código vêm um pouco antes no arquivo: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappings
e kSecondaryMappings
).
Um exemplo: ao fazer upload de um arquivo CSV de um sistema Windows com o Microsoft Excel instalado, o Chrome irá relatar isso como application/vnd.ms-excel
. Isso ocorre porque .csv
não é especificado na primeira lista codificada, então o navegador volta para o registro do sistema. HKEY_CLASSES_ROOT\.csv
tem um valor denominado Content Type
definido como application/vnd.ms-excel
.
Internet Explorer
Novamente usando o mesmo exemplo, o navegador irá relatar application/vnd.ms-excel
. Acho que é razoável presumir que o Internet Explorer (versão 11 no momento da escrita) usa o registro. Possivelmente também faz uso de uma lista codificada como Chrome e Firefox, mas sua natureza de código fechado torna difícil de verificar.
Raposa de fogo
Conforme indicado no código do Chrome, o Firefox (versão 32 no momento da escrita) funciona de maneira semelhante. Snippet do arquivo uriloader\exthandler\nsExternalHelperAppService.cpp
, métodonsExternalHelperAppService::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
As listas embutidas no código vêm no início do arquivo, em algum lugar perto da linha 441. Você está procurando defaultMimeEntries
e extraMimeEntries
.
Com meu perfil atual, o navegador reportará text/csv
porque há uma entrada para ele no mimeTypes.rdf
(item 2 na lista acima). Com um novo perfil, que não tem essa entrada, o navegador irá relatar application/vnd.ms-excel
(item 3 da lista).
Resumo
As listas embutidas nos navegadores são bastante limitadas. Freqüentemente, o tipo MIME enviado pelo navegador será o relatado pelo sistema operacional. E é exatamente por isso, conforme declarado na pergunta, o tipo MIME relatado pelo navegador não é confiável.