From f1a205ddfc3e13ae07b7d8f7a47bb55cc5b320c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Fri, 3 Jul 2026 22:46:32 -0300 Subject: [PATCH] http: create header field names as internalized strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guilherme Araújo --- src/node_http_parser.cc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index d99b61780fad6c..358f6cbe85bd9e 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -65,6 +65,7 @@ using v8::Isolate; using v8::Local; using v8::LocalVector; using v8::MaybeLocal; +using v8::NewStringType; using v8::Number; using v8::Object; using v8::ObjectTemplate; @@ -233,6 +234,17 @@ struct StringPtr { return String::Empty(env->isolate()); } + Local ToInternalizedString(Environment* env) const { + if (size_ != 0) { + return String::NewFromOneByte(env->isolate(), + reinterpret_cast(str_), + NewStringType::kInternalized, + size_) + .ToLocalChecked(); + } + return String::Empty(env->isolate()); + } + // Strip trailing OWS (SPC or HTAB) from string. Local ToTrimmedString(Environment* env) { while (size_ > 0 && IsOWS(str_[size_ - 1])) { @@ -940,7 +952,8 @@ class Parser : public AsyncWrap, public StreamListener { Local headers_v[kMaxHeaderFieldsCount * 2]; for (size_t i = 0; i < num_values_; ++i) { - headers_v[i * 2] = fields_[i].ToString(env()); + // Field names repeat across requests, so internalize them. + headers_v[i * 2] = fields_[i].ToInternalizedString(env()); headers_v[i * 2 + 1] = values_[i].ToTrimmedString(env()); }