-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathProgram.cs
More file actions
87 lines (71 loc) · 3.1 KB
/
Program.cs
File metadata and controls
87 lines (71 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System.CommandLine;
using Http11Probe.Cli.Reporting;
using Http11Probe.Runner;
using Http11Probe.TestCases;
using Http11Probe.TestCases.Suites;
var hostOption = new Option<string>("--host") { Description = "Target hostname or IP address" };
hostOption.DefaultValueFactory = _ => "localhost";
var portOption = new Option<int>("--port") { Description = "Target port number" };
portOption.DefaultValueFactory = _ => 8080;
var categoryOption = new Option<TestCategory?>("--category") { Description = "Run only tests in this category (skip all others)" };
var testOption = new Option<string[]>("--test") { Description = "Run only specific test IDs, case-insensitive (repeatable)", Arity = ArgumentArity.OneOrMore };
var timeoutOption = new Option<int>("--timeout") { Description = "Connect and read timeout in seconds per test" };
timeoutOption.DefaultValueFactory = _ => 5;
var outputOption = new Option<string?>("--output") { Description = "Write JSON results to this file path" };
var verboseOption = new Option<bool>("--verbose", "-v") { Description = "Print the raw server response for each test" };
verboseOption.DefaultValueFactory = _ => false;
var rootCommand = new RootCommand("Http11Probe — HTTP/1.1 server compliance & hardening tester")
{
hostOption,
portOption,
categoryOption,
testOption,
timeoutOption,
outputOption,
verboseOption
};
rootCommand.SetAction(async (parseResult, cancellationToken) =>
{
var host = parseResult.GetValue(hostOption)!;
var port = parseResult.GetValue(portOption);
var category = parseResult.GetValue(categoryOption);
var timeout = parseResult.GetValue(timeoutOption);
var testIds = parseResult.GetValue(testOption);
var outputPath = parseResult.GetValue(outputOption);
var verbose = parseResult.GetValue(verboseOption);
Console.WriteLine($" Http11Probe targeting {host}:{port}");
Console.WriteLine();
var options = new TestRunOptions
{
Host = host,
Port = port,
ConnectTimeout = TimeSpan.FromSeconds(timeout),
ReadTimeout = TimeSpan.FromSeconds(timeout),
CategoryFilter = category,
TestIdFilter = testIds is { Length: > 0 }
? new HashSet<string>(testIds, StringComparer.OrdinalIgnoreCase)
: null
};
var testCases = ComplianceSuite.GetTestCases()
.Concat(SmugglingSuite.GetTestCases())
.Concat(MalformedInputSuite.GetTestCases())
.Concat(NormalizationSuite.GetTestCases())
.ToList();
var runner = new TestRunner(options);
ConsoleReporter.PrintHeader();
var report = await runner.RunAsync(testCases, result =>
{
ConsoleReporter.PrintRow(result);
if (verbose)
ConsoleReporter.PrintRawResponse(result);
});
ConsoleReporter.PrintSummary(report);
if (outputPath is not null)
{
var json = JsonReporter.Generate(report);
await File.WriteAllTextAsync(outputPath, json, cancellationToken);
Console.WriteLine($" JSON report written to {outputPath}");
}
});
var config = new CommandLineConfiguration(rootCommand);
return await config.InvokeAsync(args);