





















@@ -1,4 +1,4 @@
1-import type { Command } from "commander";
1+import { InvalidArgumentError, type Command } from "commander";
22import type { CaptureQueryPreset } from "../proxy-capture/types.js";
33import { createLazyImportLoader } from "../shared/lazy-promise.js";
44@@ -12,12 +12,32 @@ async function loadProxyCliRuntime(): Promise<ProxyCliRuntime> {
1212return await proxyCliRuntimeLoader.load();
1313}
141415-function parseOptionalNumber(value: string | undefined): number | undefined {
16-if (!value) {
17-return undefined;
15+function parseIntegerOption(value: string | undefined, flag: string): number {
16+const trimmed = value?.trim() ?? "";
17+if (!/^\d+$/u.test(trimmed)) {
18+throw new InvalidArgumentError(`${flag} must be an integer.`);
1819}
19-const parsed = Number(value);
20-return Number.isFinite(parsed) ? parsed : undefined;
20+const parsed = Number(trimmed);
21+if (!Number.isSafeInteger(parsed)) {
22+throw new InvalidArgumentError(`${flag} must be a safe integer.`);
23+}
24+return parsed;
25+}
26+27+function parsePortOption(value: string | undefined): number {
28+const parsed = parseIntegerOption(value, "--port");
29+if (parsed > 65_535) {
30+throw new InvalidArgumentError("--port must be between 0 and 65535.");
31+}
32+return parsed;
33+}
34+35+function parsePositiveIntegerOption(value: string | undefined, flag: string): number {
36+const parsed = parseIntegerOption(value, flag);
37+if (parsed <= 0) {
38+throw new InvalidArgumentError(`${flag} must be a positive integer.`);
39+}
40+return parsed;
2141}
22422343function collectOption(value: string, previous: string[] | undefined): string[] {
@@ -33,7 +53,7 @@ export function registerProxyCli(program: Command) {
3353.command("start")
3454.description("Start the local explicit debug proxy")
3555.option("--host <host>", "Bind host", "127.0.0.1")
36-.option("--port <port>", "Bind port", parseOptionalNumber)
56+.option("--port <port>", "Bind port", parsePortOption)
3757.action(async (opts: { host?: string; port?: number }) => {
3858const runtime = await loadProxyCliRuntime();
3959await runtime.runDebugProxyStartCommand(opts);
@@ -45,7 +65,7 @@ export function registerProxyCli(program: Command) {
4565.allowUnknownOption(true)
4666.allowExcessArguments(true)
4767.option("--host <host>", "Bind host", "127.0.0.1")
48-.option("--port <port>", "Bind port", parseOptionalNumber)
68+.option("--port <port>", "Bind port", parsePortOption)
4969.argument("[cmd...]", "Command to run after --")
5070.action(async (cmd: string[], opts: { host?: string; port?: number }) => {
5171const runtime = await loadProxyCliRuntime();
@@ -70,7 +90,9 @@ export function registerProxyCli(program: Command) {
7090.option("--denied-url <url>", "Destination expected to be blocked by the proxy", collectOption)
7191.option("--apns-reachable", "Also verify sandbox APNs HTTP/2 is reachable through the proxy")
7292.option("--apns-authority <url>", "APNs authority to probe with --apns-reachable")
73-.option("--timeout-ms <ms>", "Per-request timeout in milliseconds", parseOptionalNumber)
93+.option("--timeout-ms <ms>", "Per-request timeout in milliseconds", (value) =>
94+parsePositiveIntegerOption(value, "--timeout-ms"),
95+)
7496.action(
7597async (opts: {
7698json?: boolean;
@@ -107,7 +129,9 @@ export function registerProxyCli(program: Command) {
107129proxy
108130.command("sessions")
109131.description("List recent capture sessions")
110-.option("--limit <count>", "Maximum sessions to show", parseOptionalNumber)
132+.option("--limit <count>", "Maximum sessions to show", (value) =>
133+parsePositiveIntegerOption(value, "--limit"),
134+)
111135.action(async (opts: { limit?: number }) => {
112136const runtime = await loadProxyCliRuntime();
113137await runtime.runDebugProxySessionsCommand(opts);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。