@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/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,
@@ -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
- // 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
- }
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
- 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);
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
- 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);
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
- 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]);
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