From f4f7879ff38a26e1a19e25fc664f48c97a644dd2 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Thu, 9 Feb 2023 22:14:54 +0100 Subject: [PATCH 1/3] New unit test ServerTest.MimeTypes The new unit test demonstrates that for embedded resources with .ico and .json extensions MIME-types are incorrect. --- test/server.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/server.cpp b/test/server.cpp index 00519fbf9..163003675 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 && @@ -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", "text/plain" }, // !!! + { "/skin/i18n/en.json", "text/plain" }, // !!! + { "/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 { From e8c8a297b580b73d0156b773b016ba1776fb1452 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Thu, 9 Feb 2023 22:18:36 +0100 Subject: [PATCH 2/3] Registered MIME-types for .ico and .json As a result, favicon.ico stopped being considered a compressible resource. --- src/tools/pathTools.cpp | 2 ++ test/server.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) 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/test/server.cpp b/test/server.cpp index 163003675..9fdd2ff7c 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -58,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" }, @@ -119,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=fba03a27" }, { 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" }, @@ -487,8 +487,8 @@ TEST_F(ServerTest, MimeTypes) { "/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", "text/plain" }, // !!! - { "/skin/i18n/en.json", "text/plain" }, // !!! + { "/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" }, }; From 93bb0f098bf98c961d802704de6d4b6813a2f3f3 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Thu, 9 Feb 2023 22:26:10 +0100 Subject: [PATCH 3/3] A slightly better favicon.ico Replaced the favicon embedded in kiwix-serve with a slightly better one (taken from https://www.kiwix.org/favicon.ico). --- static/skin/favicon/favicon.ico | Bin 15086 -> 15086 bytes test/server.cpp | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/static/skin/favicon/favicon.ico b/static/skin/favicon/favicon.ico index 266b576d66536e8d1b59fb4e1d0eca95f1c7bb72..bf38e325905206c71d22d95ca2f0247f892a4876 100644 GIT binary patch literal 15086 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 JE`WD<_kTh>B_RL+ literal 15086 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 diff --git a/test/server.cpp b/test/server.cpp index 9fdd2ff7c..23f05135b 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -118,7 +118,7 @@ const ResourceCollection resources200Uncompressible{ { 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=fba03a27" }, + { 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" }, @@ -276,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");