From 7e299624f8a22f7ca69b71988930fa7b0a8529aa Mon Sep 17 00:00:00 2001 From: "jinli.yl" Date: Thu, 20 Aug 2026 23:13:46 +0800 Subject: [PATCH] fix: normalize endpoints without regex backtracking --- packages/typescript/src/dsh/config.ts | 8 +++++++- packages/typescript/src/openclaw/config.ts | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/typescript/src/dsh/config.ts b/packages/typescript/src/dsh/config.ts index a4224391..e71fe9ff 100644 --- a/packages/typescript/src/dsh/config.ts +++ b/packages/typescript/src/dsh/config.ts @@ -91,7 +91,7 @@ export function resolveConfig( input.dreamCron || env.REME_DSH_DREAM_CRON || DEFAULT_CONFIG.dreamCron, }; - config.endpoint = String(config.endpoint).replace(/\/+$/, ""); + config.endpoint = stripTrailingSlashes(String(config.endpoint)); assertEndpoint(config.endpoint); config.requestTimeoutMs = integer( config.requestTimeoutMs, @@ -173,6 +173,12 @@ function assertEndpoint(value: string): void { } } +function stripTrailingSlashes(value: string): string { + let end = value.length; + while (end > 0 && value.charCodeAt(end - 1) === 47) end -= 1; + return value.slice(0, end); +} + function integer( value: unknown, minimum: number, diff --git a/packages/typescript/src/openclaw/config.ts b/packages/typescript/src/openclaw/config.ts index 4578c428..a51226f8 100644 --- a/packages/typescript/src/openclaw/config.ts +++ b/packages/typescript/src/openclaw/config.ts @@ -53,7 +53,7 @@ export function resolveOpenClawConfig( stringValue(input.endpoint) || env.REME_URL || `http://${env.REME_HOST || "127.0.0.1"}:${env.REME_PORT || "2333"}`; - const normalizedEndpoint = endpoint.replace(/\/+$/, ""); + const normalizedEndpoint = stripTrailingSlashes(endpoint); const url = new URL(normalizedEndpoint); if (url.protocol !== "http:" && url.protocol !== "https:") { throw new TypeError("ReMe endpoint must be an absolute http(s) URL"); @@ -107,6 +107,12 @@ function integer( ); } +function stripTrailingSlashes(value: string): string { + let end = value.length; + while (end > 0 && value.charCodeAt(end - 1) === 47) end -= 1; + return value.slice(0, end); +} + function finite(value: unknown, fallback: number): number { const number = Number(value); return Number.isFinite(number) ? number : fallback;