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. 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({