mirror of
https://github.com/FlareSolverr/FlareSolverr.git
synced 2025-06-13 06:47:15 +00:00
Improve bad request management and tests
This commit is contained in:
parent
a841d67745
commit
356b893c18
@ -1,5 +1,12 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
|
// A list of paths to directories that Jest should use to search for files in
|
||||||
|
roots: [
|
||||||
|
"./src/"
|
||||||
|
],
|
||||||
|
// Compile Typescript
|
||||||
transform: {
|
transform: {
|
||||||
'^.+\\.(ts|tsx)$': 'ts-jest'
|
'^.+\\.(ts|tsx)$': 'ts-jest'
|
||||||
}
|
},
|
||||||
|
// Default value for FlareSolverr maxTimeout is 60000
|
||||||
|
testTimeout: 70000
|
||||||
}
|
}
|
||||||
|
49
src/app.ts
49
src/app.ts
@ -1,5 +1,5 @@
|
|||||||
import log from './services/log'
|
import log from './services/log'
|
||||||
import {Request, Response} from 'express';
|
import {NextFunction, Request, Response} from 'express';
|
||||||
import {getUserAgent} from "./services/sessions";
|
import {getUserAgent} from "./services/sessions";
|
||||||
import {controllerV1} from "./controllers/v1";
|
import {controllerV1} from "./controllers/v1";
|
||||||
|
|
||||||
@ -16,12 +16,31 @@ app.use(bodyParser.json({
|
|||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
// Access log
|
||||||
|
app.use(function(req: Request, res: Response, next: NextFunction) {
|
||||||
|
if (req.url != '/health') {
|
||||||
|
// count the request for the log prefix
|
||||||
|
log.incRequests()
|
||||||
|
// build access message
|
||||||
|
let body = "";
|
||||||
|
if (req.method == 'POST' && req.body) {
|
||||||
|
body += " body: "
|
||||||
|
try {
|
||||||
|
body += JSON.stringify(req.body)
|
||||||
|
} catch(e) {
|
||||||
|
body += req.body
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.info(`Incoming request => ${req.method} ${req.url}${body}`);
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
// *********************************************************************************************************************
|
// *********************************************************************************************************************
|
||||||
// Routes
|
// Routes
|
||||||
|
|
||||||
// show welcome message
|
// Show welcome message
|
||||||
app.get("/", ( req: Request, res: Response ) => {
|
app.get("/", ( req: Request, res: Response ) => {
|
||||||
log.info(`Incoming request: /`);
|
|
||||||
res.send({
|
res.send({
|
||||||
"msg": "FlareSolverr is ready!",
|
"msg": "FlareSolverr is ready!",
|
||||||
"version": version,
|
"version": version,
|
||||||
@ -29,20 +48,15 @@ app.get("/", ( req: Request, res: Response ) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// health endpoint. this endpoint is special because it doesn't print traces
|
// Health endpoint. this endpoint is special because it doesn't print traces
|
||||||
app.get("/health", ( req: Request, res: Response ) => {
|
app.get("/health", ( req: Request, res: Response ) => {
|
||||||
res.send({
|
res.send({
|
||||||
"status": "ok"
|
"status": "ok"
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// controller v1
|
// Controller v1
|
||||||
app.post("/v1", async( req: Request, res: Response ) => {
|
app.post("/v1", async( req: Request, res: Response ) => {
|
||||||
// count the request for the log prefix
|
|
||||||
log.incRequests()
|
|
||||||
|
|
||||||
const params = req.body;
|
|
||||||
log.info(`Incoming request: /v1 Params: ${JSON.stringify(params)}`);
|
|
||||||
await controllerV1(req, res);
|
await controllerV1(req, res);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -50,7 +64,20 @@ app.post("/v1", async( req: Request, res: Response ) => {
|
|||||||
|
|
||||||
// Unknown paths or verbs
|
// Unknown paths or verbs
|
||||||
app.use(function (req : Request, res : Response) {
|
app.use(function (req : Request, res : Response) {
|
||||||
res.status(404).send({"error": "Unknown resource or HTTP verb"})
|
res.status(404)
|
||||||
|
.send({"error": "Unknown resource or HTTP verb"})
|
||||||
|
})
|
||||||
|
|
||||||
|
// Errors
|
||||||
|
app.use(function (err: any, req: Request, res: Response, next: NextFunction) {
|
||||||
|
if (err) {
|
||||||
|
let msg = 'Invalid request: ' + err;
|
||||||
|
msg = msg.replace("\n", "").replace("\r", "")
|
||||||
|
log.error(msg)
|
||||||
|
res.send({"error": msg})
|
||||||
|
} else {
|
||||||
|
next()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
module.exports = app;
|
module.exports = app;
|
||||||
|
@ -22,10 +22,13 @@ function toIsoString(date: Date) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
incRequests: () => { requests++ },
|
incRequests: () => {
|
||||||
|
requests++
|
||||||
|
},
|
||||||
html(html: string) {
|
html(html: string) {
|
||||||
if (LOG_HTML)
|
if (LOG_HTML) {
|
||||||
this.debug(html)
|
this.debug(html)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
...require('console-log-level')(
|
...require('console-log-level')(
|
||||||
{level: process.env.LOG_LEVEL || 'info',
|
{level: process.env.LOG_LEVEL || 'info',
|
||||||
|
@ -2,20 +2,29 @@
|
|||||||
|
|
||||||
import {Response} from "superagent";
|
import {Response} from "superagent";
|
||||||
import {V1ResponseBase, V1ResponseSession, V1ResponseSessions, V1ResponseSolution} from "../controllers/v1"
|
import {V1ResponseBase, V1ResponseSession, V1ResponseSessions, V1ResponseSolution} from "../controllers/v1"
|
||||||
import {testWebBrowserInstallation} from "../services/sessions";
|
|
||||||
|
|
||||||
const request = require("supertest");
|
const request = require("supertest");
|
||||||
const app = require("../app");
|
const app = require("../app");
|
||||||
|
const sessions = require('../services/sessions');
|
||||||
const version: string = require('../../package.json').version
|
const version: string = require('../../package.json').version
|
||||||
|
|
||||||
const googleUrl = "https://www.google.com";
|
const googleUrl = "https://www.google.com";
|
||||||
const postUrl = "https://ptsv2.com/t/qv4j3-1634496523";
|
const postUrl = "https://ptsv2.com/t/qv4j3-1634496523";
|
||||||
const cfUrl = "https://pirateiro.com/torrents/?search=harry";
|
const cfUrl = "https://pirateiro.com/torrents/?search=harry";
|
||||||
const cfCaptchaUrl = "https://idope.se"
|
const cfCaptchaUrl = "https://idope.se"
|
||||||
|
const proxyUrl = "http://127.0.0.1:8888"
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
// Init session
|
// Init session
|
||||||
await testWebBrowserInstallation();
|
await sessions.testWebBrowserInstallation();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
// Clean sessions
|
||||||
|
const sessionList = sessions.list();
|
||||||
|
for (const session of sessionList) {
|
||||||
|
await sessions.destroy(session);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Test '/' path", () => {
|
describe("Test '/' path", () => {
|
||||||
@ -51,8 +60,6 @@ describe("Test '/wrong' path", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("Test '/v1' path", () => {
|
describe("Test '/v1' path", () => {
|
||||||
jest.setTimeout(70000);
|
|
||||||
|
|
||||||
test("Cmd 'request.bad' should fail", async () => {
|
test("Cmd 'request.bad' should fail", async () => {
|
||||||
const payload = {
|
const payload = {
|
||||||
"cmd": "request.bad",
|
"cmd": "request.bad",
|
||||||
@ -207,7 +214,7 @@ describe("Test '/v1' path", () => {
|
|||||||
"cmd": "request.get",
|
"cmd": "request.get",
|
||||||
"url": googleUrl,
|
"url": googleUrl,
|
||||||
"proxy": {
|
"proxy": {
|
||||||
"url": "http://127.0.0.1:8888"
|
"url": proxyUrl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const response: Response = await request(app).post("/v1").send(payload);
|
const response: Response = await request(app).post("/v1").send(payload);
|
||||||
@ -222,35 +229,35 @@ describe("Test '/v1' path", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// todo: credentials are not working
|
// todo: credentials are not working
|
||||||
// test("Cmd 'request.get' should return OK with 'proxy' param with credentials", async () => {
|
test.skip("Cmd 'request.get' should return OK with 'proxy' param with credentials", async () => {
|
||||||
// /*
|
/*
|
||||||
// To configure TinyProxy in local:
|
To configure TinyProxy in local:
|
||||||
// * sudo vim /etc/tinyproxy/tinyproxy.conf
|
* sudo vim /etc/tinyproxy/tinyproxy.conf
|
||||||
// * edit => LogFile "/tmp/tinyproxy.log"
|
* edit => LogFile "/tmp/tinyproxy.log"
|
||||||
// * edit => Syslog Off
|
* edit => Syslog Off
|
||||||
// * add => BasicAuth testuser testpass
|
* add => BasicAuth testuser testpass
|
||||||
// * sudo tinyproxy -d
|
* sudo tinyproxy -d
|
||||||
// * sudo tail -f /tmp/tinyproxy.log
|
* sudo tail -f /tmp/tinyproxy.log
|
||||||
// */
|
*/
|
||||||
// const payload = {
|
const payload = {
|
||||||
// "cmd": "request.get",
|
"cmd": "request.get",
|
||||||
// "url": googleUrl,
|
"url": googleUrl,
|
||||||
// "proxy": {
|
"proxy": {
|
||||||
// "url": "http://127.0.0.1:8888",
|
"url": proxyUrl,
|
||||||
// "username": "testuser",
|
"username": "testuser",
|
||||||
// "password": "testpass"
|
"password": "testpass"
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// const response: Response = await request(app).post("/v1").send(payload);
|
const response: Response = await request(app).post("/v1").send(payload);
|
||||||
// expect(response.statusCode).toBe(200);
|
expect(response.statusCode).toBe(200);
|
||||||
//
|
|
||||||
// const apiResponse: V1ResponseSolution = response.body;
|
const apiResponse: V1ResponseSolution = response.body;
|
||||||
// expect(apiResponse.status).toBe("ok");
|
expect(apiResponse.status).toBe("ok");
|
||||||
//
|
|
||||||
// const solution = apiResponse.solution;
|
const solution = apiResponse.solution;
|
||||||
// expect(solution.url).toContain(googleUrl)
|
expect(solution.url).toContain(googleUrl)
|
||||||
// expect(solution.status).toContain(200)
|
expect(solution.status).toContain(200)
|
||||||
// });
|
});
|
||||||
|
|
||||||
test("Cmd 'request.get' should fail with wrong 'proxy' param", async () => {
|
test("Cmd 'request.get' should fail with wrong 'proxy' param", async () => {
|
||||||
const payload = {
|
const payload = {
|
||||||
@ -288,7 +295,7 @@ describe("Test '/v1' path", () => {
|
|||||||
test("Cmd 'request.get' should return fail with bad domain", async () => {
|
test("Cmd 'request.get' should return fail with bad domain", async () => {
|
||||||
const payload = {
|
const payload = {
|
||||||
"cmd": "request.get",
|
"cmd": "request.get",
|
||||||
"url": "https://www.google.combad",
|
"url": "https://www.google.combad"
|
||||||
}
|
}
|
||||||
const response: Response = await request(app).post("/v1").send(payload);
|
const response: Response = await request(app).post("/v1").send(payload);
|
||||||
expect(response.statusCode).toBe(500);
|
expect(response.statusCode).toBe(500);
|
||||||
@ -449,7 +456,7 @@ describe("Test '/v1' path", () => {
|
|||||||
expect(apiResponse.status).toBe("ok");
|
expect(apiResponse.status).toBe("ok");
|
||||||
expect(apiResponse.message).toBe("The session has been removed.");
|
expect(apiResponse.message).toBe("The session has been removed.");
|
||||||
expect(apiResponse.startTimestamp).toBeGreaterThan(1000);
|
expect(apiResponse.startTimestamp).toBeGreaterThan(1000);
|
||||||
expect(apiResponse.endTimestamp).toBeGreaterThan(apiResponse.startTimestamp);
|
expect(apiResponse.endTimestamp).toBeGreaterThanOrEqual(apiResponse.startTimestamp);
|
||||||
expect(apiResponse.version).toBe(version);
|
expect(apiResponse.version).toBe(version);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user