From b52e503ce47919b880d1dc4c60cc44542e95def3 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Wed, 8 Nov 2023 01:42:25 +0100 Subject: [PATCH] Fixes #6973 (#6975) Fixes #6973 Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> --- src/bun.js/bindings/NodeHTTP.cpp | 7 +++---- src/js/node/http.ts | 5 +---- test/js/node/http/node-http.test.ts | 3 +++ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/bun.js/bindings/NodeHTTP.cpp b/src/bun.js/bindings/NodeHTTP.cpp index 159a081e8a..caccd85f34 100644 --- a/src/bun.js/bindings/NodeHTTP.cpp +++ b/src/bun.js/bindings/NodeHTTP.cpp @@ -264,8 +264,7 @@ JSC_DEFINE_HOST_FUNCTION(jsHTTPAssignHeaders, (JSGlobalObject * globalObject, Ca auto scope = DECLARE_THROW_SCOPE(vm); JSValue requestValue = callFrame->argument(0); - JSObject* prototype = callFrame->argument(1).getObject(); - JSObject* objectValue = callFrame->argument(2).getObject(); + JSObject* objectValue = callFrame->argument(1).getObject(); JSC::InternalFieldTuple* tuple = JSC::InternalFieldTuple::create(vm, globalObject->m_internalFieldTupleStructure.get()); @@ -273,7 +272,7 @@ JSC_DEFINE_HOST_FUNCTION(jsHTTPAssignHeaders, (JSGlobalObject * globalObject, Ca JSValue urlValue = JSValue(); if (auto* jsRequest = jsDynamicCast(requestValue)) { if (uWS::HttpRequest* request = Request__getUWSRequest(jsRequest->wrapped())) { - return assignHeadersFromUWebSockets(request, prototype, objectValue, tuple, globalObject, vm); + return assignHeadersFromUWebSockets(request, globalObject->objectPrototype(), objectValue, tuple, globalObject, vm); } if (jsRequest->m_headers) { @@ -317,7 +316,7 @@ JSC_DEFINE_HOST_FUNCTION(jsHTTPAssignHeaders, (JSGlobalObject * globalObject, Ca RETURN_IF_EXCEPTION(scope, {}); } - return assignHeadersFromFetchHeaders(impl, prototype, objectValue, tuple, globalObject, vm); + return assignHeadersFromFetchHeaders(impl, globalObject->objectPrototype(), objectValue, tuple, globalObject, vm); } } } diff --git a/src/js/node/http.ts b/src/js/node/http.ts index cd588b22f0..6542c01c4e 100644 --- a/src/js/node/http.ts +++ b/src/js/node/http.ts @@ -610,13 +610,10 @@ function assignHeadersSlow(object, req) { object.headers = outHeaders; object.rawHeaders = rawHeaders; } -// This is the prototype for the req.headers object. -// It must not be exposed -const kEmptyObjectInternal = Object.create(null); function assignHeaders(object, req) { // This fast path is an 8% speedup for a "hello world" node:http server, and a 7% speedup for a "hello world" express server - const tuple = assignHeadersFast(req, kEmptyObjectInternal, object); + const tuple = assignHeadersFast(req, object); if (tuple !== null) { object.headers = $getInternalField(tuple, 0); object.rawHeaders = $getInternalField(tuple, 1); diff --git a/test/js/node/http/node-http.test.ts b/test/js/node/http/node-http.test.ts index 56e6c59c9a..cb2d252908 100644 --- a/test/js/node/http/node-http.test.ts +++ b/test/js/node/http/node-http.test.ts @@ -157,6 +157,9 @@ describe("node:http", () => { function runTest(done: Function, callback: (server: Server, port: number, done: (err?: Error) => void) => void) { var timer; var server = createServer((req, res) => { + if (req.headers.__proto__ !== {}.__proto__) { + throw new Error("Headers should inherit from Object.prototype"); + } const reqUrl = new URL(req.url!, `http://${req.headers.host}`); if (reqUrl.pathname) { if (reqUrl.pathname === "/redirect") {