From 1cf618c1c12d3ab94688139a8410bed181af3eb2 Mon Sep 17 00:00:00 2001 From: neatchee Date: Wed, 23 Dec 2020 22:23:43 -0800 Subject: [PATCH] feat(lookup): add protection against infinite recursion for Cloudflare (#1505) Fixes #1459 Fixes #1490 --- src/logger.ts | 15 +++++++++++++++ src/store/lookup.ts | 31 ++++++++++++++++++++----------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/logger.ts b/src/logger.ts index b04dffb6ab..bb0eaded2e 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -212,6 +212,21 @@ export const Print = { } return `✖ ${buildProductString(link, store)} :: RATE LIMIT EXCEEDED`; + }, + recursionLimit(link: Link, store: Store, color?: boolean): string { + if (color) { + return ( + '✖ ' + + buildProductString(link, store, true) + + ' :: ' + + chalk.yellow('CLOUDFLARE RETRY LIMIT REACHED, ABORT') + ); + } + + return `✖ ${buildProductString( + link, + store + )} :: CLOUDFLARE RETRY LIMIT REACHED, ABORT`; } }; diff --git a/src/store/lookup.ts b/src/store/lookup.ts index 197986af8d..ab53f76400 100644 --- a/src/store/lookup.ts +++ b/src/store/lookup.ts @@ -328,7 +328,8 @@ async function handleResponse( store: Store, page: Page, link: Link, - response?: Response | null + response?: Response | null, + recursionDepth = 0 ) { if (!response) { logger.debug(Print.noResponse(link, store, true)); @@ -341,16 +342,24 @@ async function handleResponse( logger.warn(Print.rateLimit(link, store, true)); } else if (statusCode === 503) { if (await checkIsCloudflare(store, page, link)) { - const response: Response | null = await page.waitForNavigation({ - waitUntil: 'networkidle0' - }); - statusCode = await handleResponse( - browser, - store, - page, - link, - response - ); + if (recursionDepth > 4) { + logger.warn(Print.recursionLimit(link, store, true)); + } else { + const response: Response | null = await page.waitForNavigation( + { + waitUntil: 'networkidle0' + } + ); + recursionDepth++; + statusCode = await handleResponse( + browser, + store, + page, + link, + response, + recursionDepth + ); + } } else { logger.warn(Print.badStatusCode(link, store, statusCode, true)); }