2023-12-18 15:13:09 +00:00
|
|
|
import { Dispatcher, request, Agent } from "undici";
|
2023-12-16 14:15:27 +00:00
|
|
|
import { userAgent } from "./config.js";
|
|
|
|
|
2023-12-18 15:13:09 +00:00
|
|
|
const dispatcher = new Agent({
|
2023-12-18 15:46:34 +00:00
|
|
|
connect: { timeout: 60 * 1000 },
|
2023-12-18 15:13:09 +00:00
|
|
|
bodyTimeout: 15 * 60 * 1000,
|
|
|
|
maxRedirections: 20,
|
|
|
|
});
|
2023-12-16 14:27:51 +00:00
|
|
|
|
2023-12-16 14:15:27 +00:00
|
|
|
export class StatusCodeError extends Error {
|
|
|
|
/**
|
|
|
|
* @param {number} code
|
|
|
|
*/
|
|
|
|
constructor(code) {
|
|
|
|
super(`Status code: ${code}`);
|
|
|
|
this.code = code;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export class TooManyRedirectsError extends Error {}
|
|
|
|
|
|
|
|
/**
|
2023-12-18 15:13:09 +00:00
|
|
|
* genera los headers para hacer un pedido dependiendo de la url
|
2023-12-16 14:15:27 +00:00
|
|
|
* @param {URL} url
|
|
|
|
*/
|
2023-12-18 15:13:09 +00:00
|
|
|
function getHeaders(url) {
|
2023-12-16 14:15:27 +00:00
|
|
|
// sharepoint no le gusta compartir a bots lol
|
|
|
|
const spoofUserAgent = url.host.endsWith("sharepoint.com");
|
|
|
|
|
2023-12-18 15:13:09 +00:00
|
|
|
return {
|
|
|
|
"User-Agent": spoofUserAgent
|
|
|
|
? "Mozilla/5.0 (X11; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0"
|
|
|
|
: userAgent,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {URL} url
|
|
|
|
*/
|
2023-12-19 15:01:37 +00:00
|
|
|
export async function customRequest(url) {
|
2023-12-16 14:27:51 +00:00
|
|
|
const res = await request(url.toString(), {
|
2023-12-18 15:13:09 +00:00
|
|
|
headers: getHeaders(url),
|
|
|
|
dispatcher,
|
2023-12-16 14:15:27 +00:00
|
|
|
});
|
2023-12-16 14:27:51 +00:00
|
|
|
if (res.statusCode >= 300 && res.statusCode <= 399)
|
|
|
|
throw new TooManyRedirectsError();
|
|
|
|
if (res.statusCode < 200 || res.statusCode > 299)
|
|
|
|
throw new StatusCodeError(res.statusCode);
|
2023-12-16 14:15:27 +00:00
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|