@loadmill/executer 0.1.35 → 0.1.39

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
  });
@@ -371,7 +435,10 @@ var SequenceExecutor = /** @class */ (function () {
371
435
  configurable: true,
372
436
  writable: true,
373
437
  value: function (request, reqIndex, requests) {
374
- var skipBefore = request.skipBefore;
438
+ var skipBefore = request.skipBefore, disabled = request.disabled;
439
+ if (disabled) {
440
+ return reqIndex + 1;
441
+ }
375
442
  if (skipBefore) {
376
443
  var goTo = skipBefore.goTo, negate = skipBefore.negate, condition = skipBefore.condition;
377
444
  var shouldSkip = this.isTruthyParameter('skip', condition);
@@ -404,7 +471,7 @@ var SequenceExecutor = /** @class */ (function () {
404
471
  : rawDelay)), MIN_REQUEST_DELAY, Infinity);
405
472
  problem = conf_1.validateIntegerDelay(delay, false);
406
473
  if (problem) {
407
- throw new RequestFailuresError("Invalid Request Delay: " + problem);
474
+ throw new errors_2.RequestFailuresError("Invalid Request Delay: " + problem);
408
475
  }
409
476
  return [4 /*yield*/, promiseUtils.delay(delay)];
410
477
  case 1:
@@ -435,9 +502,10 @@ var SequenceExecutor = /** @class */ (function () {
435
502
  case 0:
436
503
  loopIteration = 0;
437
504
  maxIterations = getLoopIterations(requestConf.loop);
505
+ this.wsHandler.clearMessages();
438
506
  _b.label = 1;
439
507
  case 1:
440
- if (!(loopIteration < maxIterations)) return [3 /*break*/, 8];
508
+ if (!(loopIteration < maxIterations)) return [3 /*break*/, 9];
441
509
  loopIteration++;
442
510
  request = this.prepareRequest(requestConf, index);
443
511
  return [4 /*yield*/, this.sendRequest(request, index)];
@@ -447,32 +515,35 @@ var SequenceExecutor = /** @class */ (function () {
447
515
  resTime = Number(this.parameters.__responseTime);
448
516
  _a = requestConf.timeout, timeout = _a === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _a;
449
517
  if (resTime > timeout) {
450
- 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");
451
519
  }
452
- 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();
453
524
  this.resolvedRequests[index].retried = loopIteration > 1 ? loopIteration - 1 : undefined;
454
- if (!(loopIteration < maxIterations)) return [3 /*break*/, 6];
455
- if (!this.shouldStopLooping(requestConf.loop)) return [3 /*break*/, 3];
456
- return [3 /*break*/, 8];
457
- case 3: return [4 /*yield*/, promiseUtils.delay(1000)];
458
- 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:
459
530
  _b.sent(); // todo yigal - make this configrable?
460
- _b.label = 5;
461
- case 5: return [3 /*break*/, 7];
462
- case 6:
531
+ _b.label = 6;
532
+ case 6: return [3 /*break*/, 8];
533
+ case 7:
463
534
  if (this.hasLoopingFailed(requestConf.loop)) {
464
- 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");
465
536
  }
466
- _b.label = 7;
467
- case 7: return [3 /*break*/, 1];
468
- case 8:
537
+ _b.label = 8;
538
+ case 8: return [3 /*break*/, 1];
539
+ case 9:
469
540
  if (!isEmpty_1.default(failedAssertionsHistogram)) {
470
541
  message = 'Request failed due to assertions.';
471
542
  log_1.default.debug(message, {
472
543
  failedAssertionsHistogram: failedAssertionsHistogram,
473
544
  parameters: this.parameters,
474
545
  });
475
- throw new RequestFailuresError(message, failedAssertionsHistogram);
546
+ throw new errors_2.RequestFailuresError(message, failedAssertionsHistogram);
476
547
  }
477
548
  this.onRequestSuccess(index, resTime);
478
549
  return [2 /*return*/];
@@ -597,7 +668,7 @@ var SequenceExecutor = /** @class */ (function () {
597
668
  case 7:
598
669
  reportedReason = errors_1.unknownStatusCorsError;
599
670
  _c.label = 8;
600
- 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));
601
672
  case 9:
602
673
  failure = this.failures[reqIndex];
603
674
  if (failure) {
@@ -611,6 +682,27 @@ var SequenceExecutor = /** @class */ (function () {
611
682
  }
612
683
  });
613
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", {
614
706
  enumerable: false,
615
707
  configurable: true,
616
708
  writable: true,
@@ -659,8 +751,8 @@ var SequenceExecutor = /** @class */ (function () {
659
751
  var data = this.resolve(postData.text, function (err) {
660
752
  return setParameterErrorHistogram(err, 'Failed to compute request body - ');
661
753
  });
662
- if (data && data.length > getMaxRequestBodySize()) {
663
- 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');
664
756
  }
665
757
  // This invocation will behave differently according to different types set on the request:
666
758
  request.send(data);
@@ -718,7 +810,7 @@ var SequenceExecutor = /** @class */ (function () {
718
810
  request.on('progress', progressHandler);
719
811
  // This makes superagent populate res.text regardless of the response's content type:
720
812
  request.buffer();
721
- // Otherwise we expose superagent and its version -
813
+ // Otherwise we expose superagent and its version -
722
814
  // better have something more general (in case the user didnt set one):
723
815
  var uaHeader = request.get('User-Agent');
724
816
  if (!uaHeader || uaHeader.startsWith('node-superagent')) {
@@ -730,6 +822,16 @@ var SequenceExecutor = /** @class */ (function () {
730
822
  return request;
731
823
  }
732
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
+ });
733
835
  Object.defineProperty(SequenceExecutor.prototype, "validateDomain", {
734
836
  enumerable: false,
735
837
  configurable: true,
@@ -738,15 +840,15 @@ var SequenceExecutor = /** @class */ (function () {
738
840
  var _a, _b, _c;
739
841
  if (isEmpty_1.default(domain)) {
740
842
  var message = 'HTTP request domain name is empty';
741
- throw new RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
843
+ throw new errors_2.RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
742
844
  }
743
845
  if (conf_1.validate.isUrl(domain)) {
744
846
  var message = "HTTP request domain name [" + domain + "] is not valid";
745
- throw new RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
847
+ throw new errors_2.RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
746
848
  }
747
849
  else if (!uriUtils.isVerified(domain, this.domainsWhiteList)) {
748
850
  var message = "HTTP request domain name [" + domain + "] is not on white list";
749
- throw new RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
851
+ throw new errors_2.RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
750
852
  }
751
853
  }
752
854
  });
@@ -780,21 +882,32 @@ var SequenceExecutor = /** @class */ (function () {
780
882
  configurable: true,
781
883
  writable: true,
782
884
  value: function (reqIndex, requestConf, res) {
783
- // modifies parameters:
784
- this.handleExtractions(requestConf, res);
785
- if (!envUtils.isBrowser()) {
786
- this.handlePostScript(requestConf, res);
787
- }
788
- this.setPostParameters(reqIndex);
789
- var assertionResults = this.handleAssertions(requestConf) || [];
790
- log_1.default.trace('Assertion results: ', assertionResults);
791
- var failuresHistogram = {};
792
- assertionResults.forEach(function (result, index) {
793
- if (!result) {
794
- failuresHistogram[index] = 1;
795
- }
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
+ });
796
910
  });
797
- return failuresHistogram;
798
911
  }
799
912
  });
800
913
  Object.defineProperty(SequenceExecutor.prototype, "setPostParameters", {
@@ -810,10 +923,26 @@ var SequenceExecutor = /** @class */ (function () {
810
923
  configurable: true,
811
924
  writable: true,
812
925
  value: function (requestConf, res) {
813
- var _this = this;
814
- var _a;
815
- (_a = requestConf.extract) === null || _a === void 0 ? void 0 : _a.forEach(function (extractions) {
816
- return _this.extractInScope(res, extractions);
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
+ });
817
946
  });
818
947
  }
819
948
  });
@@ -822,11 +951,28 @@ var SequenceExecutor = /** @class */ (function () {
822
951
  configurable: true,
823
952
  writable: true,
824
953
  value: function (res, extractions) {
825
- var _this = this;
826
- var contextParameters = Object.assign({}, this.parameters);
827
- var extractionCombiner = new extraction_combiner_1.ExtractionCombiner(contextParameters, res);
828
- forEach_1.default(extractions, function (extraction, name) {
829
- return _this.extract(name, extraction, extractionCombiner);
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
+ });
830
976
  });
831
977
  }
832
978
  });
@@ -835,31 +981,46 @@ var SequenceExecutor = /** @class */ (function () {
835
981
  configurable: true,
836
982
  writable: true,
837
983
  value: function (parameterName, extraction, extractionCombiner) {
838
- log_1.default.trace('Parameter extraction start: ', { parameterName: parameterName, extraction: extraction });
839
- var combinedExtractor = extractionCombiner.combine(extraction);
840
- var result;
841
- try {
842
- result = combinedExtractor();
843
- }
844
- catch (error) {
845
- var genericMessage = "Failed to extract value for parameter \"" + parameterName + "\"";
846
- log_1.default.debug(genericMessage, error);
847
- var prettyMessage = error.prettyMessage;
848
- var publicMessage = prettyMessage
849
- ? genericMessage + " - " + prettyMessage
850
- : genericMessage;
851
- throw new RequestFailuresError(publicMessage);
852
- }
853
- if (result != null) {
854
- this.parameters[parameterName] = result;
855
- }
856
- else if (this.parameters[parameterName] == null) {
857
- // Existing parameter value acts as default. If no such value exists,
858
- // we set the value to be an empty string to differentiate it from undefined parameters.
859
- // Otherwise, this parameter's usages would stay untouched, e.g. "${paramName}".
860
- this.parameters[parameterName] = '';
861
- }
862
- log_1.default.trace('Parameter value:', this.parameters[parameterName]);
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
+ });
863
1024
  }
864
1025
  });
865
1026
  Object.defineProperty(SequenceExecutor.prototype, "resolve", {
@@ -885,7 +1046,7 @@ var SequenceExecutor = /** @class */ (function () {
885
1046
  }
886
1047
  catch (e) {
887
1048
  var message = ['Post Script', e.name + ':', e.message].join(' ');
888
- throw new RequestFailuresError(message);
1049
+ throw new errors_2.RequestFailuresError(message);
889
1050
  }
890
1051
  test_run_event_emitter_1.testRunEventsEmitter.postScript.finished();
891
1052
  }
@@ -965,9 +1126,6 @@ function isSimpleRequest(headers) {
965
1126
  key !== 'content-type';
966
1127
  });
967
1128
  }
968
- var getMaxRequestBodySize = function () {
969
- return envUtils.isBrowser() ? MAX_LOAD_REQUEST_BODY_LENGTH : MAX_API_REQUEST_BODY_LENGTH;
970
- };
971
1129
  var getLoopIterations = function (LoopConf) {
972
1130
  var declared = (LoopConf && LoopConf.iterations) || 1;
973
1131
  return Math.min(MAX_REQUEST_LOOPS_ITERATIONS, declared);
@@ -984,7 +1142,7 @@ var extendResponseHeaders = function (headers, redirectHeaders) {
984
1142
  var isExpectedStatus = function (_a, status) {
985
1143
  var expectedStatus = _a.expectedStatus, url = _a.url;
986
1144
  if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS) {
987
- return 200 <= status && status < 400;
1145
+ return (200 <= status && status < 400) || status === 101;
988
1146
  }
989
1147
  else if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ERROR) {
990
1148
  log_1.default.debug('user asked to fail this request', url);
@@ -1020,22 +1178,4 @@ var setTCPReuse = function (request, agent, sslAgent) {
1020
1178
  _oldRequest.apply.apply(_oldRequest, __spreadArray([this], args));
1021
1179
  };
1022
1180
  };
1023
- var RequestFailuresError = /** @class */ (function (_super) {
1024
- __extends(RequestFailuresError, _super);
1025
- function RequestFailuresError(message, histogram) {
1026
- var _a;
1027
- if (histogram === void 0) { histogram = (_a = {}, _a[message] = 1, _a); }
1028
- var _this = _super.call(this, message) || this;
1029
- Object.defineProperty(_this, "histogram", {
1030
- enumerable: true,
1031
- configurable: true,
1032
- writable: true,
1033
- value: histogram
1034
- });
1035
- // 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
1036
- Object.setPrototypeOf(_this, RequestFailuresError.prototype);
1037
- return _this;
1038
- }
1039
- return RequestFailuresError;
1040
- }(Error));
1041
1181
  //# sourceMappingURL=sequence.js.map