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

fix: Make std/io copyN write the whole read buffer (#4978)

This commit is contained in:
Marcos Casagrande 2020-04-29 12:25:40 +02:00 committed by GitHub
parent 0703431ec2
commit ec41fb69cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 2 deletions

View file

@ -24,7 +24,10 @@ export async function copyN(
const nread = result ?? 0;
bytesRead += nread;
if (nread > 0) {
const n = await dest.write(buf.slice(0, nread));
let n = 0;
while (n < nread) {
n += await dest.write(buf.slice(n, nread));
}
assert(n === nread, "could not write");
}
if (result === null) {

View file

@ -10,7 +10,8 @@ import {
sliceLongToBytes,
} from "./ioutil.ts";
import { BufReader } from "./bufio.ts";
import { stringsReader } from "./util.ts";
import { stringsReader, tempFile } from "./util.ts";
import * as path from "../path/mod.ts";
class BinaryReader implements Reader {
index = 0;
@ -85,3 +86,15 @@ Deno.test("testCopyN2", async function (): Promise<void> {
assertEquals(n, 10);
assertEquals(w.toString(), "abcdefghij");
});
Deno.test("copyNWriteAllData", async function (): Promise<void> {
const { filepath, file } = await tempFile(path.resolve("io"));
const size = 16 * 1024 + 1;
const data = "a".repeat(32 * 1024);
const r = stringsReader(data);
const n = await copyN(r, file, size); // Over max file possible buffer
file.close();
await Deno.remove(filepath);
assertEquals(n, size);
});