Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 23 additions & 14 deletions src/handlers/responseHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,10 @@ export async function responseHandler(
originalResponseJson?: Record<string, any>;
}> {
let responseTransformerFunction: Function | undefined;
let providerOption: Options | undefined;
const responseContentType = response.headers?.get('content-type');
const isSuccessStatusCode = [200, 246].includes(response.status);

if (typeof provider == 'object') {
providerOption = { ...provider };
provider = provider.provider || '';
}

Expand All @@ -65,7 +64,7 @@ export async function responseHandler(
}

// Checking status 200 so that errors are not considered as stream mode.
if (responseTransformer && streamingMode && response.status === 200) {
if (responseTransformer && streamingMode && isSuccessStatusCode) {
responseTransformerFunction =
providerTransformers?.[`stream-${responseTransformer}`];
} else if (responseTransformer) {
Expand All @@ -85,7 +84,7 @@ export async function responseHandler(

if (
streamingMode &&
response.status === 200 &&
isSuccessStatusCode &&
isCacheHit &&
responseTransformerFunction
) {
Expand All @@ -96,7 +95,7 @@ export async function responseHandler(
);
return { response: streamingResponse, responseJson: null };
}
if (streamingMode && response.status === 200) {
if (streamingMode && isSuccessStatusCode) {
return {
response: handleStreamingMode(
response,
Expand Down Expand Up @@ -228,13 +227,29 @@ export async function afterRequestHookHandler(
}
);

const span = hooksManager.getSpan(hookSpanId) as HookSpan;
const hooksResult = span.getHooksResult();

const failedBeforeRequestHooks =
hooksResult.beforeRequestHooksResult.filter((h) => !h.verdict);
const failedAfterRequestHooks = hooksResult.afterRequestHooksResult.filter(
(h) => !h.verdict
);

if (!responseJSON) {
// For streaming responses, check if beforeRequestHooks failed without deny enabled.
if (failedBeforeRequestHooks.length || failedAfterRequestHooks.length) {
// This should not be a major performance bottleneck as it is just copying the headers and using the body as is.
return new Response(response.body, {
...response,
status: 246,
statusText: 'Hooks failed',
headers: response.headers,
});
}
return response;
}

const span = hooksManager.getSpan(hookSpanId) as HookSpan;
const hooksResult = span.getHooksResult();

if (shouldDeny) {
return createHookResponse(response, {}, hooksResult, {
status: 446,
Expand All @@ -243,12 +258,6 @@ export async function afterRequestHookHandler(
});
}

const failedBeforeRequestHooks =
hooksResult.beforeRequestHooksResult.filter((h) => !h.verdict);
const failedAfterRequestHooks = hooksResult.afterRequestHooksResult.filter(
(h) => !h.verdict
);

const responseData = span.getContext().response.isTransformed
? span.getContext().response.json
: responseJSON;
Expand Down
2 changes: 2 additions & 0 deletions src/handlers/streamHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -359,5 +359,7 @@ export async function handleJSONToStreamResponse(
...Object.fromEntries(response.headers),
'content-type': CONTENT_TYPES.EVENT_STREAM,
}),
status: response.status,
statusText: response.statusText,
});
}