@loadmill/executer 0.1.37 → 0.1.41

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/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 MAX_API_REQUEST_BODY_LENGTH = conf_1.confExtrema.MAX_API_REQUEST_BODY_LENGTH, MAX_LOAD_REQUEST_BODY_LENGTH = conf_1.confExtrema.MAX_LOAD_REQUEST_BODY_LENGTH, 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;
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: return [2 /*return*/];
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*/, 8];
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
- failedAssertionsHistogram = this.processSuccessfulResponse(index, requestConf, res);
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*/, 6];
458
- if (!this.shouldStopLooping(requestConf.loop)) return [3 /*break*/, 3];
459
- return [3 /*break*/, 8];
460
- case 3: return [4 /*yield*/, promiseUtils.delay(1000)];
461
- case 4:
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 = 5;
464
- case 5: return [3 /*break*/, 7];
465
- case 6:
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 = 7;
470
- case 7: return [3 /*break*/, 1];
471
- case 8:
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 (postData) {
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);
@@ -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
- // modifies parameters:
787
- this.handleExtractions(requestConf, res);
788
- if (!envUtils.isBrowser()) {
789
- this.handlePostScript(requestConf, res);
790
- }
791
- this.setPostParameters(reqIndex);
792
- var assertionResults = this.handleAssertions(requestConf) || [];
793
- log_1.default.trace('Assertion results: ', assertionResults);
794
- var failuresHistogram = {};
795
- assertionResults.forEach(function (result, index) {
796
- if (!result) {
797
- failuresHistogram[index] = 1;
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", {
@@ -805,7 +951,7 @@ var SequenceExecutor = /** @class */ (function () {
805
951
  configurable: true,
806
952
  writable: true,
807
953
  value: function (reqIndex) {
808
- this.resolvedRequests[reqIndex].postParameters = manipulationUtils.objToSingletonArray(this.parameters);
954
+ this.resolvedRequests[reqIndex].postParameters = manipulationUtils.objToSingletonArray(this.parameters).filter(function (p) { return !isEmpty_1.default(p); }); // cleaning param values that are function or undefined which resolves to empty object {}
809
955
  }
810
956
  });
811
957
  Object.defineProperty(SequenceExecutor.prototype, "handleExtractions", {
@@ -813,10 +959,26 @@ var SequenceExecutor = /** @class */ (function () {
813
959
  configurable: true,
814
960
  writable: true,
815
961
  value: function (requestConf, res) {
816
- var _this = this;
817
- var _a;
818
- (_a = requestConf.extract) === null || _a === void 0 ? void 0 : _a.forEach(function (extractions) {
819
- return _this.extractInScope(res, extractions);
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
- var _this = this;
829
- var contextParameters = Object.assign({}, this.parameters);
830
- var extractionCombiner = new extraction_combiner_1.ExtractionCombiner(contextParameters, res);
831
- forEach_1.default(extractions, function (extraction, name) {
832
- return _this.extract(name, extraction, extractionCombiner);
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
- log_1.default.trace('Parameter extraction start: ', { parameterName: parameterName, extraction: extraction });
842
- var combinedExtractor = extractionCombiner.combine(extraction);
843
- var result;
844
- try {
845
- result = combinedExtractor();
846
- }
847
- catch (error) {
848
- var genericMessage = "Failed to extract value for parameter \"" + parameterName + "\"";
849
- log_1.default.debug(genericMessage, error);
850
- var prettyMessage = error.prettyMessage;
851
- var publicMessage = prettyMessage
852
- ? genericMessage + " - " + prettyMessage
853
- : genericMessage;
854
- throw new RequestFailuresError(publicMessage);
855
- }
856
- if (result != null) {
857
- this.parameters[parameterName] = result;
858
- }
859
- else if (this.parameters[parameterName] == null) {
860
- // Existing parameter value acts as default. If no such value exists,
861
- // we set the value to be an empty string to differentiate it from undefined parameters.
862
- // Otherwise, this parameter's usages would stay untouched, e.g. "${paramName}".
863
- this.parameters[parameterName] = '';
864
- }
865
- log_1.default.trace('Parameter value:', this.parameters[parameterName]);
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