Ensure cache sets headers correctly

Former-commit-id: 7276a93b4b0477df5cae9f7b10a7e10052450720 [formerly dcb061d302b0f1ff155d7fd4a131a03bc14b5a42] [formerly aef4a88244a9e6ea512e07e3faa58e3c89fc5833] [formerly e58989a211266298a5e214644ed03e6e0fd8e2f7 [formerly 37e943929a2f18bc6b358a446420f5171ba3dc8a [formerly 6e831cf3a4c9ba1dbe773f76527d72aca35f1030]]]
Former-commit-id: 27b52ecff50141910e8dfdccfbc5c18e06f86fd5 [formerly 806562e714f4e4f57f4fe9c8a3681fe88d06d63a [formerly b74a91dfca17333645c4201e5e3064a3ade83a94]]
Former-commit-id: 8d76a10257d226d0ccc19a6be7c0e2fd4c7da677 [formerly bdf9e98f25809ba1ea5e15b3f672951c307697a1]
Former-commit-id: b754de747077bfc1dcdac476f0283f78ce893ff2
This commit is contained in:
Jaifroid 2022-01-16 15:57:48 +00:00
parent d9f257521d
commit 94b4875e6e

View File

@ -250,8 +250,9 @@ define(['settingsStore', 'uiUtil'], function(settingsStore, uiUtil) {
* 'delete' (deletes a record with key passed in valueOrCallback) * 'delete' (deletes a record with key passed in valueOrCallback)
* @param {Variable} valueOrCallback The value to write, or a callback function for read and command transactions * @param {Variable} valueOrCallback The value to write, or a callback function for read and command transactions
* @param {Function} callback Callback for write transactions only * @param {Function} callback Callback for write transactions only
* @param {String} mimetype The MIME type of any content to be stored
*/ */
function cacheAPI(keyOrCommand, valueOrCallback, callback) { function cacheAPI(keyOrCommand, valueOrCallback, callback, mimetype) {
var value = callback ? valueOrCallback : null; var value = callback ? valueOrCallback : null;
var rtnFn = callback || valueOrCallback; var rtnFn = callback || valueOrCallback;
// Process commands // Process commands
@ -280,9 +281,25 @@ define(['settingsStore', 'uiUtil'], function(settingsStore, uiUtil) {
} else { } else {
// Request storing of data in cache // Request storing of data in cache
caches.open(CACHEAPI).then(function(cache) { caches.open(CACHEAPI).then(function(cache) {
// Construct a Response from value var contentLength;
var response = new Response(value); if (typeof value === 'string') {
cache.put('../' + keyOrCommand, response).then(function() { var m = encodeURIComponent(value).match(/%[89ABab]/g);
contentLength = value.length + (m ? m.length : 0);
} else {
contentLength = value.byteLength || value.length;
}
var headers = new Headers();
if (contentLength) headers.set('Content-Length', contentLength);
// Prevent CORS issues in PWAs
if (contentLength) headers.set('Access-Control-Allow-Origin', '*');
if (mimetype) headers.set('Content-Type', mimetype);
var responseInit = {
status: 200,
statusText: 'OK',
headers: headers
};
var httpResponse = new Response(value, responseInit);
cache.put('../' + keyOrCommand, httpResponse).then(function() {
rtnFn(true); rtnFn(true);
}).catch(function(err) { }).catch(function(err) {
console.error('Unable to store assets in Cache API!', err); console.error('Unable to store assets in Cache API!', err);
@ -307,7 +324,7 @@ define(['settingsStore', 'uiUtil'], function(settingsStore, uiUtil) {
return; return;
} }
settingsStore.setItem(zimFile, article, Infinity); settingsStore.setItem(zimFile, article, Infinity);
setItem(zimFile, content, function(response) { setItem(zimFile, content, 'text/html', function(response) {
callback(response); callback(response);
}); });
} }
@ -333,9 +350,10 @@ define(['settingsStore', 'uiUtil'], function(settingsStore, uiUtil) {
* *
* @param {String} key The database key of the asset to cache * @param {String} key The database key of the asset to cache
* @param {String} contents The file contents to be stored in the cache * @param {String} contents The file contents to be stored in the cache
* @param {String} mimetype The MIME type of the contents
* @param {Function} callback Callback function to report outcome of operation * @param {Function} callback Callback function to report outcome of operation
*/ */
function setItem(key, contents, callback) { function setItem(key, contents, mimetype, callback) {
// Prevent use of storage if user has deselected the option in Configuration // Prevent use of storage if user has deselected the option in Configuration
// or if the asset is of the wrong type // or if the asset is of the wrong type
if (params.assetsCache === false || !regexpKeyTypes.test(key)) { if (params.assetsCache === false || !regexpKeyTypes.test(key)) {
@ -363,7 +381,7 @@ define(['settingsStore', 'uiUtil'], function(settingsStore, uiUtil) {
} else if (/^cacheAPI/.test(assetsCache.capability)) { } else if (/^cacheAPI/.test(assetsCache.capability)) {
cacheAPI(key, contents, function(result) { cacheAPI(key, contents, function(result) {
callback(result); callback(result);
}); }, mimetype);
} else { } else {
callback(key); callback(key);
} }
@ -421,6 +439,7 @@ define(['settingsStore', 'uiUtil'], function(settingsStore, uiUtil) {
* @param {String} key The cache key of the item to retrieve * @param {String} key The cache key of the item to retrieve
* @param {Object} dirEntry If the item's dirEntry has already been looked up, it can optionally be * @param {Object} dirEntry If the item's dirEntry has already been looked up, it can optionally be
* supplied here (saves a redundant dirEntry lookup) * supplied here (saves a redundant dirEntry lookup)
* @returns {Promise<String|Uint8Array>} A Promise for the content
*/ */
function getItemFromCacheOrZIM(selectedArchive, key, dirEntry) { function getItemFromCacheOrZIM(selectedArchive, key, dirEntry) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
@ -470,8 +489,9 @@ define(['settingsStore', 'uiUtil'], function(settingsStore, uiUtil) {
// Process any pre-cache transforms // Process any pre-cache transforms
content = transform(content, title.replace(/^.*\.([^.]+)$/, '$1')); content = transform(content, title.replace(/^.*\.([^.]+)$/, '$1'));
} }
var mimetype = fileDirEntry.getMimetype();
// Hide article while it is rendering // Hide article while it is rendering
if (/^text\/html$/.test(fileDirEntry.getMimetype())) { if (/^text\/html$/.test(mimetype)) {
// Count CSS so we can attempt to show article before JS/images are fully loaded // Count CSS so we can attempt to show article before JS/images are fully loaded
var cssCount = content.match(/<(?:link)[^>]+?href=["']([^"']+)[^>]+>/ig); var cssCount = content.match(/<(?:link)[^>]+?href=["']([^"']+)[^>]+>/ig);
assetsCache.cssLoading = cssCount ? cssCount.length : 0; assetsCache.cssLoading = cssCount ? cssCount.length : 0;
@ -485,7 +505,7 @@ define(['settingsStore', 'uiUtil'], function(settingsStore, uiUtil) {
document.getElementById('searchingArticles').style.display = 'none'; document.getElementById('searchingArticles').style.display = 'none';
} }
} }
setItem(key, content, function (result) { setItem(key, content, mimetype, function (result) {
if (result === -1) { if (result === -1) {
// Cache rejected item due to user settings // Cache rejected item due to user settings
} else if (result) { } else if (result) {