private static RestRequest CreateRequest(HammerOptions hammerOptions) { var request = new RestRequest(GetMethod(hammerOptions.RequestMethod)); if (hammerOptions.Body != null) { if (hammerOptions.BodyType == BodyType.Json) { request.AddJsonBody(hammerOptions.Body); } else { request.AddXmlBody(hammerOptions.Body); } } if (hammerOptions.QueryStringParameters != null && hammerOptions.QueryStringParameters.Any()) { foreach (var queryStringParameter in hammerOptions.QueryStringParameters) { request.AddQueryParameter(queryStringParameter.Key, queryStringParameter.Value); } } if (hammerOptions.RequestHeaders != null && hammerOptions.RequestHeaders.Any()) { foreach (var requestHeader in hammerOptions.RequestHeaders) { request.AddHeader(requestHeader.Key, requestHeader.Value); } } return(request); }
private static RequestResult ExecuteConnection(HammerOptions hammerOptions) { var request = CreateRequest(hammerOptions); ExecutePreProcesses(hammerOptions, request); return(SendRequest(request, hammerOptions.Url)); }
public HammerStats HammerUrl(HammerOptions hammerOptions) { if (hammerOptions.Body != null && hammerOptions.BodyType == null) { throw new ArgumentException("You supplied a Body object, so you must supply a BodyType"); } return(ExecuteConnections(hammerOptions)); }
private static void ExecutePreProcesses(HammerOptions hammerOptions, RestRequest request) { if (hammerOptions.PreHammerProcesses == null) { return; } foreach (var hammerOptionsPreHammerProcess in hammerOptions.PreHammerProcesses) { hammerOptionsPreHammerProcess.Execute(hammerOptions, request); } }
private static HammerStats ExecuteConnections(HammerOptions hammerOptions) { ThreadPool.SetMinThreads(hammerOptions.MaximumConcurrentRequests, hammerOptions.MaximumConcurrentRequests); ServicePointManager.DefaultConnectionLimit = hammerOptions.MaximumConcurrentRequests; var concurrentRequestCount = 1; var hammerSwingResults = new List <HammerSwingResult>(); RequestResult RequestFunc(HammerOptions options) { return(ExecuteConnection(options)); } var executionDataflowBlockOptions = new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = hammerOptions.MaximumConcurrentRequests }; var transformBlock = new TransformBlock <HammerOptions, RequestResult>( RequestFunc, executionDataflowBlockOptions); var maximumRuntimeStopWatch = Stopwatch.StartNew(); while (concurrentRequestCount <= hammerOptions.MaximumConcurrentRequests && maximumRuntimeStopWatch.ElapsedMilliseconds <= hammerOptions.MaximumMillisecondsToHammer) { for (var i = 0; i < concurrentRequestCount; i++) { transformBlock.Post(hammerOptions); } var aggregatedResults = new List <RequestResult>(); for (var i = 0; i < concurrentRequestCount; i++) { var requestResults = transformBlock.Receive(); aggregatedResults.Add(requestResults); } hammerSwingResults.Add(new HammerSwingResult { AverageResponseTime = aggregatedResults.Average(a => a.ResponseMilliseconds), FailureCount = aggregatedResults.Count(c => !c.IsSuccessful), TotalRequestCount = concurrentRequestCount, RequestResults = aggregatedResults }); Thread.Sleep(500); concurrentRequestCount += 1; } var hammerStats = new HammerStats { HammerSwingStats = hammerSwingResults }; hammerOptions.Recorder?.RecordHammer(hammerOptions, hammerStats); return(hammerStats); }