diff --git a/lib/api/readable.js b/lib/api/readable.js index 5ebd04ebe83..0c4ec9e5247 100644 --- a/lib/api/readable.js +++ b/lib/api/readable.js @@ -1,6 +1,7 @@ 'use strict' const assert = require('node:assert') +const { StringDecoder } = require('node:string_decoder') const { addAbortListener } = require('node:events') const { Readable } = require('node:stream') const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require('../core/errors') @@ -326,6 +327,9 @@ class BodyReadable extends Readable { setEncoding (encoding) { if (Buffer.isEncoding(encoding)) { this._readableState.encoding = encoding + if (this[kConsume]) { + this[kConsume].decoder = new StringDecoder(encoding) + } } return this } @@ -546,8 +550,14 @@ function consumeEnd (consume, encoding) { * @returns {void} */ function consumePush (consume, chunk) { - consume.length += chunk.length - consume.body.push(chunk) + if (consume.decoder) { + const string = consume.decoder.write(chunk) + consume.length += Buffer.byteLength(string) + consume.body.push(string) + } else { + consume.length += chunk.length + consume.body.push(chunk) + } } /**