@loadmill/executer 0.1.37 → 0.1.38
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/sequence.js +249 -112
- 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 +66 -0
- package/dist/ws.js +435 -0
- package/dist/ws.js.map +1 -0
- package/package.json +4 -4
- package/src/errors.ts +10 -0
- package/src/extraction-combiner.ts +15 -4
- package/src/mill-version.ts +1 -1
- package/src/sequence.ts +101 -33
- package/src/utils.ts +8 -0
- package/src/ws.ts +233 -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,
|
|
@@ -662,8 +751,8 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
662
751
|
var data = this.resolve(postData.text, function (err) {
|
|
663
752
|
return setParameterErrorHistogram(err, 'Failed to compute request body - ');
|
|
664
753
|
});
|
|
665
|
-
if (data && data.length > getMaxRequestBodySize()) {
|
|
666
|
-
throw new RequestFailuresError('Request body size is too large');
|
|
754
|
+
if (data && data.length > utils_1.getMaxRequestBodySize()) {
|
|
755
|
+
throw new errors_2.RequestFailuresError('Request body size is too large');
|
|
667
756
|
}
|
|
668
757
|
// This invocation will behave differently according to different types set on the request:
|
|
669
758
|
request.send(data);
|
|
@@ -733,6 +822,16 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
733
822
|
return request;
|
|
734
823
|
}
|
|
735
824
|
});
|
|
825
|
+
Object.defineProperty(SequenceExecutor.prototype, "prepareWSRequest", {
|
|
826
|
+
enumerable: false,
|
|
827
|
+
configurable: true,
|
|
828
|
+
writable: true,
|
|
829
|
+
value: function (requestConf, reqIndex) {
|
|
830
|
+
var _this = this;
|
|
831
|
+
var wsRequestArgs = this.resolveAndSetWSReqData(requestConf, reqIndex);
|
|
832
|
+
return new ws_1.WSRequest(wsRequestArgs, this.wsHandler, function (e) { return _this.setSingleFailure(reqIndex, 'Websocket error ' + e.message); });
|
|
833
|
+
}
|
|
834
|
+
});
|
|
736
835
|
Object.defineProperty(SequenceExecutor.prototype, "validateDomain", {
|
|
737
836
|
enumerable: false,
|
|
738
837
|
configurable: true,
|
|
@@ -741,15 +840,15 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
741
840
|
var _a, _b, _c;
|
|
742
841
|
if (isEmpty_1.default(domain)) {
|
|
743
842
|
var message = 'HTTP request domain name is empty';
|
|
744
|
-
throw new RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
|
|
843
|
+
throw new errors_2.RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
|
|
745
844
|
}
|
|
746
845
|
if (conf_1.validate.isUrl(domain)) {
|
|
747
846
|
var message = "HTTP request domain name [" + domain + "] is not valid";
|
|
748
|
-
throw new RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
|
|
847
|
+
throw new errors_2.RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
|
|
749
848
|
}
|
|
750
849
|
else if (!uriUtils.isVerified(domain, this.domainsWhiteList)) {
|
|
751
850
|
var message = "HTTP request domain name [" + domain + "] is not on white list";
|
|
752
|
-
throw new RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
|
|
851
|
+
throw new errors_2.RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
|
|
753
852
|
}
|
|
754
853
|
}
|
|
755
854
|
});
|
|
@@ -783,21 +882,32 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
783
882
|
configurable: true,
|
|
784
883
|
writable: true,
|
|
785
884
|
value: function (reqIndex, requestConf, res) {
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
885
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
886
|
+
var assertionResults, failuresHistogram;
|
|
887
|
+
return __generator(this, function (_a) {
|
|
888
|
+
switch (_a.label) {
|
|
889
|
+
case 0:
|
|
890
|
+
// modifies parameters:
|
|
891
|
+
return [4 /*yield*/, this.handleExtractions(requestConf, res)];
|
|
892
|
+
case 1:
|
|
893
|
+
// modifies parameters:
|
|
894
|
+
_a.sent();
|
|
895
|
+
if (!envUtils.isBrowser()) {
|
|
896
|
+
this.handlePostScript(requestConf, res);
|
|
897
|
+
}
|
|
898
|
+
this.setPostParameters(reqIndex);
|
|
899
|
+
assertionResults = this.handleAssertions(requestConf) || [];
|
|
900
|
+
log_1.default.trace('Assertion results: ', assertionResults);
|
|
901
|
+
failuresHistogram = {};
|
|
902
|
+
assertionResults.forEach(function (result, index) {
|
|
903
|
+
if (!result) {
|
|
904
|
+
failuresHistogram[index] = 1;
|
|
905
|
+
}
|
|
906
|
+
});
|
|
907
|
+
return [2 /*return*/, failuresHistogram];
|
|
908
|
+
}
|
|
909
|
+
});
|
|
799
910
|
});
|
|
800
|
-
return failuresHistogram;
|
|
801
911
|
}
|
|
802
912
|
});
|
|
803
913
|
Object.defineProperty(SequenceExecutor.prototype, "setPostParameters", {
|
|
@@ -813,10 +923,26 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
813
923
|
configurable: true,
|
|
814
924
|
writable: true,
|
|
815
925
|
value: function (requestConf, res) {
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
926
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
927
|
+
var _i, _a, extractions;
|
|
928
|
+
return __generator(this, function (_b) {
|
|
929
|
+
switch (_b.label) {
|
|
930
|
+
case 0:
|
|
931
|
+
_i = 0, _a = (requestConf.extract || []);
|
|
932
|
+
_b.label = 1;
|
|
933
|
+
case 1:
|
|
934
|
+
if (!(_i < _a.length)) return [3 /*break*/, 4];
|
|
935
|
+
extractions = _a[_i];
|
|
936
|
+
return [4 /*yield*/, this.extractInScope(res, extractions)];
|
|
937
|
+
case 2:
|
|
938
|
+
_b.sent();
|
|
939
|
+
_b.label = 3;
|
|
940
|
+
case 3:
|
|
941
|
+
_i++;
|
|
942
|
+
return [3 /*break*/, 1];
|
|
943
|
+
case 4: return [2 /*return*/];
|
|
944
|
+
}
|
|
945
|
+
});
|
|
820
946
|
});
|
|
821
947
|
}
|
|
822
948
|
});
|
|
@@ -825,11 +951,28 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
825
951
|
configurable: true,
|
|
826
952
|
writable: true,
|
|
827
953
|
value: function (res, extractions) {
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
954
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
955
|
+
var contextParameters, extractionCombiner, _i, _a, _b, name_1, extraction;
|
|
956
|
+
return __generator(this, function (_c) {
|
|
957
|
+
switch (_c.label) {
|
|
958
|
+
case 0:
|
|
959
|
+
contextParameters = Object.assign({}, this.parameters);
|
|
960
|
+
extractionCombiner = new extraction_combiner_1.ExtractionCombiner(contextParameters, res, res.wsExtractionData);
|
|
961
|
+
_i = 0, _a = Object.entries(extractions);
|
|
962
|
+
_c.label = 1;
|
|
963
|
+
case 1:
|
|
964
|
+
if (!(_i < _a.length)) return [3 /*break*/, 4];
|
|
965
|
+
_b = _a[_i], name_1 = _b[0], extraction = _b[1];
|
|
966
|
+
return [4 /*yield*/, this.extract(name_1, extraction, extractionCombiner)];
|
|
967
|
+
case 2:
|
|
968
|
+
_c.sent();
|
|
969
|
+
_c.label = 3;
|
|
970
|
+
case 3:
|
|
971
|
+
_i++;
|
|
972
|
+
return [3 /*break*/, 1];
|
|
973
|
+
case 4: return [2 /*return*/];
|
|
974
|
+
}
|
|
975
|
+
});
|
|
833
976
|
});
|
|
834
977
|
}
|
|
835
978
|
});
|
|
@@ -838,31 +981,46 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
838
981
|
configurable: true,
|
|
839
982
|
writable: true,
|
|
840
983
|
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
|
-
|
|
984
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
985
|
+
var combinedExtractor, result, error_3, genericMessage, prettyMessage, publicMessage;
|
|
986
|
+
return __generator(this, function (_a) {
|
|
987
|
+
switch (_a.label) {
|
|
988
|
+
case 0:
|
|
989
|
+
log_1.default.trace('Parameter extraction start: ', { parameterName: parameterName, extraction: extraction });
|
|
990
|
+
return [4 /*yield*/, extractionCombiner.combine(extraction)];
|
|
991
|
+
case 1:
|
|
992
|
+
combinedExtractor = _a.sent();
|
|
993
|
+
_a.label = 2;
|
|
994
|
+
case 2:
|
|
995
|
+
_a.trys.push([2, 4, , 5]);
|
|
996
|
+
return [4 /*yield*/, combinedExtractor()];
|
|
997
|
+
case 3:
|
|
998
|
+
result = _a.sent();
|
|
999
|
+
return [3 /*break*/, 5];
|
|
1000
|
+
case 4:
|
|
1001
|
+
error_3 = _a.sent();
|
|
1002
|
+
genericMessage = "Failed to extract value for parameter \"" + parameterName + "\"";
|
|
1003
|
+
log_1.default.debug(genericMessage, error_3);
|
|
1004
|
+
prettyMessage = error_3.prettyMessage;
|
|
1005
|
+
publicMessage = prettyMessage
|
|
1006
|
+
? genericMessage + " - " + prettyMessage
|
|
1007
|
+
: genericMessage;
|
|
1008
|
+
throw new errors_2.RequestFailuresError(publicMessage);
|
|
1009
|
+
case 5:
|
|
1010
|
+
if (result != null) {
|
|
1011
|
+
this.parameters[parameterName] = result;
|
|
1012
|
+
}
|
|
1013
|
+
else if (this.parameters[parameterName] == null) {
|
|
1014
|
+
// Existing parameter value acts as default. If no such value exists,
|
|
1015
|
+
// we set the value to be an empty string to differentiate it from undefined parameters.
|
|
1016
|
+
// Otherwise, this parameter's usages would stay untouched, e.g. "${paramName}".
|
|
1017
|
+
this.parameters[parameterName] = '';
|
|
1018
|
+
}
|
|
1019
|
+
log_1.default.trace('Parameter value:', this.parameters[parameterName]);
|
|
1020
|
+
return [2 /*return*/];
|
|
1021
|
+
}
|
|
1022
|
+
});
|
|
1023
|
+
});
|
|
866
1024
|
}
|
|
867
1025
|
});
|
|
868
1026
|
Object.defineProperty(SequenceExecutor.prototype, "resolve", {
|
|
@@ -888,7 +1046,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
888
1046
|
}
|
|
889
1047
|
catch (e) {
|
|
890
1048
|
var message = ['Post Script', e.name + ':', e.message].join(' ');
|
|
891
|
-
throw new RequestFailuresError(message);
|
|
1049
|
+
throw new errors_2.RequestFailuresError(message);
|
|
892
1050
|
}
|
|
893
1051
|
test_run_event_emitter_1.testRunEventsEmitter.postScript.finished();
|
|
894
1052
|
}
|
|
@@ -968,9 +1126,6 @@ function isSimpleRequest(headers) {
|
|
|
968
1126
|
key !== 'content-type';
|
|
969
1127
|
});
|
|
970
1128
|
}
|
|
971
|
-
var getMaxRequestBodySize = function () {
|
|
972
|
-
return envUtils.isBrowser() ? MAX_LOAD_REQUEST_BODY_LENGTH : MAX_API_REQUEST_BODY_LENGTH;
|
|
973
|
-
};
|
|
974
1129
|
var getLoopIterations = function (LoopConf) {
|
|
975
1130
|
var declared = (LoopConf && LoopConf.iterations) || 1;
|
|
976
1131
|
return Math.min(MAX_REQUEST_LOOPS_ITERATIONS, declared);
|
|
@@ -987,7 +1142,7 @@ var extendResponseHeaders = function (headers, redirectHeaders) {
|
|
|
987
1142
|
var isExpectedStatus = function (_a, status) {
|
|
988
1143
|
var expectedStatus = _a.expectedStatus, url = _a.url;
|
|
989
1144
|
if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS) {
|
|
990
|
-
return 200 <= status && status < 400;
|
|
1145
|
+
return (200 <= status && status < 400) || status === 101;
|
|
991
1146
|
}
|
|
992
1147
|
else if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ERROR) {
|
|
993
1148
|
log_1.default.debug('user asked to fail this request', url);
|
|
@@ -1023,22 +1178,4 @@ var setTCPReuse = function (request, agent, sslAgent) {
|
|
|
1023
1178
|
_oldRequest.apply.apply(_oldRequest, __spreadArray([this], args));
|
|
1024
1179
|
};
|
|
1025
1180
|
};
|
|
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
1181
|
//# sourceMappingURL=sequence.js.map
|