From 5891e8f6a95882f786e14b48381f05c5596c4aec Mon Sep 17 00:00:00 2001 From: Yagiz Nizipli Date: Wed, 9 Nov 2022 18:44:58 -0500 Subject: [PATCH 1/2] perf: improve header object parsing --- lib/fetch/headers.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/fetch/headers.js b/lib/fetch/headers.js index 680f9a06cd9..f17d774697c 100644 --- a/lib/fetch/headers.js +++ b/lib/fetch/headers.js @@ -47,13 +47,16 @@ function fill (headers, object) { // 2. Append (header’s first item, header’s second item) to headers. headers.append(header[0], header[1]) } - } else if (typeof object === 'object' && object !== null) { + } else if (object !== null && typeof object === 'object') { // Note: null should throw // 2. Otherwise, object is a record, then for each key → value in object, // append (key, value) to headers - for (const [key, value] of Object.entries(object)) { - headers.append(key, value) + const keys = Object.keys(object) + const keysLength = keys.length + + for (let i = 0; i < keysLength; i++) { + headers.append(keys[i], object[keys[i]]) } } else { throw webidl.errors.conversionFailed({ From 0637fd97174402ddaa36905d7470f8d2072ec1fb Mon Sep 17 00:00:00 2001 From: Yagiz Nizipli Date: Thu, 10 Nov 2022 08:24:45 -0500 Subject: [PATCH 2/2] perf: use one text encoder for fetch body --- lib/fetch/body.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/fetch/body.js b/lib/fetch/body.js index cf89c7d59f6..08ce5b8f4ef 100644 --- a/lib/fetch/body.js +++ b/lib/fetch/body.js @@ -25,6 +25,8 @@ function extractBody (object, keepalive = false) { ReadableStream = require('stream/web').ReadableStream } + const textEncoder = new TextEncoder() + // 1. Let stream be null. let stream = null @@ -41,7 +43,7 @@ function extractBody (object, keepalive = false) { stream = new ReadableStream({ async pull (controller) { controller.enqueue( - typeof source === 'string' ? new TextEncoder().encode(source) : source + typeof source === 'string' ? textEncoder.encode(source) : source ) queueMicrotask(() => readableStreamClose(controller)) }, @@ -108,17 +110,15 @@ function extractBody (object, keepalive = false) { // Set action to this step: run the multipart/form-data // encoding algorithm, with object’s entry list and UTF-8. action = async function * (object) { - const enc = new TextEncoder() - for (const [name, value] of object) { if (typeof value === 'string') { - yield enc.encode( + yield textEncoder.encode( prefix + `; name="${escape(normalizeLinefeeds(name))}"` + `\r\n\r\n${normalizeLinefeeds(value)}\r\n` ) } else { - yield enc.encode( + yield textEncoder.encode( prefix + `; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : '') + @@ -130,11 +130,11 @@ function extractBody (object, keepalive = false) { yield * value.stream() - yield enc.encode('\r\n') + yield textEncoder.encode('\r\n') } } - yield enc.encode(`--${boundary}--`) + yield textEncoder.encode(`--${boundary}--`) } // Set source to object.