Handling of cacheid when serving static resources

During static resource preprocessing and compilation their cacheid
values are embedded into libkiwix and can be accessed at runtime.

If a static resource is requsted without specifying any cacheid
it is served as dynamic content (with short TTL and the library id
used for the ETag, though using the cacheid for the ETag would
be better).

If a cacheid is supplied in the request it must match the cacheid of the
resource (otherwise a 404 Not Found error is returned) whereupon the
resource is served as immutable content.

Known issues:

- One issue is caused by the fact that some static resources don't get a
  cacheid; this is resolved in the next commit.

- Interaction of this change with the support for dynamically customizing
  static resources (via KIWIX_SERVE_CUSTOMIZED_RESOURCES env var) was
  not addressed.
This commit is contained in:
Veloman Yunkan
2022-10-11 14:21:08 +04:00
parent 12a638750e
commit b9f60ecfe9
4 changed files with 129 additions and 46 deletions

View File

@ -49,17 +49,27 @@ typedef std::vector<Resource> ResourceCollection;
const ResourceCollection resources200Compressible{
{ DYNAMIC_CONTENT, "/ROOT/" },
{ STATIC_CONTENT, "/ROOT/viewer" },
{ DYNAMIC_CONTENT, "/ROOT/viewer" },
{ DYNAMIC_CONTENT, "/ROOT/viewer?cacheid=whatever" },
{ STATIC_CONTENT, "/ROOT/skin/autoComplete.min.js" },
{ STATIC_CONTENT, "/ROOT/skin/css/autoComplete.css" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/favicon.ico" },
{ STATIC_CONTENT, "/ROOT/skin/index.css" },
{ STATIC_CONTENT, "/ROOT/skin/index.js" },
{ STATIC_CONTENT, "/ROOT/skin/iso6391To3.js" },
{ STATIC_CONTENT, "/ROOT/skin/isotope.pkgd.min.js" },
{ STATIC_CONTENT, "/ROOT/skin/taskbar.css" },
{ STATIC_CONTENT, "/ROOT/skin/viewer.js" },
{ DYNAMIC_CONTENT, "/ROOT/skin/autoComplete.min.js" },
{ STATIC_CONTENT, "/ROOT/skin/autoComplete.min.js?cacheid=1191aaaf" },
{ DYNAMIC_CONTENT, "/ROOT/skin/css/autoComplete.css" },
{ STATIC_CONTENT, "/ROOT/skin/css/autoComplete.css?cacheid=08951e06" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/favicon.ico" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/favicon.ico?cacheid=fba03a27" },
{ DYNAMIC_CONTENT, "/ROOT/skin/index.css" },
{ STATIC_CONTENT, "/ROOT/skin/index.css?cacheid=3b470cee" },
{ DYNAMIC_CONTENT, "/ROOT/skin/index.js" },
{ STATIC_CONTENT, "/ROOT/skin/index.js?cacheid=2f5a81ac" },
{ DYNAMIC_CONTENT, "/ROOT/skin/iso6391To3.js" },
{ STATIC_CONTENT, "/ROOT/skin/iso6391To3.js?cacheid=ecde2bb3" },
{ DYNAMIC_CONTENT, "/ROOT/skin/isotope.pkgd.min.js" },
{ STATIC_CONTENT, "/ROOT/skin/isotope.pkgd.min.js?cacheid=2e48d392" },
{ DYNAMIC_CONTENT, "/ROOT/skin/taskbar.css" },
{ STATIC_CONTENT, "/ROOT/skin/taskbar.css?cacheid=216d6b5d" },
{ DYNAMIC_CONTENT, "/ROOT/skin/viewer.js" },
{ STATIC_CONTENT, "/ROOT/skin/viewer.js?cacheid=51e745c2" },
{ DYNAMIC_CONTENT, "/ROOT/catalog/search" },
@ -80,30 +90,54 @@ const ResourceCollection resources200Compressible{
};
const ResourceCollection resources200Uncompressible{
{ STATIC_CONTENT, "/ROOT/skin/bittorrent.png" },
{ STATIC_CONTENT, "/ROOT/skin/blank.html" },
{ STATIC_CONTENT, "/ROOT/skin/caret.png" },
{ STATIC_CONTENT, "/ROOT/skin/css/images/search.svg" },
{ STATIC_CONTENT, "/ROOT/skin/download.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/android-chrome-192x192.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/android-chrome-512x512.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/apple-touch-icon.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/browserconfig.xml" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/favicon-16x16.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/favicon-32x32.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-144x144.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-150x150.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-310x150.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-310x310.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-70x70.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/safari-pinned-tab.svg" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/site.webmanifest" },
{ STATIC_CONTENT, "/ROOT/skin/fonts/Poppins.ttf" },
{ STATIC_CONTENT, "/ROOT/skin/fonts/Roboto.ttf" },
{ STATIC_CONTENT, "/ROOT/skin/hash.png" },
{ STATIC_CONTENT, "/ROOT/skin/magnet.png" },
{ STATIC_CONTENT, "/ROOT/skin/search-icon.svg" },
{ STATIC_CONTENT, "/ROOT/skin/search_results.css" },
{ DYNAMIC_CONTENT, "/ROOT/skin/bittorrent.png" },
{ STATIC_CONTENT, "/ROOT/skin/bittorrent.png?cacheid=4f5c6882" },
{ DYNAMIC_CONTENT, "/ROOT/skin/blank.html" },
{ STATIC_CONTENT, "/ROOT/skin/blank.html?cacheid=6b1fa032" },
{ DYNAMIC_CONTENT, "/ROOT/skin/caret.png" },
{ STATIC_CONTENT, "/ROOT/skin/caret.png?cacheid=22b942b4" },
{ DYNAMIC_CONTENT, "/ROOT/skin/css/images/search.svg" },
//{ STATIC_CONTENT, "/ROOT/skin/css/images/search.svg?cacheid=XXXX" },
{ DYNAMIC_CONTENT, "/ROOT/skin/download.png" },
{ STATIC_CONTENT, "/ROOT/skin/download.png?cacheid=a39aa502" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/android-chrome-192x192.png" },
//{ STATIC_CONTENT, "/ROOT/skin/favicon/android-chrome-192x192.png?cacheid=" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/android-chrome-512x512.png" },
//{ STATIC_CONTENT, "/ROOT/skin/favicon/android-chrome-512x512.png?cacheid=" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/apple-touch-icon.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/apple-touch-icon.png?cacheid=f86f8df3" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/browserconfig.xml" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/browserconfig.xml?cacheid=f29a7c4a" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/favicon-16x16.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/favicon-16x16.png?cacheid=a986fedc" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/favicon-32x32.png" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/favicon-32x32.png?cacheid=79ded625" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/mstile-144x144.png" },
//{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-144x144.png?cacheid=" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/mstile-150x150.png" },
//{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-150x150.png?cacheid=" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/mstile-310x150.png" },
//{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-310x150.png?cacheid=" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/mstile-310x310.png" },
//{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-310x310.png?cacheid=" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/mstile-70x70.png" },
//{ STATIC_CONTENT, "/ROOT/skin/favicon/mstile-70x70.png?cacheid=" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/safari-pinned-tab.svg" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/safari-pinned-tab.svg?cacheid=8d487e95" },
{ DYNAMIC_CONTENT, "/ROOT/skin/favicon/site.webmanifest" },
{ STATIC_CONTENT, "/ROOT/skin/favicon/site.webmanifest?cacheid=bc396efb" },
{ DYNAMIC_CONTENT, "/ROOT/skin/fonts/Poppins.ttf" },
{ STATIC_CONTENT, "/ROOT/skin/fonts/Poppins.ttf?cacheid=af705837" },
{ DYNAMIC_CONTENT, "/ROOT/skin/fonts/Roboto.ttf" },
{ STATIC_CONTENT, "/ROOT/skin/fonts/Roboto.ttf?cacheid=84d10248" },
{ DYNAMIC_CONTENT, "/ROOT/skin/hash.png" },
{ STATIC_CONTENT, "/ROOT/skin/hash.png?cacheid=f836e872" },
{ DYNAMIC_CONTENT, "/ROOT/skin/magnet.png" },
{ STATIC_CONTENT, "/ROOT/skin/magnet.png?cacheid=73b6bddf" },
{ DYNAMIC_CONTENT, "/ROOT/skin/search-icon.svg" },
//{ STATIC_CONTENT, "/ROOT/skin/search-icon.svg?cacheid=" },
{ DYNAMIC_CONTENT, "/ROOT/skin/search_results.css" },
{ STATIC_CONTENT, "/ROOT/skin/search_results.css?cacheid=76d39c84" },
{ ZIM_CONTENT, "/ROOT/raw/zimfile/meta/Title" },
{ ZIM_CONTENT, "/ROOT/raw/zimfile/meta/Description" },
@ -299,6 +333,7 @@ const char* urls404[] = {
"/",
"/zimfile",
"/ROOT/skin/non-existent-skin-resource",
"/ROOT/skin/autoComplete.min.js?cacheid=wrongcacheid",
"/ROOT/catalog",
"/ROOT/catalog/",
"/ROOT/catalog/non-existent-item",