From e4593873a9c791238685dfbb45e64b4485884174 Mon Sep 17 00:00:00 2001 From: Aravind <63452117+codesculpture@users.noreply.github.com> Date: Wed, 8 Nov 2023 04:22:44 +0530 Subject: fix(ext/http): Throwing Error if the return value of Deno.serve handler is not a Response class (#21099) --------- Co-authored-by: Matt Mastracci --- ext/http/00_serve.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'ext') diff --git a/ext/http/00_serve.js b/ext/http/00_serve.js index b99f28c0f..5b931ccd1 100644 --- a/ext/http/00_serve.js +++ b/ext/http/00_serve.js @@ -10,6 +10,7 @@ import { Event } from "ext:deno_web/02_event.js"; import { fromInnerResponse, newInnerResponse, + ResponsePrototype, toInnerResponse, } from "ext:deno_fetch/23_response.js"; import { fromInnerRequest, toInnerRequest } from "ext:deno_fetch/23_request.js"; @@ -449,15 +450,26 @@ function mapToCallback(context, callback, onError) { fromInnerRequest(innerRequest, signal, "immutable"), new ServeHandlerInfo(innerRequest), ); + + // Throwing Error if the handler return value is not a Response class + if (!ObjectPrototypeIsPrototypeOf(ResponsePrototype, response)) { + throw TypeError( + "Return value from serve handler must be a response or a promise resolving to a response", + ); + } } catch (error) { try { response = await onError(error); + if (!ObjectPrototypeIsPrototypeOf(ResponsePrototype, response)) { + throw TypeError( + "Return value from onError handler must be a response or a promise resolving to a response", + ); + } } catch (error) { console.error("Exception in onError while handling exception", error); response = internalServerError(); } } - const inner = toInnerResponse(response); if (innerRequest?.[_upgraded]) { // We're done here as the connection has been upgraded during the callback and no longer requires servicing. -- cgit v1.2.3