Skip to content

Commit

Permalink
fix: Make io copyN write the whole read buffer (denoland/deno#4978)
Browse files Browse the repository at this point in the history
  • Loading branch information
marcosc90 authored and caspervonb committed Jan 31, 2021
1 parent 56c9b2e commit 0caf9c4
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
5 changes: 4 additions & 1 deletion io/ioutil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
15 changes: 14 additions & 1 deletion io/ioutil_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
});

0 comments on commit 0caf9c4

Please sign in to comment.