Fix error handling in NPM/Puppeteer

main
Elbert Alias 6 years ago
parent dc7ffd175e
commit 0ae0d8889f

@ -68,100 +68,100 @@ class PuppeteerBrowser extends Browser {
} }
async visit(url) { async visit(url) {
let done = false; return new Promise(async (resolve, reject) => {
let browser; let done = false;
let browser;
try {
browser = await this.browser();
} catch (error) {
reject(new Error(error.message || error.toString()));
}
try { browser.on('disconnected', () => {
browser = await this.browser(); if (!done) {
} catch (error) { reject(new Error('Disconnected'));
throw new Error(error.message || error.toString()); }
} });
browser.on('disconnected', () => { try {
if (!done) { const page = await browser.newPage();
throw new Error('Disconnected');
}
});
try { page.setDefaultTimeout(this.options.maxWait);
const page = await browser.newPage();
page.setDefaultTimeout(this.options.maxWait); await page.setRequestInterception(true);
await page.setRequestInterception(true); page.on('error', reject);
page.on('error', (error) => { page.on('request', request => request.continue());
throw new Error(error.message || error.toString());
});
page.on('request', request => request.continue()); page.on('response', (response) => {
if (response.status() === 301 || response.status() === 302) {
return;
}
page.on('response', (response) => { if (!this.statusCode) {
if (response.status() === 301 || response.status() === 302) { this.statusCode = response.status();
return;
}
if (!this.statusCode) { this.headers = {};
this.statusCode = response.status();
this.headers = {}; const headers = response.headers();
const headers = response.headers(); Object.keys(headers).forEach((key) => {
this.headers[key] = Array.isArray(headers[key]) ? headers[key] : [headers[key]];
});
Object.keys(headers).forEach((key) => { this.contentType = headers['content-type'] || null;
this.headers[key] = Array.isArray(headers[key]) ? headers[key] : [headers[key]]; }
}); });
this.contentType = headers['content-type'] || null; page.on('console', ({ _type, _text, _location }) => this.log(`${_text} (${_location.url}: ${_location.lineNumber})`, _type));
}
});
page.on('console', ({ _type, _text, _location }) => this.log(`${_text} (${_location.url}: ${_location.lineNumber})`, _type)); await page.setUserAgent(this.options.userAgent);
await page.setUserAgent(this.options.userAgent); await Promise.race([
page.goto(url, { waitUntil: 'networkidle2' }),
new Promise(_resolve => setTimeout(_resolve, this.options.maxWait)),
]);
await Promise.race([ // eslint-disable-next-line no-undef
page.goto(url, { waitUntil: 'networkidle2' }), const links = await page.evaluateHandle(() => Array.from(document.getElementsByTagName('a')).map(({
new Promise(resolve => setTimeout(resolve, this.options.maxWait)), hash, hostname, href, pathname, protocol, rel,
]); }) => ({
hash,
hostname,
href,
pathname,
protocol,
rel,
})));
// eslint-disable-next-line no-undef this.links = await links.jsonValue();
const links = await page.evaluateHandle(() => Array.from(document.getElementsByTagName('a')).map(({
hash, hostname, href, pathname, protocol, rel,
}) => ({
hash,
hostname,
href,
pathname,
protocol,
rel,
})));
this.links = await links.jsonValue();
// eslint-disable-next-line no-undef // eslint-disable-next-line no-undef
const scripts = await page.evaluateHandle(() => Array.from(document.getElementsByTagName('script')).map(({ const scripts = await page.evaluateHandle(() => Array.from(document.getElementsByTagName('script')).map(({
src, src,
}) => src)); }) => src));
this.scripts = (await scripts.jsonValue()).filter(script => script); this.scripts = (await scripts.jsonValue()).filter(script => script);
this.js = await page.evaluate(getJs); this.js = await page.evaluate(getJs);
this.cookies = (await page.cookies()).map(({ this.cookies = (await page.cookies()).map(({
name, value, domain, path, name, value, domain, path,
}) => ({ }) => ({
name, value, domain, path, name, value, domain, path,
})); }));
this.html = await page.content(); this.html = await page.content();
} catch (error) { } catch (error) {
throw new Error(error.message || error.toString()); reject(error.message || error.toString());
} finally { } finally {
done = true; done = true;
await browser.close(); await browser.close();
} }
});
} }
} }

@ -2,7 +2,7 @@
"name": "wappalyzer", "name": "wappalyzer",
"description": "Uncovers the technologies used on websites", "description": "Uncovers the technologies used on websites",
"homepage": "https://github.com/AliasIO/Wappalyzer", "homepage": "https://github.com/AliasIO/Wappalyzer",
"version": "5.9.12", "version": "5.9.13",
"author": "Elbert Alias", "author": "Elbert Alias",
"license": "GPL-3.0", "license": "GPL-3.0",
"repository": { "repository": {

@ -322,7 +322,7 @@ class Wappalyzer {
* *
*/ */
ping() { ping() {
if (Object.keys(this.hostnameCache).length > 100) { if (Object.keys(this.hostnameCache).length > 25) {
this.driver.ping(this.hostnameCache); this.driver.ping(this.hostnameCache);
this.hostnameCache = {}; this.hostnameCache = {};