1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-28 16:20:57 -05:00

fix(node/zlib): accept dataview and buffer in zlib bindings (#21756)

Fixes #20516 
Follow up to #21747 and #21746

This tackles the last point of #20516 where certain inputs weren't
accepted in the other zlib methods

This adds the `toU8` conversion of `_brotli` to `_zlib.mjs`, when we
create the ZLibBuffer, we'll sanitize the input. I noticed that the
async had no handler for `string` input so I added that as well.
This commit is contained in:
Jovi De Croock 2024-01-03 14:33:51 +01:00 committed by Bartek Iwańczuk
parent 2d561a8cf3
commit 53c876ffd3
No known key found for this signature in database
GPG key ID: 0C6BCDDC3B3AD750
2 changed files with 48 additions and 3 deletions

View file

@ -9,6 +9,8 @@ import {
createBrotliCompress,
createBrotliDecompress,
createDeflate,
gzipSync,
unzipSync,
} from "node:zlib";
import { Buffer } from "node:buffer";
import { createReadStream, createWriteStream } from "node:fs";
@ -32,6 +34,13 @@ Deno.test("brotli compression async", async () => {
assertEquals(decompressed.toString(), "hello world");
});
Deno.test("gzip compression sync", { sanitizeResources: false }, () => {
const buf = Buffer.from("hello world");
const compressed = gzipSync(buf);
const decompressed = unzipSync(compressed);
assertEquals(decompressed.toString(), "hello world");
});
Deno.test("brotli compression", async () => {
const { promise, resolve } = Promise.withResolvers<void>();
const compress = createBrotliCompress();
@ -125,3 +134,24 @@ Deno.test("should work with a buffer from an encoded string", () => {
const decompressed = brotliDecompressSync(compressed);
assertEquals(decompressed.toString(), "hello world");
});
Deno.test(
"zlib compression with dataview",
{ sanitizeResources: false },
() => {
const buf = Buffer.from("hello world");
const compressed = gzipSync(new DataView(buf.buffer));
const decompressed = unzipSync(compressed);
assertEquals(decompressed.toString(), "hello world");
},
);
Deno.test("zlib compression with an encoded string", {
sanitizeResources: false,
}, () => {
const encoder = new TextEncoder();
const buffer = encoder.encode("hello world");
const compressed = gzipSync(buffer);
const decompressed = unzipSync(compressed);
assertEquals(decompressed.toString(), "hello world");
});

View file

@ -155,10 +155,27 @@ export const inflateRawSync = function (buffer, opts) {
return zlibBufferSync(new InflateRaw(opts), buffer);
};
function sanitizeInput(input) {
if (typeof input === "string") input = Buffer.from(input);
if (
!Buffer.isBuffer(input) &&
(input.buffer && !input.buffer.constructor === ArrayBuffer)
) throw new TypeError("Not a string, buffer or dataview");
if (input.buffer) {
input = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
}
return input;
}
function zlibBuffer(engine, buffer, callback) {
var buffers = [];
var nread = 0;
buffer = sanitizeInput(buffer);
engine.on("error", onError);
engine.on("end", onEnd);
@ -197,9 +214,7 @@ function zlibBuffer(engine, buffer, callback) {
}
function zlibBufferSync(engine, buffer) {
if (typeof buffer === "string") buffer = Buffer.from(buffer);
if (!Buffer.isBuffer(buffer)) throw new TypeError("Not a string or buffer");
buffer = sanitizeInput(buffer);
var flushFlag = engine._finishFlushFlag;