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:
parent
a8923534ed
commit
4f9b23b366
3 changed files with 45 additions and 8 deletions
|
@ -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?.();
|
||||||
|
|
|
@ -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
BIN
tests/unit_node/testdata/green.jpg
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 361 B |
Loading…
Reference in a new issue