diff --git a/src/tools/pathTools.cpp b/src/tools/pathTools.cpp index 31862fef4..54f513b0a 100644 --- a/src/tools/pathTools.cpp +++ b/src/tools/pathTools.cpp @@ -493,12 +493,14 @@ static std::map extMimeTypes = { { "jpeg", "image/jpeg"}, { "jpg", "image/jpeg"}, { "gif", "image/gif"}, + { "ico", "image/x-icon"}, { "svg", "image/svg+xml"}, { "txt", "text/plain"}, { "xml", "text/xml"}, { "pdf", "application/pdf"}, { "ogg", "application/ogg"}, { "js", "application/javascript"}, + { "json", "application/json"}, { "css", "text/css"}, { "otf", "application/vnd.ms-opentype"}, { "ttf", "application/font-ttf"}, diff --git a/static/skin/favicon/favicon.ico b/static/skin/favicon/favicon.ico index 266b576d6..bf38e3259 100644 Binary files a/static/skin/favicon/favicon.ico and b/static/skin/favicon/favicon.ico differ diff --git a/test/server.cpp b/test/server.cpp index 00519fbf9..23f05135b 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -9,6 +9,8 @@ #include "../src/tools/stringTools.h" +const std::string ROOT_PREFIX("/ROOT%23%3F"); + bool is_valid_etag(const std::string& etag) { return etag.size() >= 2 && @@ -56,8 +58,6 @@ const ResourceCollection resources200Compressible{ { STATIC_CONTENT, "/ROOT%23%3F/skin/autoComplete.min.js?cacheid=1191aaaf" }, { DYNAMIC_CONTENT, "/ROOT%23%3F/skin/css/autoComplete.css" }, { STATIC_CONTENT, "/ROOT%23%3F/skin/css/autoComplete.css?cacheid=08951e06" }, - { DYNAMIC_CONTENT, "/ROOT%23%3F/skin/favicon/favicon.ico" }, - { STATIC_CONTENT, "/ROOT%23%3F/skin/favicon/favicon.ico?cacheid=fba03a27" }, { DYNAMIC_CONTENT, "/ROOT%23%3F/skin/i18n.js" }, { STATIC_CONTENT, "/ROOT%23%3F/skin/i18n.js?cacheid=6da2bca0" }, { DYNAMIC_CONTENT, "/ROOT%23%3F/skin/index.css" }, @@ -117,6 +117,8 @@ const ResourceCollection resources200Uncompressible{ { STATIC_CONTENT, "/ROOT%23%3F/skin/favicon/favicon-16x16.png?cacheid=a986fedc" }, { DYNAMIC_CONTENT, "/ROOT%23%3F/skin/favicon/favicon-32x32.png" }, { STATIC_CONTENT, "/ROOT%23%3F/skin/favicon/favicon-32x32.png?cacheid=79ded625" }, + { DYNAMIC_CONTENT, "/ROOT%23%3F/skin/favicon/favicon.ico" }, + { STATIC_CONTENT, "/ROOT%23%3F/skin/favicon/favicon.ico?cacheid=92663314" }, { DYNAMIC_CONTENT, "/ROOT%23%3F/skin/favicon/mstile-144x144.png" }, { STATIC_CONTENT, "/ROOT%23%3F/skin/favicon/mstile-144x144.png?cacheid=c25a7641" }, { DYNAMIC_CONTENT, "/ROOT%23%3F/skin/favicon/mstile-150x150.png" }, @@ -274,7 +276,7 @@ R"EXPECTEDRESULT( href="/ROOT%23%3F/skin/index.css?cacheid=316dbc21" - + src: url("/ROOT%23%3F/skin/fonts/Poppins.ttf?cacheid=af705837") format("truetype"); src: url("/ROOT%23%3F/skin/fonts/Roboto.ttf?cacheid=84d10248") format("truetype"); @@ -468,6 +470,37 @@ TEST_F(CustomizedServerTest, ContentOfAnyServableUrlCanBeOverriden) } } +TEST_F(ServerTest, MimeTypes) +{ + struct TestData { + const char* const url; + const char* const mimeType; + }; + + const TestData testData[] = { + { "/", "text/html; charset=utf-8" }, + { "/viewer", "text/html" }, + { "/skin/blank.html", "text/html" }, + { "/skin/index.css", "text/css" }, + { "/skin/index.js", "application/javascript" }, + { "/catalog/v2/searchdescription.xml", "application/opensearchdescription+xml" }, + { "/catalog/v2/root.xml", "application/atom+xml;profile=opds-catalog;kind=navigation" }, + { "/skin/search-icon.svg", "image/svg+xml" }, + { "/skin/bittorrent.png", "image/png" }, + { "/skin/favicon/favicon.ico", "image/x-icon" }, + { "/skin/i18n/en.json", "application/json" }, + { "/skin/fonts/Roboto.ttf", "application/font-ttf" }, + { "/suggest?content=zimfile&term=ray", "application/json; charset=utf-8" }, + }; + + for ( const auto& t : testData ) { + const std::string url= ROOT_PREFIX + t.url; + const TestContext ctx{ {"url", url} }; + const auto r = zfs1_->GET(url.c_str()); + EXPECT_EQ(getHeaderValue(r->headers, "Content-Type"), t.mimeType) << ctx; + } +} + namespace TestingOfHtmlResponses {