Improve jsdom usage for applink icons

This commit is contained in:
Johannes Zellner
2023-12-03 14:24:45 +01:00
parent da18427125
commit 81eb4bdebb
3 changed files with 129 additions and 92 deletions

View File

@@ -84,8 +84,15 @@ async function detectMetaInfo(applink) {
// set redirected URI if any for favicon url
const redirectUri = (response.redirects && response.redirects.length) ? response.redirects[0] : null;
const dom = new jsdom.JSDOM(response.text);
if (!applink.icon) {
const virtualConsole = new jsdom.VirtualConsole();
virtualConsole.on('error', () => {
// No-op to skip console errors.
});
const [jsdomError, dom] = await safe(jsdom.JSDOM.fromURL(applink.upstreamUri, { virtualConsole }));
if (jsdomError) console.error('detectMetaInfo: jsdomError', jsdomError);
if (!applink.icon && dom) {
let favicon = '';
if (dom.window.document.querySelector('link[rel="apple-touch-icon"]')) favicon = dom.window.document.querySelector('link[rel="apple-touch-icon"]').href;
if (!favicon && dom.window.document.querySelector('meta[name="msapplication-TileImage"]')) favicon = dom.window.document.querySelector('meta[name="msapplication-TileImage"]').content;
@@ -113,7 +120,7 @@ async function detectMetaInfo(applink) {
const [error, response] = await safe(superagent.get(favicon));
if (error) debug(`Failed to fetch icon ${favicon}: `, error);
else if (response.ok && response.headers['content-type'].indexOf('image') !== -1) applink.icon = response.text;
else if (response.ok && response.headers['content-type'].indexOf('image') !== -1) applink.icon = response.body || response.text;
else debug(`Failed to fetch icon ${favicon}: statusCode=${response.status}`);
}
@@ -122,7 +129,7 @@ async function detectMetaInfo(applink) {
const [error, response] = await safe(superagent.get(applink.upstreamUri + '/favicon.ico'));
if (error) debug(`Failed to fetch icon ${favicon}: `, error);
else if (response.ok && response.headers['content-type'].indexOf('image') !== -1) applink.icon = response.text;
else if (response.ok && response.headers['content-type'].indexOf('image') !== -1) applink.icon = response.body || response.text;
else debug(`Failed to fetch icon ${favicon}: statusCode=${response.status} content type ${response.headers['content-type']}`);
}
}