1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-21 15:04:11 -05:00

fix(ext/node): don't encode buffer data as utf8 in http2 (#24016)

This commit is contained in:
Satya Rohith 2024-05-29 11:34:34 +05:30 committed by GitHub
parent a8923534ed
commit 4f9b23b366
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 45 additions and 8 deletions

View file

@ -933,25 +933,23 @@ export class ClientHttp2Stream extends Duplex {
// TODO(bartlomieju): clean up // TODO(bartlomieju): clean up
_write(chunk, encoding, callback?: () => void) { _write(chunk, encoding, callback?: () => void) {
debugHttp2(">>> _write", callback); debugHttp2(">>> _write", encoding, callback);
if (typeof encoding === "function") { if (typeof encoding === "function") {
callback = encoding; callback = encoding;
encoding = "utf8"; encoding = this.#encoding;
} }
let data; let data;
if (typeof encoding === "string") { if (encoding === "utf8") {
data = ENCODER.encode(chunk); data = ENCODER.encode(chunk);
} else { } else if (encoding === "buffer") {
this.#encoding = encoding;
data = chunk.buffer; data = chunk.buffer;
} }
this.#requestPromise this.#requestPromise
.then(() => { .then(() => {
debugHttp2(">>> _write", this.#rid, data, encoding, callback); debugHttp2(">>> _write", this.#rid, data, encoding, callback);
return op_http2_client_send_data( return op_http2_client_send_data(this.#rid, new Uint8Array(data));
this.#rid,
data,
);
}) })
.then(() => { .then(() => {
callback?.(); callback?.();

View file

@ -1,6 +1,9 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import * as http2 from "node:http2"; import * as http2 from "node:http2";
import { Buffer } from "node:buffer";
import { readFile } from "node:fs/promises";
import { join } from "node:path";
import * as net from "node:net"; import * as net from "node:net";
import { assert, assertEquals } from "@std/assert/mod.ts"; import { assert, assertEquals } from "@std/assert/mod.ts";
import { curlRequest } from "../unit/test_util.ts"; import { curlRequest } from "../unit/test_util.ts";
@ -164,3 +167,39 @@ Deno.test("[node/http2.createServer()]", {
// Issue: https://github.com/denoland/deno/issues/22764 // Issue: https://github.com/denoland/deno/issues/22764
await new Promise<void>((resolve) => server.on("close", resolve)); await new Promise<void>((resolve) => server.on("close", resolve));
}); });
Deno.test("[node/http2 client] write image buffer on request stream works", async () => {
const url = "https://localhost:5545";
const client = http2.connect(url);
client.on("error", (err) => console.error(err));
const imagePath = join(import.meta.dirname!, "testdata", "green.jpg");
const buffer = await readFile(imagePath);
const req = client.request({ ":method": "POST", ":path": "/echo_server" });
req.write(buffer, (err) => {
if (err) throw err;
});
let receivedData: Buffer;
req.on("data", (chunk) => {
if (!receivedData) {
receivedData = chunk;
} else {
receivedData = Buffer.concat([receivedData, chunk]);
}
});
req.end();
const endPromise = Promise.withResolvers<void>();
setTimeout(() => {
try {
client.close();
} catch (_) {
// pass
}
endPromise.resolve();
}, 2000);
await endPromise.promise;
assertEquals(receivedData!, buffer);
});

BIN
tests/unit_node/testdata/green.jpg vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B