UNPKG

huawei-wingle-4g

Version:

This is a module NodeJS allowing to drive Huawei Wingle 4G. This module can :

238 lines 9.72 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const axios_1 = __importDefault(require("axios")); const tough_cookie_1 = __importDefault(require("tough-cookie")); const log4js_1 = __importDefault(require("log4js")); const jsdom_1 = require("jsdom"); const StringUtils_1 = require("../utils/StringUtils"); class Connection { constructor(baseUrl) { this.baseUrl = baseUrl; this.logger = log4js_1.default.getLogger(StringUtils_1.substringAfter(__filename, 'huawei-wingle-4g')); this.connection = this.createConnection(); this.cookieJar = new tough_cookie_1.default.CookieJar(); this.tokens = []; } activeLog(activeLog) { this.logger.level = activeLog ? 'debug' : 'OFF'; } createConnection() { return axios_1.default.create({ withCredentials: true, maxRedirects: 0, validateStatus: () => true, headers: { Connection: 'keep-alive', Pragma: 'no-cache', 'Cache-Control': 'no-cache', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', Accept: ' text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7' } }); } openHomePage() { return this.get('/'); } get(url, maxRedirection = 5) { return __awaiter(this, void 0, void 0, function* () { if (url.startsWith('/')) { url = `${this.baseUrl}${url}`; } this.logger.debug(`GET connect on url : ${url}`); const cookies = yield this.getCookies(url); const request = { method: 'get', url }; if (cookies) { request.headers = { Cookie: cookies }; } const response = yield this.connection.request(request); this.logger.debug(`Status : ${response.status}`); this.storeCookies(response, url); if (this.isRedirection(response.status)) { const redirectUrl = response.request.res.headers.location; this.logger.debug('Redirect url', redirectUrl); if (maxRedirection <= 0) { const messageError = 'Max redirect reached'; this.logger.error(messageError); throw new Error(messageError); } return yield this.get(redirectUrl, maxRedirection - 1); } const dom = new jsdom_1.JSDOM(response.data); const document = dom.window.document; if (response.headers['content-type'] === 'text/html') { this.storeTokensFromDocument(document); } this.logger.debug('Header', response.headers); this.logger.debug('Response', response.data); return { status: response.status, document }; }); } post(url, parameters, maxRedirection = 5) { return __awaiter(this, void 0, void 0, function* () { if (url.startsWith('/')) { url = `${this.baseUrl}${url}`; } this.logger.debug(`POST connect on url : ${url}`); this.logger.debug(`Parameters : ${parameters}`); const cookies = yield this.getCookies(url); const request = { method: 'post', url, data: parameters }; const token = this.peekToken(); request.headers = { __RequestVerificationToken: token }; this.logger.debug('Request', request); if (cookies) { if (!request.headers) { request.headers = {}; } request.headers.Cookie = cookies; } const response = yield this.connection.request(request); this.logger.debug(`Status : ${response.status}`); this.storeCookies(response, url); if (this.isRedirection(response.status)) { const redirectUrl = response.request.res.headers.location; this.logger.debug(`Redirect url : ${redirectUrl}`); if (maxRedirection <= 0) { const messageError = 'Max redirect reached'; throw new Error(messageError); } return yield this.get(redirectUrl, maxRedirection - 1); } const dom = new jsdom_1.JSDOM(response.data); const document = dom.window.document; this.storeTokensFromHeaders(response, document); this.logger.debug('Headers', response.headers); //this.logger.debug('Response', response.data); return { status: response.status, document }; }); } getCookies(url) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { this.cookieJar.getCookies(url, { secure: true }, (err, cookies) => { if (err) { reject(err); } else { const stringCookies = cookies.map(cookie => cookie.cookieString()).join('; '); this.logger.debug(`Cookies [${stringCookies}] for [${url}]`); resolve(cookies.map(cookie => cookie.cookieString()).join('; ')); } }); }); }); } isRedirection(status) { return [301, 302, 307].includes(status); } storeCookies(response, url) { return __awaiter(this, void 0, void 0, function* () { const headers = response.headers; if (!headers) { return; } const cookies = headers['set-cookie']; if (!cookies) { return; } if (Array.isArray(cookies)) { cookies.forEach(cookie => this.cookieJar.setCookie(cookie, url, () => { })); } else { this.cookieJar.setCookie(cookies, url, () => { }); } }); } storeTokensFromHeaders(response, document) { if (!response) { return; } const headers = response.headers; if (!headers) { return; } if (headers.__RequestVerificationTokenone) { this.tokens = []; this.tokens.push(headers.__RequestVerificationTokenone); if (headers.__RequestVerificationTokentwo) { this.tokens.push(headers.__RequestVerificationTokentwo); } } else if (headers.__requestverificationtokenone) { this.tokens = []; this.tokens.push(headers.__requestverificationtokenone); if (headers.__requestverificationtokentwo) { this.tokens.push(headers.__requestverificationtokentwo); } } else if (headers.__RequestVerificationToken) { this.tokens.push(headers.__RequestVerificationToken); } else if (headers.__requestverificationtoken) { this.tokens.push(headers.__requestverificationtoken); } } storeTokensFromDocument(document) { const metaElements = document.querySelectorAll('meta[name=csrf_token]'); if (metaElements && metaElements.length) { this.tokens = []; for (const metaElement of metaElements) { const token = metaElement === null || metaElement === void 0 ? void 0 : metaElement.getAttribute('content'); if (token) { this.tokens.push(token); } } } } peekToken() { if (!this.tokens.length) { throw new Error('No request verification token'); } const token = this.tokens[0]; this.tokens.splice(0, 1); return token; } getToken() { if (!this.tokens.length) { throw new Error('No request verification token'); } return this.tokens[0]; } static isSuccess(response) { var _a; return ((_a = response.document.querySelector('response')) === null || _a === void 0 ? void 0 : _a.textContent) === 'OK'; } } exports.default = Connection; //# sourceMappingURL=Connection.js.map