From 3d21fa56600ec50fecf0bb82484d4c083609bbdf Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Mon, 2 Feb 2026 15:03:35 +0000 Subject: [PATCH] fix: use latin1 encoding for headers in WrapHandler WrapHandler was converting header strings to Buffers using Buffer.from() without specifying an encoding, which defaults to UTF-8. HTTP headers must use Latin1 (ISO-8859-1) encoding instead. Fixes: https://github.com/nodejs/undici/issues/4797 --- lib/handler/wrap-handler.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/handler/wrap-handler.js b/lib/handler/wrap-handler.js index 47caa5fa68b..6378d706abb 100644 --- a/lib/handler/wrap-handler.js +++ b/lib/handler/wrap-handler.js @@ -53,7 +53,7 @@ module.exports = class WrapHandler { onRequestUpgrade (controller, statusCode, headers, socket) { const rawHeaders = [] for (const [key, val] of Object.entries(headers)) { - rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val)) + rawHeaders.push(Buffer.from(key, 'latin1'), Array.isArray(val) ? val.map(v => Buffer.from(v, 'latin1')) : Buffer.from(val, 'latin1')) } this.#handler.onUpgrade?.(statusCode, rawHeaders, socket) @@ -62,7 +62,7 @@ module.exports = class WrapHandler { onResponseStart (controller, statusCode, headers, statusMessage) { const rawHeaders = [] for (const [key, val] of Object.entries(headers)) { - rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val)) + rawHeaders.push(Buffer.from(key, 'latin1'), Array.isArray(val) ? val.map(v => Buffer.from(v, 'latin1')) : Buffer.from(val, 'latin1')) } if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) { @@ -79,7 +79,7 @@ module.exports = class WrapHandler { onResponseEnd (controller, trailers) { const rawTrailers = [] for (const [key, val] of Object.entries(trailers)) { - rawTrailers.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val)) + rawTrailers.push(Buffer.from(key, 'latin1'), Array.isArray(val) ? val.map(v => Buffer.from(v, 'latin1')) : Buffer.from(val, 'latin1')) } this.#handler.onComplete?.(rawTrailers)