From 753e8e1be8deddca297d136431655bd8ec66df9d Mon Sep 17 00:00:00 2001 From: ngosang Date: Wed, 20 Oct 2021 18:28:30 +0200 Subject: [PATCH] Set puppeteer timeout half of maxTimeout param. Resolves #180 --- src/controllers/v1.ts | 8 +++++++- src/providers/cloudflare.ts | 3 ++- src/services/solver.ts | 7 +++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/controllers/v1.ts b/src/controllers/v1.ts index 3f0a707..8c74167 100644 --- a/src/controllers/v1.ts +++ b/src/controllers/v1.ts @@ -143,6 +143,7 @@ export async function controllerV1(req: Request, res: Response): Promise { try { const params: V1RequestBase = req.body + // do some validations if (!params.cmd) { throw Error("Request parameter 'cmd' is mandatory.") } @@ -153,10 +154,15 @@ export async function controllerV1(req: Request, res: Response): Promise { log.warn("Request parameter 'userAgent' was removed in FlareSolverr v2.") } + // set default values + if (!params.maxTimeout || params.maxTimeout < 1) { + params.maxTimeout = 60000; + } + + // execute the command const route = routes[params.cmd] if (route) { await route(params, response) - } else { throw Error(`The command '${params.cmd}' is invalid.`) } diff --git a/src/providers/cloudflare.ts b/src/providers/cloudflare.ts index 273abba..195a8fb 100644 --- a/src/providers/cloudflare.ts +++ b/src/providers/cloudflare.ts @@ -13,7 +13,8 @@ const CAPTCHA_SELECTORS = ['input[name="cf_captcha_kind"]']; export default async function resolveChallenge(url: string, page: Page, response: Response): Promise { // look for challenge and return fast if not detected - if (response.headers().server.startsWith('cloudflare') && + if (response.headers().server && + response.headers().server.startsWith('cloudflare') && (response.status() == 403 || response.status() == 503)) { log.info('Cloudflare detected'); } else { diff --git a/src/services/solver.ts b/src/services/solver.ts index d0638fe..45d3d17 100644 --- a/src/services/solver.ts +++ b/src/services/solver.ts @@ -24,13 +24,12 @@ export interface ChallengeResolutionT { } async function resolveChallengeWithTimeout(params: V1Request, session: SessionsCacheItem) { - const maxTimeout = params.maxTimeout || 60000 const timer = new Timeout(); try { const promise = resolveChallenge(params, session); return await Promise.race([ promise, - timer.set(maxTimeout, `Maximum timeout reached. maxTimeout=${maxTimeout} (ms)`) + timer.set(params.maxTimeout, `Maximum timeout reached. maxTimeout=${params.maxTimeout} (ms)`) ]); } finally { timer.clear(); @@ -44,6 +43,10 @@ async function resolveChallenge(params: V1Request, session: SessionsCacheItem): const page: Page = await session.browser.newPage() + // the Puppeter timeout should be half the maxTimeout because we reload the page and wait for challenge + // the user can set a really high maxTimeout if he wants to + await page.setDefaultNavigationTimeout(params.maxTimeout / 2) + // the user-agent is changed just for linux arm build await page.setUserAgent(sessions.getUserAgent())