spring-statemachine/penetrator.ps1
2025-04-15 16:05:59 +02:00

132 lines
4.2 KiB
PowerShell

# PowerShell script to send 100 GET requests to http://localhost/traffic/next using parallel execution
# This script uses runspaces for maximum performance
# Target URL
$url = "http://localhost/traffic/next"
# Number of requests to send
$requestCount = 1000
# Maximum number of concurrent threads
$maxThreads = 32 # Adjust based on your system's capabilities
Write-Host "Sending $requestCount GET requests to $url using parallel execution..."
# Create runspace pool
$runspacePool = [runspacefactory]::CreateRunspacePool(1, $maxThreads)
$runspacePool.Open()
# Create a script block for making the request
$scriptBlock = {
param($url, $id)
# Use Stopwatch for more precise timing
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
try {
$response = Invoke-WebRequest -Uri $url -Method Get -UseBasicParsing -ErrorAction Stop
$stopwatch.Stop()
$timeMs = $stopwatch.Elapsed.TotalMilliseconds
# Return result object
[PSCustomObject]@{
RequestId = $id
StatusCode = $response.StatusCode
ResponseTimeMs = $timeMs
Success = $true
Error = $null
}
}
catch {
$stopwatch.Stop()
$timeMs = $stopwatch.Elapsed.TotalMilliseconds
# Return error object
[PSCustomObject]@{
RequestId = $id
StatusCode = 0
ResponseTimeMs = $timeMs
Success = $false
Error = $_.Exception.Message
}
}
}
# Measure total execution time
$totalStopwatch = [System.Diagnostics.Stopwatch]::StartNew()
# Create array for runspace jobs
$runspaces = @()
# Start all requests in parallel
for ($i = 1; $i -le $requestCount; $i++) {
$runspace = [powershell]::Create().AddScript($scriptBlock).AddArgument($url).AddArgument($i)
$runspace.RunspacePool = $runspacePool
$runspaces += [PSCustomObject]@{
Runspace = $runspace
Status = $runspace.BeginInvoke()
Id = $i
}
}
# Collect results
$results = @()
do {
# Check for completed runspaces
foreach ($runspace in ($runspaces | Where-Object { $_.Status.IsCompleted -eq $true })) {
$result = $runspace.Runspace.EndInvoke($runspace.Status)
$results += $result
# Remove from pending runspaces
$runspaces = $runspaces | Where-Object { $_.Id -ne $runspace.Id }
# Display result (optional)
if ($result.Success) {
Write-Host "Request $($result.RequestId) complete: $($result.ResponseTimeMs.ToString("0.00")) ms" -ForegroundColor Green
}
else {
Write-Host "Request $($result.RequestId) failed: $($result.Error)" -ForegroundColor Red
}
}
# Small sleep to prevent CPU thrashing
Start-Sleep -Milliseconds 10
} while ($runspaces.Count -gt 0)
# Stop timing
$totalStopwatch.Stop()
$totalTimeSeconds = $totalStopwatch.Elapsed.TotalSeconds
# Calculate statistics
$successResults = $results | Where-Object { $_.Success -eq $true }
$failureCount = ($results | Where-Object { $_.Success -eq $false }).Count
$successCount = $successResults.Count
if ($successCount -gt 0) {
$avgResponseTime = ($successResults | Measure-Object -Property ResponseTimeMs -Average).Average
$minResponseTime = ($successResults | Measure-Object -Property ResponseTimeMs -Minimum).Minimum
$maxResponseTime = ($successResults | Measure-Object -Property ResponseTimeMs -Maximum).Maximum
$requestsPerSecond = $requestCount / $totalTimeSeconds
}
# Display summary
Write-Host "`n--- Performance Summary ---"
Write-Host "Total Requests: $requestCount"
Write-Host "Successful: $successCount" -ForegroundColor Green
if ($failureCount -gt 0) {
Write-Host "Failed: $failureCount" -ForegroundColor Red
}
Write-Host "Total Time: $($totalTimeSeconds.ToString("0.00")) seconds"
Write-Host "Requests/second: $($requestsPerSecond.ToString("0.00"))"
if ($successCount -gt 0) {
Write-Host "`n--- Response Time (ms) ---"
Write-Host "Average: $($avgResponseTime.ToString("0.00")) ms"
Write-Host "Minimum: $($minResponseTime.ToString("0.00")) ms"
Write-Host "Maximum: $($maxResponseTime.ToString("0.00")) ms"
}
# Clean up resources
$runspacePool.Close()
$runspacePool.Dispose()