UNPKG

cookie-pusher

Version:

Cookie-aware HTTP client based on axios and tough-cookie

74 lines (73 loc) 4.05 kB
import { AxiosError } from "./exceptions"; import uiTexts_ from "./ui-texts.config"; const uiTexts = uiTexts_[`/client`]; import defaultHttpHeaders from "./default-http-headers.config"; import axios from "axios"; import toughCookie from "tough-cookie"; import neverThrow from "neverthrow"; export const Cookie = toughCookie.Cookie; const getDefaultRequestHeaders = () => { const numOfUserAgents = defaultHttpHeaders.httpHeaderOptions[`User-Agent`].length; const randomIndex1 = Math.floor(Math.random() * numOfUserAgents); const numOfAcceptLanguages = defaultHttpHeaders.httpHeaderOptions[`Accept-Language`].length; const randomIndex2 = Math.floor(Math.random() * numOfAcceptLanguages); return { "User-Agent": defaultHttpHeaders.httpHeaderOptions[`User-Agent`][randomIndex1], "Accept-Language": defaultHttpHeaders.httpHeaderOptions[`Accept-Language`][randomIndex2], Connection: `keep-alive`, }; }; export class Client { constructor({ userAgent, acceptLanguage, } = {}) { this.defaultHeaders = getDefaultRequestHeaders(); this.lastUrls = []; this.cookies = new toughCookie.CookieJar(); this.setLanguage = (language) => { this.defaultHeaders[`Accept-Language`] = defaultHttpHeaders.languageToAcceptLanguageStringMap[language]; }; this.access = (config) => { var _a, _b, _c; const url = config.baseURL !== undefined ? new URL(config.url, config.baseURL) : new URL(config.url, this.lastUrls[this.lastUrls.length - 1]); this.lastUrls.push(url); const unmodifiedCookieString = this.cookies.getCookieStringSync(url.href); const isUndefinedOrEmpty = (cookieString) => cookieString === undefined || cookieString === ``; const cookieString = isUndefinedOrEmpty(unmodifiedCookieString) ? isUndefinedOrEmpty((_a = config.headers) === null || _a === void 0 ? void 0 : _a.Cookie) ? undefined : (_b = config.headers) === null || _b === void 0 ? void 0 : _b.Cookie : isUndefinedOrEmpty((_c = config.headers) === null || _c === void 0 ? void 0 : _c.Cookie) ? unmodifiedCookieString : `${config.headers.Cookie}; ${unmodifiedCookieString}`; const cookieHeader = cookieString === undefined ? {} : { Cookie: cookieString }; const refererHeader = this.setReferer === undefined ? {} : { Referer: this.setReferer(config, this).href }; const newConfig = Object.assign(Object.assign({ validateStatus: (statusCode) => statusCode >= 200 && statusCode < 400, maxRedirects: 0 }, config), { headers: Object.assign(Object.assign(Object.assign(Object.assign({}, this.defaultHeaders), refererHeader), config.headers), cookieHeader), url: url.href }); delete newConfig.baseURL; const response = axios(newConfig); return neverThrow.ResultAsync.fromPromise(response, (error) => new AxiosError(uiTexts[`axiosRequestError`], error)).andThen((response) => { const setCookies = response.headers[`set-cookie`]; if (Array.isArray(setCookies)) { setCookies.forEach((cookie) => this.cookies.setCookieSync(cookie, url.href)); } if (response.status === 301 || response.status === 302) { const newUrl = response.headers[`location`]; return this.access(Object.assign(Object.assign({}, config), { url: newUrl })); } else { return neverThrow.ok(response); } }); }; if (userAgent !== undefined) { this.defaultHeaders[`User-Agent`] = userAgent; } if (acceptLanguage !== undefined) { this.defaultHeaders[`Accept-Language`] = acceptLanguage; } } } export default { Cookie, Client };