mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-07 23:01:24 +00:00
59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import type { GuardedFetchResult } from "../../infra/net/fetch-guard.js";
|
|
import { fetchWithSsrFGuard } from "../../infra/net/fetch-guard.js";
|
|
import type { LookupFn, SsrFPolicy } from "../../infra/net/ssrf.js";
|
|
export { fetchWithTimeout } from "../../utils/fetch-timeout.js";
|
|
|
|
const MAX_ERROR_CHARS = 300;
|
|
|
|
export function normalizeBaseUrl(baseUrl: string | undefined, fallback: string): string {
|
|
const raw = baseUrl?.trim() || fallback;
|
|
return raw.replace(/\/+$/, "");
|
|
}
|
|
|
|
export async function fetchWithTimeoutGuarded(
|
|
url: string,
|
|
init: RequestInit,
|
|
timeoutMs: number,
|
|
fetchFn: typeof fetch,
|
|
options?: {
|
|
ssrfPolicy?: SsrFPolicy;
|
|
lookupFn?: LookupFn;
|
|
pinDns?: boolean;
|
|
},
|
|
): Promise<GuardedFetchResult> {
|
|
return await fetchWithSsrFGuard({
|
|
url,
|
|
fetchImpl: fetchFn,
|
|
init,
|
|
timeoutMs,
|
|
policy: options?.ssrfPolicy,
|
|
lookupFn: options?.lookupFn,
|
|
pinDns: options?.pinDns,
|
|
});
|
|
}
|
|
|
|
export async function readErrorResponse(res: Response): Promise<string | undefined> {
|
|
try {
|
|
const text = await res.text();
|
|
const collapsed = text.replace(/\s+/g, " ").trim();
|
|
if (!collapsed) {
|
|
return undefined;
|
|
}
|
|
if (collapsed.length <= MAX_ERROR_CHARS) {
|
|
return collapsed;
|
|
}
|
|
return `${collapsed.slice(0, MAX_ERROR_CHARS)}…`;
|
|
} catch {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
export async function assertOkOrThrowHttpError(res: Response, label: string): Promise<void> {
|
|
if (res.ok) {
|
|
return;
|
|
}
|
|
const detail = await readErrorResponse(res);
|
|
const suffix = detail ? `: ${detail}` : "";
|
|
throw new Error(`${label} (HTTP ${res.status})${suffix}`);
|
|
}
|