Compare commits

...

5 Commits

Author SHA1 Message Date
ngosang
c951ba2523 Bump version 2.2.1 2022-02-06 16:40:03 +01:00
ngosang
6c598d5360 Fix max timeout error in some pages 2022-02-06 16:35:52 +01:00
ngosang
2893f72237 Avoid crashing in NodeJS 17 due to Unhandled promise rejection 2022-02-06 13:31:30 +01:00
ngosang
cd221bbbf1 Improve proxy validation and debug traces 2022-02-06 13:07:11 +01:00
ngosang
68fb96f0d8 Remove @types/puppeteer dependency 2022-02-06 12:53:59 +01:00
5 changed files with 31 additions and 32 deletions

23
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "flaresolverr", "name": "flaresolverr",
"version": "2.2.0", "version": "2.2.1",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "flaresolverr", "name": "flaresolverr",
"version": "2.1.0", "version": "2.2.1",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"await-timeout": "^1.1.1", "await-timeout": "^1.1.1",
@@ -25,7 +25,6 @@
"@types/express": "^4.17.13", "@types/express": "^4.17.13",
"@types/jest": "^27.0.2", "@types/jest": "^27.0.2",
"@types/node": "^16.11.7", "@types/node": "^16.11.7",
"@types/puppeteer": "^5.4.4",
"@types/supertest": "^2.0.11", "@types/supertest": "^2.0.11",
"@types/uuid": "^8.3.1", "@types/uuid": "^8.3.1",
"archiver": "^5.3.0", "archiver": "^5.3.0",
@@ -1261,15 +1260,6 @@
"dev": true, "dev": true,
"peer": true "peer": true
}, },
"node_modules/@types/puppeteer": {
"version": "5.4.4",
"resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.4.tgz",
"integrity": "sha512-3Nau+qi69CN55VwZb0ATtdUAlYlqOOQ3OfQfq0Hqgc4JMFXiQT/XInlwQ9g6LbicDslE6loIFsXFklGh5XmI6Q==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/qs": { "node_modules/@types/qs": {
"version": "6.9.7", "version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
@@ -8677,15 +8667,6 @@
"dev": true, "dev": true,
"peer": true "peer": true
}, },
"@types/puppeteer": {
"version": "5.4.4",
"resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.4.tgz",
"integrity": "sha512-3Nau+qi69CN55VwZb0ATtdUAlYlqOOQ3OfQfq0Hqgc4JMFXiQT/XInlwQ9g6LbicDslE6loIFsXFklGh5XmI6Q==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/qs": { "@types/qs": {
"version": "6.9.7", "version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",

View File

@@ -1,6 +1,6 @@
{ {
"name": "flaresolverr", "name": "flaresolverr",
"version": "2.2.0", "version": "2.2.1",
"description": "Proxy server to bypass Cloudflare protection.", "description": "Proxy server to bypass Cloudflare protection.",
"scripts": { "scripts": {
"start": "tsc && node ./dist/server.js", "start": "tsc && node ./dist/server.js",
@@ -32,7 +32,6 @@
"@types/express": "^4.17.13", "@types/express": "^4.17.13",
"@types/jest": "^27.0.2", "@types/jest": "^27.0.2",
"@types/node": "^16.11.7", "@types/node": "^16.11.7",
"@types/puppeteer": "^5.4.4",
"@types/supertest": "^2.0.11", "@types/supertest": "^2.0.11",
"@types/uuid": "^8.3.1", "@types/uuid": "^8.3.1",
"archiver": "^5.3.0", "archiver": "^5.3.0",

View File

@@ -39,6 +39,11 @@ process.on('SIGTERM', () => {
process.exit(0) process.exit(0)
}) })
process.on('uncaughtException', function(err) {
// Avoid crashing in NodeJS 17 due to UnhandledPromiseRejectionWarning: Unhandled promise rejection.
log.error(err)
})
validateEnvironmentVariables(); validateEnvironmentVariables();
testWebBrowserInstallation().then(() => { testWebBrowserInstallation().then(() => {

View File

@@ -57,8 +57,12 @@ function buildExtraPrefsFirefox(proxy: Proxy): object {
// proxy.url format => http://<host>:<port> // proxy.url format => http://<host>:<port>
if (proxy && proxy.url) { if (proxy && proxy.url) {
log.debug(`Using proxy: ${proxy.url}`)
const [host, portStr] = proxy.url.replace(/.+:\/\//g, '').split(':'); const [host, portStr] = proxy.url.replace(/.+:\/\//g, '').split(':');
const port = parseInt(portStr); const port = parseInt(portStr);
if (!host || !portStr || !port) {
throw new Error("Proxy configuration is invalid! Use the format: protocol://ip:port")
}
const proxyPrefs = { const proxyPrefs = {
"network.proxy.type": 1, "network.proxy.type": 1,
@@ -118,7 +122,8 @@ export async function testWebBrowserInstallation(): Promise<void> {
oneTimeSession: true oneTimeSession: true
}) })
const page = await session.browser.newPage() const page = await session.browser.newPage()
await page.goto(testUrl) const pageTimeout = Number(process.env.BROWSER_TIMEOUT) || 40000
await page.goto(testUrl, {waitUntil: 'domcontentloaded', timeout: pageTimeout})
webBrowserUserAgent = await page.evaluate(() => navigator.userAgent) webBrowserUserAgent = await page.evaluate(() => navigator.userAgent)
// replace Linux ARM user-agent because it's detected // replace Linux ARM user-agent because it's detected
@@ -134,6 +139,8 @@ export async function testWebBrowserInstallation(): Promise<void> {
} }
export async function create(session: string, options: SessionCreateOptions): Promise<SessionsCacheItem> { export async function create(session: string, options: SessionCreateOptions): Promise<SessionsCacheItem> {
log.debug('Creating new session...')
const sessionId = session || UUIDv1() const sessionId = session || UUIDv1()
// NOTE: cookies can't be set in the session, you need to open the page first // NOTE: cookies can't be set in the session, you need to open the page first
@@ -141,7 +148,7 @@ export async function create(session: string, options: SessionCreateOptions): Pr
const puppeteerOptions: any = { const puppeteerOptions: any = {
product: 'firefox', product: 'firefox',
headless: process.env.HEADLESS !== 'false', headless: process.env.HEADLESS !== 'false',
timeout: process.env.BROWSER_TIMEOUT || 40000 timeout: Number(process.env.BROWSER_TIMEOUT) || 40000
} }
puppeteerOptions.extraPrefsFirefox = buildExtraPrefsFirefox(options.proxy) puppeteerOptions.extraPrefsFirefox = buildExtraPrefsFirefox(options.proxy)

View File

@@ -89,7 +89,11 @@ async function resolveChallenge(params: V1Request, session: SessionsCacheItem):
// is response is ok // is response is ok
// reload the page to be sure we get the real page // reload the page to be sure we get the real page
log.debug("Reloading the page") log.debug("Reloading the page")
try {
response = await gotoPage(params, page); response = await gotoPage(params, page);
} catch (e) {
log.warn("Page not reloaded (do not report!): Cause: " + e.toString())
}
} catch (e) { } catch (e) {
status = "error"; status = "error";
@@ -129,14 +133,17 @@ async function resolveChallenge(params: V1Request, session: SessionsCacheItem):
} }
async function gotoPage(params: V1Request, page: Page): Promise<HTTPResponse> { async function gotoPage(params: V1Request, page: Page): Promise<HTTPResponse> {
let response: HTTPResponse; let pageTimeout = params.maxTimeout / 3;
if (params.method != 'POST') { let response: HTTPResponse
response = await page.goto(params.url, {waitUntil: 'domcontentloaded'}); try {
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout});
} catch (e) {
// retry
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: 2000});
}
} else { if (params.method == 'POST') {
// post hack // post hack
// first request a page without cloudflare
response = await page.goto(params.url, {waitUntil: 'domcontentloaded'});
await page.setContent( await page.setContent(
` `
<!DOCTYPE html> <!DOCTYPE html>