1
0
mirror of https://github.com/redis/node-redis.git synced 2025-12-11 09:22:35 +03:00

fix: multi-byte character corruption when converting Buffers to strings (#3100)

* add tests for multi-byte character buffer
* support multi-byte characters when decoding buffers

fixes: #2993
This commit is contained in:
Bob Burden III
2025-10-13 06:19:45 -04:00
committed by GitHub
parent 96d6445d66
commit d7c6544d3a
2 changed files with 19 additions and 6 deletions

View File

@@ -226,6 +226,11 @@ describe('RESP Decoder', () => {
toWrite: Buffer.from('+OK\r\n'), toWrite: Buffer.from('+OK\r\n'),
replies: [Buffer.from('OK')] replies: [Buffer.from('OK')]
}); });
test("'é'", {
toWrite: Buffer.from('+é\r\n'),
replies: ['é']
});
}); });
describe('BlobString', () => { describe('BlobString', () => {
@@ -251,6 +256,11 @@ describe('RESP Decoder', () => {
toWrite: Buffer.from('$2\r\nOK\r\n'), toWrite: Buffer.from('$2\r\nOK\r\n'),
replies: [Buffer.from('OK')] replies: [Buffer.from('OK')]
}); });
test("'é'", {
toWrite: Buffer.from('$2\r\né\r\n'),
replies: ['é']
});
}); });
describe('VerbatimString', () => { describe('VerbatimString', () => {
@@ -279,6 +289,11 @@ describe('RESP Decoder', () => {
toWrite: Buffer.from('=6\r\ntxt:OK\r\n'), toWrite: Buffer.from('=6\r\ntxt:OK\r\n'),
replies: [Buffer.from('OK')] replies: [Buffer.from('OK')]
}); });
test("'é'", {
toWrite: Buffer.from('=6\r\ntxt:é\r\n'),
replies: ['é']
});
}); });
test('SimpleError', { test('SimpleError', {

View File

@@ -506,9 +506,8 @@ export class Decoder {
} }
chunks.push(chunk.subarray(start, crlfIndex)); chunks.push(chunk.subarray(start, crlfIndex));
return type === Buffer ? const buffer = Buffer.concat(chunks);
Buffer.concat(chunks) : return type === Buffer ? buffer : buffer.toString();
chunks.join('');
} }
#decodeBlobString(type, chunk) { #decodeBlobString(type, chunk) {
@@ -578,9 +577,8 @@ export class Decoder {
chunks.push(chunk.subarray(this.#cursor, end)); chunks.push(chunk.subarray(this.#cursor, end));
this.#cursor = end + skip; this.#cursor = end + skip;
return type === Buffer ? const buffer = Buffer.concat(chunks);
Buffer.concat(chunks) : return type === Buffer ? buffer : buffer.toString();
chunks.join('');
} }
#decodeBlobStringWithLength(length, type, chunk) { #decodeBlobStringWithLength(length, type, chunk) {