Fix Cloudflare resolver for Linux ARM builds

This commit is contained in:
ngosang 2021-10-16 20:26:10 +02:00
parent ca3f84f458
commit 0459f2642d
3 changed files with 22 additions and 12 deletions

View File

@ -46,6 +46,12 @@ async function testWebBrowserInstallation() {
const page = await session.browser.newPage()
await page.goto("https://www.google.com")
webBrowserUserAgent = await page.evaluate(() => navigator.userAgent)
// replace Linux ARM user-agent because it's detected
if (webBrowserUserAgent.toLocaleLowerCase().includes('linux arm')) {
webBrowserUserAgent = webBrowserUserAgent.replace(/linux arm[^;]+;/i, 'Linux x86_64;')
}
log.info("FlareSolverr User-Agent: " + webBrowserUserAgent)
await page.close()
await sessions.destroy(sessionId)
@ -177,7 +183,7 @@ testWebBrowserInstallation()
if (!validateIncomingRequest(ctx, params)) { return }
// process request
Router(ctx, params).catch(e => {
Router(ctx, params, webBrowserUserAgent).catch(e => {
console.error(e)
ctx.errorResponse(e.message)
})

View File

@ -38,7 +38,7 @@ interface BaseRequestAPICall extends BaseAPICall {
}
interface Routes {
[key: string]: (ctx: RequestContext, params: BaseAPICall) => void | Promise<void>
[key: string]: (ctx: RequestContext, params: BaseAPICall, webBrowserUserAgent: string) => void | Promise<void>
}
interface ChallengeResolutionResultT {
@ -158,12 +158,16 @@ function mergeSessionWithParams({ defaults }: SessionsCacheItem, params: BaseReq
return copy
}
async function setupPage(ctx: RequestContext, params: BaseRequestAPICall, browser: Browser): Promise<Page> {
async function setupPage(ctx: RequestContext, params: BaseRequestAPICall, browser: Browser,
webBrowserUserAgent: string): Promise<Page> {
const page = await browser.newPage()
// merge session defaults with params
const { method, postData, headers, cookies } = params
// the user-agent is changed just for linux arm build
await page.setUserAgent(webBrowserUserAgent)
// todo: redo all functionality
// let overrideResolvers: OverrideResolvers = {}
@ -223,7 +227,7 @@ async function setupPage(ctx: RequestContext, params: BaseRequestAPICall, browse
return page
}
const browserRequest = async (ctx: RequestContext, params: BaseRequestAPICall) => {
const browserRequest = async (ctx: RequestContext, params: BaseRequestAPICall, webBrowserUserAgent: string) => {
const oneTimeSession = params.session === undefined
const sessionId = params.session || UUIDv1()
const session = oneTimeSession
@ -239,7 +243,7 @@ const browserRequest = async (ctx: RequestContext, params: BaseRequestAPICall) =
params = mergeSessionWithParams(session, params)
try {
const page = await setupPage(ctx, params, session.browser)
const page = await setupPage(ctx, params, session.browser, webBrowserUserAgent)
const data = await resolveChallengeWithTimeout(ctx, params, page)
if (data) {
@ -274,7 +278,7 @@ export const routes: Routes = {
if (await sessions.destroy(session)) { return ctx.successResponse('The session has been removed.') }
ctx.errorResponse('This session does not exist.')
},
'request.get': async (ctx, params: BaseRequestAPICall) => {
'request.get': async (ctx, params: BaseRequestAPICall, webBrowserUserAgent: string) => {
params.method = 'GET'
if (params.userAgent) {
log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.')
@ -282,9 +286,9 @@ export const routes: Routes = {
if (params.postData) {
return ctx.errorResponse('Cannot use "postBody" when sending a GET request.')
}
await browserRequest(ctx, params)
await browserRequest(ctx, params, webBrowserUserAgent)
},
'request.post': async (ctx, params: BaseRequestAPICall) => {
'request.post': async (ctx, params: BaseRequestAPICall, webBrowserUserAgent: string) => {
params.method = 'POST'
if (params.userAgent) {
log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.')
@ -292,12 +296,12 @@ export const routes: Routes = {
if (!params.postData) {
return ctx.errorResponse('Must send param "postBody" when sending a POST request.')
}
await browserRequest(ctx, params)
await browserRequest(ctx, params, webBrowserUserAgent)
},
}
export default async function Router(ctx: RequestContext, params: BaseAPICall): Promise<void> {
export default async function Router(ctx: RequestContext, params: BaseAPICall, webBrowserUserAgent: string): Promise<void> {
const route = routes[params.cmd]
if (route) { return await route(ctx, params) }
if (route) { return await route(ctx, params, webBrowserUserAgent) }
return ctx.errorResponse(`The command '${params.cmd}' is invalid.`)
}

View File

@ -75,7 +75,7 @@ export default {
puppeteerOptions.executablePath = path.join(path.dirname(process.execPath), 'chrome', exe)
}
log.debug('Launching browser...')
log.debug('Launching web browser...')
// TODO: maybe access env variable?
// TODO: sometimes browser instances are created and not connected to correctly.