Chrom
Chrome (wersja 38 w chwili pisania) ma 3 sposoby określenia typu MIME i robi to w określonej kolejności. Poniższy fragment pochodzi z pliku src/net/base/mime_util.cc
, metoda 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.
Zakodowane listy pojawiają się nieco wcześniej w pliku: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappings
i kSecondaryMappings
).
Przykład: podczas przesyłania pliku CSV z systemu Windows z zainstalowanym programem Microsoft Excel Chrome zgłosi to jako application/vnd.ms-excel
. Dzieje się tak, ponieważ .csv
nie jest określony na pierwszej zakodowanej liście, więc przeglądarka powraca do rejestru systemu. HKEY_CLASSES_ROOT\.csv
ma wartość o nazwie, Content Type
która jest ustawiona na application/vnd.ms-excel
.
Internet Explorer
Ponownie korzystając z tego samego przykładu, przeglądarka zgłosi application/vnd.ms-excel
. Myślę, że rozsądne jest założenie, że Internet Explorer (wersja 11 w chwili pisania) korzysta z rejestru. Możliwe, że korzysta również z zakodowanej listy, takiej jak Chrome i Firefox, ale jej zamknięty charakter źródłowy utrudnia weryfikację.
Firefox
Jak wskazano w kodzie Chrome, Firefox (wersja 32 w chwili pisania) działa w podobny sposób. Fragment z pliku uriloader\exthandler\nsExternalHelperAppService.cpp
, metodansExternalHelperAppService::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
Listy zakodowane na stałe znajdują się wcześniej w pliku, gdzieś w pobliżu linii 441. Szukasz defaultMimeEntries
i extraMimeEntries
.
W przypadku mojego obecnego profilu przeglądarka zgłosi raport, text/csv
ponieważ jest dla niego wpis mimeTypes.rdf
(pozycja 2 na powyższej liście). Przy nowym profilu, który nie ma tego wpisu, przeglądarka zgłosi application/vnd.ms-excel
(pozycja 3 na liście).
Podsumowanie
Zakodowane na stałe listy w przeglądarkach są dość ograniczone. Często typ MIME wysłany przez przeglądarkę będzie taki, jaki jest zgłaszany przez system operacyjny. I właśnie dlatego, jak stwierdzono w pytaniu, typ MIME zgłaszany przez przeglądarkę jest niewiarygodny.