-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.js
95 lines (85 loc) · 3.57 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
const FormData = require('form-data');
const fs = require('fs').promises;
const moment = require('moment');
const _ = require('lodash');
const { default: axios } = require('axios');
function isCachedRequest(entry) {
var response = entry.response;
var resBodySize = Math.max(0, response.bodySize || 0, response._transferSize || 0);
return (response.status == 304 || (resBodySize === 0 && response.content && response.content.size > 0));
};
async function load(file, options) {
options = options || {};
options.timeout = _.isNumber(options.timeout) ? options.timeout : 60000;
options.replayCachedEntries = _.isBoolean(options.replayCachedEntries) ? options.replayCachedEntries : false;
const axiosModule = options.axios || axios;
const contents = await fs.readFile(file);
const har = JSON.parse(contents);
if (_.isUndefined(har) ||
_.isUndefined(har.log) ||
_.isUndefined(har.log.entries) ||
har.log.entries.length === 0) {
if (options.onFinish)
options.onFinish();
return;
}
const onFinish = _.after(har.log.entries.length, function() {
if (options.onFinish)
options.onFinish();
});
const firstTime = moment(har.log.entries[0].startedDateTime);
_.forEach(har.log.entries, (entry) => {
if (options.replayCachedEntries || !isCachedRequest(entry)) {
const delay = moment(entry.startedDateTime).diff(firstTime, 'miliseconds');
const request = entry.request;
if (request.postData && _.isUndefined(request.postData.params))
request.postData.params = [];
_.delay(async () => {
try {
const headers = {};
let data;
_.forEach(request.headers, function(header) {
if (header.name.indexOf(':') !== 0)
headers[header.name] = header.value;
});
if (options.beforeRequest) {
let cont = options.beforeRequest(request);
if (cont && cont.then)
cont = await cont;
if (_.isBoolean(cont) && !cont) {
onFinish();
return;
}
}
if (request.postData) {
const form = new FormData();
_.forEach(request.postData.params, (p) => {
if (p.fileName) {
form.append(p.name, p.value ? Buffer.from(p.value) : fs.createReadStream(p.fileName), p.fileName);
} else if (p.value) {
form.append(p.name, p.value);
}
});
data = form;
}
const response = await axiosModule.request({
method: request.method,
url: request.url,
headers,
data,
timeout: options.timeeout
});
if(response && options.onResponse)
options.onResponse(response, request);
} catch (err) {
if (options.onError)
options.onError(err, entry.request);
}
onFinish();
}, delay);
} else {
onFinish();
}
});
}
module.exports.load = load;