From 4875387ea44b46879574c81e73e55e24953ae254 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Sat, 22 Nov 2025 17:20:50 -0800 Subject: [PATCH] fix sending a header to the server more than once --- src/bun.js/bindings/NodeHTTP.cpp | 17 +++++++++++++++-- ...e-to-send-array-of-[key-value]-as-headers.ts | 1 - .../parallel/test-http-server-multiheaders.js | 1 - 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/bun.js/bindings/NodeHTTP.cpp b/src/bun.js/bindings/NodeHTTP.cpp index 9f685fa555..f6b02368da 100644 --- a/src/bun.js/bindings/NodeHTTP.cpp +++ b/src/bun.js/bindings/NodeHTTP.cpp @@ -155,10 +155,12 @@ static void assignHeadersFromUWebSocketsForCall(uWS::HttpRequest* request, JSVal HTTPHeaderIdentifiers& identifiers = WebCore::clientData(vm)->httpHeaderIdentifiers(); Identifier nameIdentifier; JSString* nameString = nullptr; + bool headerIsWellKnown = false; if (WebCore::findHTTPHeaderName(nameView, name)) { nameString = identifiers.stringFor(globalObject, name); nameIdentifier = identifiers.identifierFor(vm, name); + headerIsWellKnown = true; } else { WTF::String wtfString = nameView.toString(); nameString = jsString(vm, wtfString); @@ -177,13 +179,24 @@ static void assignHeadersFromUWebSocketsForCall(uWS::HttpRequest* request, JSVal arrayValues.append(jsValue); setCookiesHeaderArray->push(globalObject, jsValue); RETURN_IF_EXCEPTION(scope, void()); - } else { + if (headersObject->hasOwnProperty(globalObject, nameIdentifier)) { + if (headerIsWellKnown && name == HTTPHeaderName::Host) { + continue; + } + auto prev = headersObject->get(globalObject, nameIdentifier); + RETURN_IF_EXCEPTION(scope, ); + auto thenew = jsString(vm, makeString(prev.getString(globalObject), ", "_s, jsValue)); + headersObject->putDirectMayBeIndex(globalObject, nameIdentifier, thenew); + RETURN_IF_EXCEPTION(scope, ); + arrayValues.append(nameString); + arrayValues.append(jsValue); + continue; + } headersObject->putDirectMayBeIndex(globalObject, nameIdentifier, jsValue); RETURN_IF_EXCEPTION(scope, void()); arrayValues.append(nameString); arrayValues.append(jsValue); - RETURN_IF_EXCEPTION(scope, void()); } } diff --git a/test/js/bun/test/parallel/test-http-client-should-be-able-to-send-array-of-[key-value]-as-headers.ts b/test/js/bun/test/parallel/test-http-client-should-be-able-to-send-array-of-[key-value]-as-headers.ts index 9003dbd906..f637001012 100644 --- a/test/js/bun/test/parallel/test-http-client-should-be-able-to-send-array-of-[key-value]-as-headers.ts +++ b/test/js/bun/test/parallel/test-http-client-should-be-able-to-send-array-of-[key-value]-as-headers.ts @@ -3,7 +3,6 @@ import { once } from "node:events"; import http from "node:http"; import type { AddressInfo } from "node:net"; const { expect } = createTest(import.meta.path); -if ("Bun" in globalThis) process.exit(0); // TODO: BUN const { promise, resolve } = Promise.withResolvers(); await using server = http.createServer((req, res) => { diff --git a/test/js/node/test/parallel/test-http-server-multiheaders.js b/test/js/node/test/parallel/test-http-server-multiheaders.js index bfd56d1231..8f633fdb99 100644 --- a/test/js/node/test/parallel/test-http-server-multiheaders.js +++ b/test/js/node/test/parallel/test-http-server-multiheaders.js @@ -25,7 +25,6 @@ // that support it, and dropping duplicates for other fields. require('../common'); -if ('Bun' in globalThis) return; // TODO: BUN const assert = require('assert'); const http = require('http');