@loadmill/executer 0.1.36 → 0.1.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/errors.d.ts +5 -0
- package/dist/errors.js +38 -0
- package/dist/errors.js.map +1 -0
- package/dist/extraction-combiner.d.ts +4 -2
- package/dist/extraction-combiner.js +96 -46
- package/dist/extraction-combiner.js.map +1 -1
- package/dist/mill-version.js +1 -1
- package/dist/post-script/ast-walker/index.js.map +1 -1
- package/dist/request-sequence-result.d.ts +2 -1
- package/dist/request-sequence-result.js.map +1 -1
- package/dist/sequence.js +288 -115
- package/dist/sequence.js.map +1 -1
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +29 -0
- package/dist/utils.js.map +1 -0
- package/dist/ws.d.ts +69 -0
- package/dist/ws.js +468 -0
- package/dist/ws.js.map +1 -0
- package/package.json +5 -5
- package/src/errors.ts +10 -0
- package/src/extraction-combiner.ts +15 -4
- package/src/mill-version.ts +1 -1
- package/src/post-script/ast-walker/index.ts +1 -1
- package/src/request-sequence-result.ts +2 -0
- package/src/sequence.ts +138 -38
- package/src/utils.ts +8 -0
- package/src/ws.ts +273 -0
- package/test/post-script-executor.spec.ts +24 -24
- package/yarn-error.log +18845 -0
package/dist/sequence.js
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
2
|
var __assign = (this && this.__assign) || function () {
|
|
18
3
|
__assign = Object.assign || function(t) {
|
|
19
4
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
@@ -100,7 +85,6 @@ var clamp_1 = __importDefault(require("lodash/clamp"));
|
|
|
100
85
|
var find_1 = __importDefault(require("lodash/find"));
|
|
101
86
|
var map_1 = __importDefault(require("lodash/map"));
|
|
102
87
|
var filter_1 = __importDefault(require("lodash/filter"));
|
|
103
|
-
var forEach_1 = __importDefault(require("lodash/forEach"));
|
|
104
88
|
var asserter_1 = require("./asserter");
|
|
105
89
|
var failures_1 = require("./failures");
|
|
106
90
|
var request_stats_1 = require("./request-stats");
|
|
@@ -117,9 +101,12 @@ var errors_1 = require("@loadmill/universal/dist/errors");
|
|
|
117
101
|
var parameters_1 = require("@loadmill/core/dist/parameters");
|
|
118
102
|
var conf_1 = require("@loadmill/core/dist/conf");
|
|
119
103
|
var DEFAULT_CACHE_CONTROL = conf_1.confDefaults.DEFAULT_CACHE_CONTROL, DEFAULT_REQUEST_DELAY = conf_1.confDefaults.DEFAULT_REQUEST_DELAY;
|
|
120
|
-
var
|
|
104
|
+
var MAX_RESPONSE_BYTES = conf_1.confExtrema.MAX_RESPONSE_BYTES, MAX_RESPONSE_COLLECT = conf_1.confExtrema.MAX_RESPONSE_COLLECT, MIN_REQUEST_DELAY = conf_1.confExtrema.MIN_REQUEST_DELAY, MAX_REQUEST_LOOPS_ITERATIONS = conf_1.confExtrema.MAX_REQUEST_LOOPS_ITERATIONS;
|
|
121
105
|
var request_1 = require("@loadmill/core/dist/request");
|
|
122
106
|
var test_run_event_emitter_1 = require("./test-run-event-emitter");
|
|
107
|
+
var ws_1 = require("./ws");
|
|
108
|
+
var errors_2 = require("./errors");
|
|
109
|
+
var utils_1 = require("./utils");
|
|
123
110
|
exports.reqIdParamName = 'loadmill-request-id';
|
|
124
111
|
var SOCKET_TIMEOUT = request_1.DEFAULT_REQUEST_TIMEOUT + 5000; // deafult + some extra
|
|
125
112
|
var isPerformance = typeof performance !== 'undefined';
|
|
@@ -205,6 +192,12 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
205
192
|
writable: true,
|
|
206
193
|
value: void 0
|
|
207
194
|
});
|
|
195
|
+
Object.defineProperty(this, "wsHandler", {
|
|
196
|
+
enumerable: true,
|
|
197
|
+
configurable: true,
|
|
198
|
+
writable: true,
|
|
199
|
+
value: void 0
|
|
200
|
+
});
|
|
208
201
|
Object.defineProperty(this, "passStats", {
|
|
209
202
|
enumerable: true,
|
|
210
203
|
configurable: true,
|
|
@@ -218,6 +211,73 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
218
211
|
lastStartedIndex: _this.lastStartedIndex,
|
|
219
212
|
}); }
|
|
220
213
|
});
|
|
214
|
+
Object.defineProperty(this, "resolveAndSetWSReqData", {
|
|
215
|
+
enumerable: true,
|
|
216
|
+
configurable: true,
|
|
217
|
+
writable: true,
|
|
218
|
+
value: function (_a, reqIndex) {
|
|
219
|
+
var url = _a.url, headers = _a.headers, postData = _a.postData, _b = _a.timeout, timeout = _b === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _b, _c = _a.expectedStatus, expectedStatus = _c === void 0 ? 'SUCCESS' : _c;
|
|
220
|
+
var preparedUrl = _this.prepareWsUrl(url, reqIndex);
|
|
221
|
+
var preparedHeaders = _this.prepareWsHeaders(headers, reqIndex);
|
|
222
|
+
var preparedMessage = _this.prepareWsMessage(postData, reqIndex);
|
|
223
|
+
return {
|
|
224
|
+
expectedStatus: expectedStatus,
|
|
225
|
+
headers: preparedHeaders,
|
|
226
|
+
message: preparedMessage,
|
|
227
|
+
timeout: timeout,
|
|
228
|
+
url: preparedUrl,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
Object.defineProperty(this, "prepareWsUrl", {
|
|
233
|
+
enumerable: true,
|
|
234
|
+
configurable: true,
|
|
235
|
+
writable: true,
|
|
236
|
+
value: function (url, reqIndex) {
|
|
237
|
+
var resolvedUrl = _this.resolve(url, function (e) { return setParameterErrorHistogram(e, 'Failed to compute URL - '); });
|
|
238
|
+
_this.resolvedRequests[reqIndex].url = resolvedUrl;
|
|
239
|
+
return resolvedUrl;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
Object.defineProperty(this, "prepareWsHeaders", {
|
|
243
|
+
enumerable: true,
|
|
244
|
+
configurable: true,
|
|
245
|
+
writable: true,
|
|
246
|
+
value: function (headers, reqIndex) {
|
|
247
|
+
var resolvedHeadersObj = {};
|
|
248
|
+
var resolvedHeaders = [];
|
|
249
|
+
if (headers && !isEmpty_1.default(headers)) {
|
|
250
|
+
resolvedHeaders.push.apply(resolvedHeaders, _this.resolveHeaders(headers));
|
|
251
|
+
resolvedHeaders.forEach(function (_a) {
|
|
252
|
+
var name = _a.name, value = _a.value;
|
|
253
|
+
return resolvedHeadersObj[name] = value;
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
_this.resolvedRequests[reqIndex].headers = resolvedHeaders;
|
|
257
|
+
return resolvedHeadersObj;
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
Object.defineProperty(this, "prepareWsMessage", {
|
|
261
|
+
enumerable: true,
|
|
262
|
+
configurable: true,
|
|
263
|
+
writable: true,
|
|
264
|
+
value: function (postData, reqIndex) {
|
|
265
|
+
var resolvedMessage = '';
|
|
266
|
+
if (postData) {
|
|
267
|
+
resolvedMessage = _this.resolve(postData.text, function (err) {
|
|
268
|
+
return setParameterErrorHistogram(err, 'Failed to compute Websocket message - ');
|
|
269
|
+
});
|
|
270
|
+
if (resolvedMessage && resolvedMessage.length > utils_1.getMaxRequestBodySize()) {
|
|
271
|
+
throw new errors_2.RequestFailuresError('Websocket message size is too large');
|
|
272
|
+
}
|
|
273
|
+
_this.resolvedRequests[reqIndex].postData = {
|
|
274
|
+
mimeType: postData.mimeType,
|
|
275
|
+
text: resolvedMessage,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return resolvedMessage;
|
|
279
|
+
}
|
|
280
|
+
});
|
|
221
281
|
Object.defineProperty(this, "checkProgressEvent", {
|
|
222
282
|
enumerable: true,
|
|
223
283
|
configurable: true,
|
|
@@ -253,6 +313,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
253
313
|
freeSocketTimeout: SOCKET_TIMEOUT / 2
|
|
254
314
|
});
|
|
255
315
|
this.postScriptRunner = new post_script_executor_1.PostScriptRunner();
|
|
316
|
+
this.wsHandler = new ws_1.WSSequenceHandler();
|
|
256
317
|
}
|
|
257
318
|
Object.defineProperty(SequenceExecutor.prototype, "startAndPass", {
|
|
258
319
|
enumerable: false,
|
|
@@ -318,11 +379,14 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
318
379
|
log_1.default.info(reason, error_1);
|
|
319
380
|
log_1.default.info('Unexpected error info:', unexpectedError);
|
|
320
381
|
}
|
|
382
|
+
this.wsHandler.closeAllConnections();
|
|
321
383
|
throw error_1;
|
|
322
384
|
case 6:
|
|
323
385
|
++reqIndex;
|
|
324
386
|
return [3 /*break*/, 1];
|
|
325
|
-
case 7:
|
|
387
|
+
case 7:
|
|
388
|
+
this.wsHandler.closeAllConnections();
|
|
389
|
+
return [2 /*return*/];
|
|
326
390
|
}
|
|
327
391
|
});
|
|
328
392
|
});
|
|
@@ -407,7 +471,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
407
471
|
: rawDelay)), MIN_REQUEST_DELAY, Infinity);
|
|
408
472
|
problem = conf_1.validateIntegerDelay(delay, false);
|
|
409
473
|
if (problem) {
|
|
410
|
-
throw new RequestFailuresError("Invalid Request Delay: " + problem);
|
|
474
|
+
throw new errors_2.RequestFailuresError("Invalid Request Delay: " + problem);
|
|
411
475
|
}
|
|
412
476
|
return [4 /*yield*/, promiseUtils.delay(delay)];
|
|
413
477
|
case 1:
|
|
@@ -438,9 +502,10 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
438
502
|
case 0:
|
|
439
503
|
loopIteration = 0;
|
|
440
504
|
maxIterations = getLoopIterations(requestConf.loop);
|
|
505
|
+
this.wsHandler.clearMessages();
|
|
441
506
|
_b.label = 1;
|
|
442
507
|
case 1:
|
|
443
|
-
if (!(loopIteration < maxIterations)) return [3 /*break*/,
|
|
508
|
+
if (!(loopIteration < maxIterations)) return [3 /*break*/, 9];
|
|
444
509
|
loopIteration++;
|
|
445
510
|
request = this.prepareRequest(requestConf, index);
|
|
446
511
|
return [4 /*yield*/, this.sendRequest(request, index)];
|
|
@@ -450,32 +515,35 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
450
515
|
resTime = Number(this.parameters.__responseTime);
|
|
451
516
|
_a = requestConf.timeout, timeout = _a === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _a;
|
|
452
517
|
if (resTime > timeout) {
|
|
453
|
-
throw new RequestFailuresError("Response received after timeout of " + timeout + "ms exceeded");
|
|
518
|
+
throw new errors_2.RequestFailuresError("Response received after timeout of " + timeout + "ms exceeded");
|
|
454
519
|
}
|
|
455
|
-
|
|
520
|
+
res.wsExtractionData = { messages: this.wsHandler.messages, timeLimit: timeout - resTime };
|
|
521
|
+
return [4 /*yield*/, this.processSuccessfulResponse(index, requestConf, res)];
|
|
522
|
+
case 3:
|
|
523
|
+
failedAssertionsHistogram = _b.sent();
|
|
456
524
|
this.resolvedRequests[index].retried = loopIteration > 1 ? loopIteration - 1 : undefined;
|
|
457
|
-
if (!(loopIteration < maxIterations)) return [3 /*break*/,
|
|
458
|
-
if (!this.shouldStopLooping(requestConf.loop)) return [3 /*break*/,
|
|
459
|
-
return [3 /*break*/,
|
|
460
|
-
case
|
|
461
|
-
case
|
|
525
|
+
if (!(loopIteration < maxIterations)) return [3 /*break*/, 7];
|
|
526
|
+
if (!this.shouldStopLooping(requestConf.loop)) return [3 /*break*/, 4];
|
|
527
|
+
return [3 /*break*/, 9];
|
|
528
|
+
case 4: return [4 /*yield*/, promiseUtils.delay(1000)];
|
|
529
|
+
case 5:
|
|
462
530
|
_b.sent(); // todo yigal - make this configrable?
|
|
463
|
-
_b.label =
|
|
464
|
-
case
|
|
465
|
-
case
|
|
531
|
+
_b.label = 6;
|
|
532
|
+
case 6: return [3 /*break*/, 8];
|
|
533
|
+
case 7:
|
|
466
534
|
if (this.hasLoopingFailed(requestConf.loop)) {
|
|
467
|
-
throw new RequestFailuresError("Request failed to meet loop condition for " + maxIterations + " iterations");
|
|
535
|
+
throw new errors_2.RequestFailuresError("Request failed to meet loop condition for " + maxIterations + " iterations");
|
|
468
536
|
}
|
|
469
|
-
_b.label =
|
|
470
|
-
case
|
|
471
|
-
case
|
|
537
|
+
_b.label = 8;
|
|
538
|
+
case 8: return [3 /*break*/, 1];
|
|
539
|
+
case 9:
|
|
472
540
|
if (!isEmpty_1.default(failedAssertionsHistogram)) {
|
|
473
541
|
message = 'Request failed due to assertions.';
|
|
474
542
|
log_1.default.debug(message, {
|
|
475
543
|
failedAssertionsHistogram: failedAssertionsHistogram,
|
|
476
544
|
parameters: this.parameters,
|
|
477
545
|
});
|
|
478
|
-
throw new RequestFailuresError(message, failedAssertionsHistogram);
|
|
546
|
+
throw new errors_2.RequestFailuresError(message, failedAssertionsHistogram);
|
|
479
547
|
}
|
|
480
548
|
this.onRequestSuccess(index, resTime);
|
|
481
549
|
return [2 /*return*/];
|
|
@@ -600,7 +668,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
600
668
|
case 7:
|
|
601
669
|
reportedReason = errors_1.unknownStatusCorsError;
|
|
602
670
|
_c.label = 8;
|
|
603
|
-
case 8: throw new RequestFailuresError(message, (_b = {}, _b[reportedReason] = 1, _b));
|
|
671
|
+
case 8: throw new errors_2.RequestFailuresError(message, (_b = {}, _b[reportedReason] = 1, _b));
|
|
604
672
|
case 9:
|
|
605
673
|
failure = this.failures[reqIndex];
|
|
606
674
|
if (failure) {
|
|
@@ -614,6 +682,27 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
614
682
|
}
|
|
615
683
|
});
|
|
616
684
|
Object.defineProperty(SequenceExecutor.prototype, "prepareRequest", {
|
|
685
|
+
enumerable: false,
|
|
686
|
+
configurable: true,
|
|
687
|
+
writable: true,
|
|
688
|
+
value: function (requestConf, reqIndex) {
|
|
689
|
+
if (this.isWSRequest(requestConf) && !envUtils.isBrowser()) {
|
|
690
|
+
return this.prepareWSRequest(requestConf, reqIndex);
|
|
691
|
+
}
|
|
692
|
+
return this.prepareHttpRequest(requestConf, reqIndex);
|
|
693
|
+
}
|
|
694
|
+
});
|
|
695
|
+
Object.defineProperty(SequenceExecutor.prototype, "isWSRequest", {
|
|
696
|
+
enumerable: false,
|
|
697
|
+
configurable: true,
|
|
698
|
+
writable: true,
|
|
699
|
+
value: function (_a) {
|
|
700
|
+
var url = _a.url;
|
|
701
|
+
var resolvedUrl = this.resolve(url, function (e) { return setParameterErrorHistogram(e, 'Failed to compute URL - '); });
|
|
702
|
+
return resolvedUrl.startsWith('ws://') || resolvedUrl.startsWith('wss://');
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
Object.defineProperty(SequenceExecutor.prototype, "prepareHttpRequest", {
|
|
617
706
|
enumerable: false,
|
|
618
707
|
configurable: true,
|
|
619
708
|
writable: true,
|
|
@@ -651,8 +740,11 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
651
740
|
if (auth != null && request._header['authorization'] == null) {
|
|
652
741
|
request.auth(auth.user || '', auth.password || '');
|
|
653
742
|
}
|
|
654
|
-
var postData = requestConf.postData;
|
|
655
|
-
if (
|
|
743
|
+
var postData = requestConf.postData, postFormData = requestConf.postFormData;
|
|
744
|
+
if (postFormData) {
|
|
745
|
+
this.preparePostFormData(postFormData, request, reqIndex);
|
|
746
|
+
}
|
|
747
|
+
else if (postData) {
|
|
656
748
|
// It is CRUCIAL that the type is set before the body:
|
|
657
749
|
var mimeType = postData.mimeType;
|
|
658
750
|
if (mimeType && request._header['content-type'] == null) {
|
|
@@ -662,8 +754,8 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
662
754
|
var data = this.resolve(postData.text, function (err) {
|
|
663
755
|
return setParameterErrorHistogram(err, 'Failed to compute request body - ');
|
|
664
756
|
});
|
|
665
|
-
if (data && data.length > getMaxRequestBodySize()) {
|
|
666
|
-
throw new RequestFailuresError('Request body size is too large');
|
|
757
|
+
if (data && data.length > utils_1.getMaxRequestBodySize()) {
|
|
758
|
+
throw new errors_2.RequestFailuresError('Request body size is too large');
|
|
667
759
|
}
|
|
668
760
|
// This invocation will behave differently according to different types set on the request:
|
|
669
761
|
request.send(data);
|
|
@@ -721,7 +813,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
721
813
|
request.on('progress', progressHandler);
|
|
722
814
|
// This makes superagent populate res.text regardless of the response's content type:
|
|
723
815
|
request.buffer();
|
|
724
|
-
// Otherwise we expose superagent and its version -
|
|
816
|
+
// Otherwise we expose superagent and its version -
|
|
725
817
|
// better have something more general (in case the user didnt set one):
|
|
726
818
|
var uaHeader = request.get('User-Agent');
|
|
727
819
|
if (!uaHeader || uaHeader.startsWith('node-superagent')) {
|
|
@@ -733,6 +825,49 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
733
825
|
return request;
|
|
734
826
|
}
|
|
735
827
|
});
|
|
828
|
+
Object.defineProperty(SequenceExecutor.prototype, "preparePostFormData", {
|
|
829
|
+
enumerable: false,
|
|
830
|
+
configurable: true,
|
|
831
|
+
writable: true,
|
|
832
|
+
value: function (postFormData, request, reqIndex) {
|
|
833
|
+
var resolvedPostFormData = [];
|
|
834
|
+
var size = 0;
|
|
835
|
+
var MAX_BODY_SIZE = utils_1.getMaxRequestBodySize();
|
|
836
|
+
for (var _i = 0, postFormData_1 = postFormData; _i < postFormData_1.length; _i++) {
|
|
837
|
+
var entry = postFormData_1[_i];
|
|
838
|
+
var name_1 = entry.name, value = entry.value, fileName = entry.fileName;
|
|
839
|
+
var resolvedName = this.resolve(name_1, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve form-data key - '); });
|
|
840
|
+
size += resolvedName.length;
|
|
841
|
+
if (fileName) {
|
|
842
|
+
var resolvedFileName = this.resolve(fileName, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve form-data fileName - '); });
|
|
843
|
+
size += (resolvedFileName.length + value.length);
|
|
844
|
+
var buffer = Buffer.from(value, 'binary');
|
|
845
|
+
request.attach(resolvedName, buffer, resolvedFileName);
|
|
846
|
+
resolvedPostFormData.push({ name: resolvedName, value: value, fileName: resolvedFileName });
|
|
847
|
+
}
|
|
848
|
+
else {
|
|
849
|
+
var resolvedValue = this.resolve(value, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve form-data value - '); });
|
|
850
|
+
size += resolvedValue.length;
|
|
851
|
+
request.field(resolvedName, resolvedValue);
|
|
852
|
+
resolvedPostFormData.push({ name: resolvedName, value: resolvedValue });
|
|
853
|
+
}
|
|
854
|
+
if (size > MAX_BODY_SIZE) {
|
|
855
|
+
throw new errors_2.RequestFailuresError('Form Data size is too large');
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
this.resolvedRequests[reqIndex].postFormData = resolvedPostFormData;
|
|
859
|
+
}
|
|
860
|
+
});
|
|
861
|
+
Object.defineProperty(SequenceExecutor.prototype, "prepareWSRequest", {
|
|
862
|
+
enumerable: false,
|
|
863
|
+
configurable: true,
|
|
864
|
+
writable: true,
|
|
865
|
+
value: function (requestConf, reqIndex) {
|
|
866
|
+
var _this = this;
|
|
867
|
+
var wsRequestArgs = this.resolveAndSetWSReqData(requestConf, reqIndex);
|
|
868
|
+
return new ws_1.WSRequest(wsRequestArgs, this.wsHandler, function (e) { return _this.setSingleFailure(reqIndex, 'Websocket error: ' + e.message); });
|
|
869
|
+
}
|
|
870
|
+
});
|
|
736
871
|
Object.defineProperty(SequenceExecutor.prototype, "validateDomain", {
|
|
737
872
|
enumerable: false,
|
|
738
873
|
configurable: true,
|
|
@@ -741,15 +876,15 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
741
876
|
var _a, _b, _c;
|
|
742
877
|
if (isEmpty_1.default(domain)) {
|
|
743
878
|
var message = 'HTTP request domain name is empty';
|
|
744
|
-
throw new RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
|
|
879
|
+
throw new errors_2.RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
|
|
745
880
|
}
|
|
746
881
|
if (conf_1.validate.isUrl(domain)) {
|
|
747
882
|
var message = "HTTP request domain name [" + domain + "] is not valid";
|
|
748
|
-
throw new RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
|
|
883
|
+
throw new errors_2.RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
|
|
749
884
|
}
|
|
750
885
|
else if (!uriUtils.isVerified(domain, this.domainsWhiteList)) {
|
|
751
886
|
var message = "HTTP request domain name [" + domain + "] is not on white list";
|
|
752
|
-
throw new RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
|
|
887
|
+
throw new errors_2.RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
|
|
753
888
|
}
|
|
754
889
|
}
|
|
755
890
|
});
|
|
@@ -783,21 +918,32 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
783
918
|
configurable: true,
|
|
784
919
|
writable: true,
|
|
785
920
|
value: function (reqIndex, requestConf, res) {
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
921
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
922
|
+
var assertionResults, failuresHistogram;
|
|
923
|
+
return __generator(this, function (_a) {
|
|
924
|
+
switch (_a.label) {
|
|
925
|
+
case 0:
|
|
926
|
+
// modifies parameters:
|
|
927
|
+
return [4 /*yield*/, this.handleExtractions(requestConf, res)];
|
|
928
|
+
case 1:
|
|
929
|
+
// modifies parameters:
|
|
930
|
+
_a.sent();
|
|
931
|
+
if (!envUtils.isBrowser()) {
|
|
932
|
+
this.handlePostScript(requestConf, res);
|
|
933
|
+
}
|
|
934
|
+
this.setPostParameters(reqIndex);
|
|
935
|
+
assertionResults = this.handleAssertions(requestConf) || [];
|
|
936
|
+
log_1.default.trace('Assertion results: ', assertionResults);
|
|
937
|
+
failuresHistogram = {};
|
|
938
|
+
assertionResults.forEach(function (result, index) {
|
|
939
|
+
if (!result) {
|
|
940
|
+
failuresHistogram[index] = 1;
|
|
941
|
+
}
|
|
942
|
+
});
|
|
943
|
+
return [2 /*return*/, failuresHistogram];
|
|
944
|
+
}
|
|
945
|
+
});
|
|
799
946
|
});
|
|
800
|
-
return failuresHistogram;
|
|
801
947
|
}
|
|
802
948
|
});
|
|
803
949
|
Object.defineProperty(SequenceExecutor.prototype, "setPostParameters", {
|
|
@@ -813,10 +959,26 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
813
959
|
configurable: true,
|
|
814
960
|
writable: true,
|
|
815
961
|
value: function (requestConf, res) {
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
962
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
963
|
+
var _i, _a, extractions;
|
|
964
|
+
return __generator(this, function (_b) {
|
|
965
|
+
switch (_b.label) {
|
|
966
|
+
case 0:
|
|
967
|
+
_i = 0, _a = (requestConf.extract || []);
|
|
968
|
+
_b.label = 1;
|
|
969
|
+
case 1:
|
|
970
|
+
if (!(_i < _a.length)) return [3 /*break*/, 4];
|
|
971
|
+
extractions = _a[_i];
|
|
972
|
+
return [4 /*yield*/, this.extractInScope(res, extractions)];
|
|
973
|
+
case 2:
|
|
974
|
+
_b.sent();
|
|
975
|
+
_b.label = 3;
|
|
976
|
+
case 3:
|
|
977
|
+
_i++;
|
|
978
|
+
return [3 /*break*/, 1];
|
|
979
|
+
case 4: return [2 /*return*/];
|
|
980
|
+
}
|
|
981
|
+
});
|
|
820
982
|
});
|
|
821
983
|
}
|
|
822
984
|
});
|
|
@@ -825,11 +987,28 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
825
987
|
configurable: true,
|
|
826
988
|
writable: true,
|
|
827
989
|
value: function (res, extractions) {
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
990
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
991
|
+
var contextParameters, extractionCombiner, _i, _a, _b, name_2, extraction;
|
|
992
|
+
return __generator(this, function (_c) {
|
|
993
|
+
switch (_c.label) {
|
|
994
|
+
case 0:
|
|
995
|
+
contextParameters = Object.assign({}, this.parameters);
|
|
996
|
+
extractionCombiner = new extraction_combiner_1.ExtractionCombiner(contextParameters, res, res.wsExtractionData);
|
|
997
|
+
_i = 0, _a = Object.entries(extractions);
|
|
998
|
+
_c.label = 1;
|
|
999
|
+
case 1:
|
|
1000
|
+
if (!(_i < _a.length)) return [3 /*break*/, 4];
|
|
1001
|
+
_b = _a[_i], name_2 = _b[0], extraction = _b[1];
|
|
1002
|
+
return [4 /*yield*/, this.extract(name_2, extraction, extractionCombiner)];
|
|
1003
|
+
case 2:
|
|
1004
|
+
_c.sent();
|
|
1005
|
+
_c.label = 3;
|
|
1006
|
+
case 3:
|
|
1007
|
+
_i++;
|
|
1008
|
+
return [3 /*break*/, 1];
|
|
1009
|
+
case 4: return [2 /*return*/];
|
|
1010
|
+
}
|
|
1011
|
+
});
|
|
833
1012
|
});
|
|
834
1013
|
}
|
|
835
1014
|
});
|
|
@@ -838,31 +1017,46 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
838
1017
|
configurable: true,
|
|
839
1018
|
writable: true,
|
|
840
1019
|
value: function (parameterName, extraction, extractionCombiner) {
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
1020
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1021
|
+
var combinedExtractor, result, error_3, genericMessage, prettyMessage, publicMessage;
|
|
1022
|
+
return __generator(this, function (_a) {
|
|
1023
|
+
switch (_a.label) {
|
|
1024
|
+
case 0:
|
|
1025
|
+
log_1.default.trace('Parameter extraction start: ', { parameterName: parameterName, extraction: extraction });
|
|
1026
|
+
return [4 /*yield*/, extractionCombiner.combine(extraction)];
|
|
1027
|
+
case 1:
|
|
1028
|
+
combinedExtractor = _a.sent();
|
|
1029
|
+
_a.label = 2;
|
|
1030
|
+
case 2:
|
|
1031
|
+
_a.trys.push([2, 4, , 5]);
|
|
1032
|
+
return [4 /*yield*/, combinedExtractor()];
|
|
1033
|
+
case 3:
|
|
1034
|
+
result = _a.sent();
|
|
1035
|
+
return [3 /*break*/, 5];
|
|
1036
|
+
case 4:
|
|
1037
|
+
error_3 = _a.sent();
|
|
1038
|
+
genericMessage = "Failed to extract value for parameter \"" + parameterName + "\"";
|
|
1039
|
+
log_1.default.debug(genericMessage, error_3);
|
|
1040
|
+
prettyMessage = error_3.prettyMessage;
|
|
1041
|
+
publicMessage = prettyMessage
|
|
1042
|
+
? genericMessage + " - " + prettyMessage
|
|
1043
|
+
: genericMessage;
|
|
1044
|
+
throw new errors_2.RequestFailuresError(publicMessage);
|
|
1045
|
+
case 5:
|
|
1046
|
+
if (result != null) {
|
|
1047
|
+
this.parameters[parameterName] = result;
|
|
1048
|
+
}
|
|
1049
|
+
else if (this.parameters[parameterName] == null) {
|
|
1050
|
+
// Existing parameter value acts as default. If no such value exists,
|
|
1051
|
+
// we set the value to be an empty string to differentiate it from undefined parameters.
|
|
1052
|
+
// Otherwise, this parameter's usages would stay untouched, e.g. "${paramName}".
|
|
1053
|
+
this.parameters[parameterName] = '';
|
|
1054
|
+
}
|
|
1055
|
+
log_1.default.trace('Parameter value:', this.parameters[parameterName]);
|
|
1056
|
+
return [2 /*return*/];
|
|
1057
|
+
}
|
|
1058
|
+
});
|
|
1059
|
+
});
|
|
866
1060
|
}
|
|
867
1061
|
});
|
|
868
1062
|
Object.defineProperty(SequenceExecutor.prototype, "resolve", {
|
|
@@ -888,7 +1082,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
888
1082
|
}
|
|
889
1083
|
catch (e) {
|
|
890
1084
|
var message = ['Post Script', e.name + ':', e.message].join(' ');
|
|
891
|
-
throw new RequestFailuresError(message);
|
|
1085
|
+
throw new errors_2.RequestFailuresError(message);
|
|
892
1086
|
}
|
|
893
1087
|
test_run_event_emitter_1.testRunEventsEmitter.postScript.finished();
|
|
894
1088
|
}
|
|
@@ -968,9 +1162,6 @@ function isSimpleRequest(headers) {
|
|
|
968
1162
|
key !== 'content-type';
|
|
969
1163
|
});
|
|
970
1164
|
}
|
|
971
|
-
var getMaxRequestBodySize = function () {
|
|
972
|
-
return envUtils.isBrowser() ? MAX_LOAD_REQUEST_BODY_LENGTH : MAX_API_REQUEST_BODY_LENGTH;
|
|
973
|
-
};
|
|
974
1165
|
var getLoopIterations = function (LoopConf) {
|
|
975
1166
|
var declared = (LoopConf && LoopConf.iterations) || 1;
|
|
976
1167
|
return Math.min(MAX_REQUEST_LOOPS_ITERATIONS, declared);
|
|
@@ -987,7 +1178,7 @@ var extendResponseHeaders = function (headers, redirectHeaders) {
|
|
|
987
1178
|
var isExpectedStatus = function (_a, status) {
|
|
988
1179
|
var expectedStatus = _a.expectedStatus, url = _a.url;
|
|
989
1180
|
if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS) {
|
|
990
|
-
return 200 <= status && status < 400;
|
|
1181
|
+
return (200 <= status && status < 400) || status === 101;
|
|
991
1182
|
}
|
|
992
1183
|
else if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ERROR) {
|
|
993
1184
|
log_1.default.debug('user asked to fail this request', url);
|
|
@@ -1023,22 +1214,4 @@ var setTCPReuse = function (request, agent, sslAgent) {
|
|
|
1023
1214
|
_oldRequest.apply.apply(_oldRequest, __spreadArray([this], args));
|
|
1024
1215
|
};
|
|
1025
1216
|
};
|
|
1026
|
-
var RequestFailuresError = /** @class */ (function (_super) {
|
|
1027
|
-
__extends(RequestFailuresError, _super);
|
|
1028
|
-
function RequestFailuresError(message, histogram) {
|
|
1029
|
-
var _a;
|
|
1030
|
-
if (histogram === void 0) { histogram = (_a = {}, _a[message] = 1, _a); }
|
|
1031
|
-
var _this = _super.call(this, message) || this;
|
|
1032
|
-
Object.defineProperty(_this, "histogram", {
|
|
1033
|
-
enumerable: true,
|
|
1034
|
-
configurable: true,
|
|
1035
|
-
writable: true,
|
|
1036
|
-
value: histogram
|
|
1037
|
-
});
|
|
1038
|
-
// Workaround suggested in: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
|
|
1039
|
-
Object.setPrototypeOf(_this, RequestFailuresError.prototype);
|
|
1040
|
-
return _this;
|
|
1041
|
-
}
|
|
1042
|
-
return RequestFailuresError;
|
|
1043
|
-
}(Error));
|
|
1044
1217
|
//# sourceMappingURL=sequence.js.map
|