mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:37:35 +00:00
LibWeb/MimeSniff: Add rules for identifying an unknown mime type
This also implements the pattern matching algorithm since it's needed.
This commit is contained in:
parent
04e19df06a
commit
2babc08c17
2 changed files with 290 additions and 4 deletions
|
@ -30,3 +30,62 @@ TEST_CASE(determine_computed_mime_type_given_no_sniff_is_unset)
|
|||
|
||||
EXPECT_EQ(xml_mime_type, MUST(computed_mime_type.serialized()));
|
||||
}
|
||||
|
||||
TEST_CASE(compute_unknown_mime_type)
|
||||
{
|
||||
HashMap<StringView, Vector<StringView>> mime_type_to_headers_map;
|
||||
|
||||
mime_type_to_headers_map.set("application/octet-stream"sv, { "\x00"sv });
|
||||
mime_type_to_headers_map.set("text/html"sv, {
|
||||
"\x09\x09<!DOCTYPE HTML\x20"sv,
|
||||
"\x0A<HTML\x3E"sv,
|
||||
"\x0C<HEAD\x20"sv,
|
||||
"\x0D<SCRIPT>"sv,
|
||||
"\x20<IFRAME>"sv,
|
||||
"<H1>"sv,
|
||||
"<DIV>"sv,
|
||||
"<FONT>"sv,
|
||||
"<TABLE>"sv,
|
||||
"<A>"sv,
|
||||
"<STYLE>"sv,
|
||||
"<TITLE>"sv,
|
||||
"<B>"sv,
|
||||
"<BODY>"sv,
|
||||
"<BR>"sv,
|
||||
"<P>"sv,
|
||||
"<!-->"sv,
|
||||
});
|
||||
mime_type_to_headers_map.set("text/xml"sv, { "<?xml"sv });
|
||||
mime_type_to_headers_map.set("application/pdf"sv, { "%PDF-"sv });
|
||||
mime_type_to_headers_map.set("application/postscript"sv, { "%!PS-Adobe-"sv });
|
||||
mime_type_to_headers_map.set("text/plain"sv, {
|
||||
"\xFE\xFF\x00\x00"sv,
|
||||
"\xFF\xFE\x00\x00"sv,
|
||||
"\xEF\xBB\xBF\x00"sv,
|
||||
"Hello world!"sv,
|
||||
});
|
||||
|
||||
for (auto const& mime_type_to_headers : mime_type_to_headers_map) {
|
||||
auto mime_type = mime_type_to_headers.key;
|
||||
|
||||
for (auto const& header : mime_type_to_headers.value) {
|
||||
auto computed_mime_type = MUST(Web::MimeSniff::Resource::sniff(header.bytes()));
|
||||
EXPECT_EQ(mime_type, computed_mime_type.essence());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE(compute_mime_type_given_unknown_supplied_type)
|
||||
{
|
||||
Array<Web::MimeSniff::MimeType, 3> unknown_supplied_types = {
|
||||
MUST(Web::MimeSniff::MimeType::create("unknown"_string, "unknown"_string)),
|
||||
MUST(Web::MimeSniff::MimeType::create("application"_string, "unknown"_string)),
|
||||
MUST(Web::MimeSniff::MimeType::create("*"_string, "*"_string))
|
||||
};
|
||||
auto header_bytes = "<HTML>"sv.bytes();
|
||||
|
||||
for (auto const& unknown_supplied_type : unknown_supplied_types) {
|
||||
auto computed_mime_type = MUST(Web::MimeSniff::Resource::sniff(header_bytes, Web::MimeSniff::SniffingConfiguration { .supplied_type = unknown_supplied_type }));
|
||||
EXPECT_EQ("text/html"sv, computed_mime_type.essence());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue