Skip to content

Commit b0d41e7

Browse files
fix(oracle-fusion): classify rejected redirects
1 parent 7b669e7 commit b0d41e7

2 files changed

Lines changed: 19 additions & 0 deletions

File tree

apps/sim/lib/internal/oracle-fusion/client.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,17 @@ describe('requestOracleFusionJson', () => {
166166
expect(String(error)).not.toContain(BASIC)
167167
})
168168

169+
it('classifies redirects rejected by the pinned transport without exposing details', async () => {
170+
mockSecureFetch.mockRejectedValueOnce(new Error('Too many redirects (max: 0)'))
171+
const error = await requestOracleFusionJson(CREDENTIAL, {
172+
family: 'hcm',
173+
path: 'workers',
174+
}).catch((caught: unknown) => caught)
175+
expect(error).toMatchObject({ message: 'Oracle Fusion returned a redirect', status: 502 })
176+
expect(String(error)).not.toContain(ORIGIN)
177+
expect(String(error)).not.toContain(BASIC)
178+
})
179+
169180
it('preserves unsafe integral JSON tokens as decimal strings', async () => {
170181
mockSecureFetch.mockResolvedValueOnce(
171182
response(

apps/sim/lib/internal/oracle-fusion/client.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,11 @@ function statusMessage(status: number): string {
185185
return `Oracle Fusion request failed with HTTP ${status}`
186186
}
187187

188+
/** `maxRedirects: 0` rejects a response with Location before returning its status. */
189+
function isRejectedRedirect(error: unknown): boolean {
190+
return error instanceof Error && error.message === 'Too many redirects (max: 0)'
191+
}
192+
188193
/** Executes one bounded, DNS-pinned GET against a fixed Oracle product API family. */
189194
export async function requestOracleFusionJson(
190195
credential: OracleFusionResolvedCredential,
@@ -220,6 +225,9 @@ export async function requestOracleFusionJson(
220225
response = await fetchAttempt(url, validation.resolvedIP, credential.accessToken, signal)
221226
} catch (error) {
222227
signal?.throwIfAborted()
228+
if (isRejectedRedirect(error)) {
229+
throw new OracleFusionProviderError('Oracle Fusion returned a redirect', 502)
230+
}
223231
if (isPayloadSizeLimitError(error)) {
224232
throw new OracleFusionProviderError('Oracle Fusion response exceeded 5 MiB', 502)
225233
}

0 commit comments

Comments
 (0)