huawei-wingle-4g
Version:
This is a module NodeJS allowing to drive Huawei Wingle 4G. This module can :
238 lines • 9.72 kB
JavaScript
"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