diff --git a/src/hooks/webfetch-redirect-guard/hook.ts b/src/hooks/webfetch-redirect-guard/hook.ts index aec40aa18..1599bc1eb 100644 --- a/src/hooks/webfetch-redirect-guard/hook.ts +++ b/src/hooks/webfetch-redirect-guard/hook.ts @@ -56,6 +56,10 @@ function isRedirectLoopError(output: string): boolean { return WEBFETCH_REDIRECT_ERROR_PATTERNS.some((pattern) => pattern.test(output)) } +function isToolErrorOutput(output: string): boolean { + return output.trimStart().toLowerCase().startsWith("error:") +} + function buildRedirectLimitMessage(url?: string): string { const suffix = url ? ` for ${url}` : "" return `Error: WebFetch failed: exceeded maximum redirects (${MAX_WEBFETCH_REDIRECTS})${suffix}` @@ -111,7 +115,7 @@ export function createWebFetchRedirectGuardHook(_ctx: PluginInput) { return } - if (isRedirectLoopError(output.output)) { + if (isToolErrorOutput(output.output) && isRedirectLoopError(output.output)) { output.output = buildRedirectLimitMessage() } }, diff --git a/src/hooks/webfetch-redirect-guard/index.test.ts b/src/hooks/webfetch-redirect-guard/index.test.ts index 3d53b1f9e..9254f395f 100644 --- a/src/hooks/webfetch-redirect-guard/index.test.ts +++ b/src/hooks/webfetch-redirect-guard/index.test.ts @@ -49,7 +49,7 @@ function createFetchMock( implementation: (input: RequestInfo | URL, init?: RequestInit) => Promise, ): typeof fetch { return Object.assign(implementation, { - preconnect: originalFetch.preconnect, + preconnect: Reflect.get(originalFetch, "preconnect"), }) } @@ -152,6 +152,20 @@ describe("createWebFetchRedirectGuardHook", () => { ) }) }) + + describe("#when successful fetched content mentions redirect loops", () => { + it("#then should keep the content unchanged", async () => { + const hook = createWebFetchRedirectGuardHook({} as never) + const input = createInput() + const output = createAfterOutput("This page explains why browsers hit too many redirects in some setups.") + + await hook["tool.execute.after"](input, output) + + expect(output.output).toBe( + "This page explains why browsers hit too many redirects in some setups.", + ) + }) + }) }) describe("#given a non-webfetch tool", () => {