Skip to content

Commit 6d39c29

Browse files
committed
std.Io.Writer.Allocating: fix sendFile EndOfStream
1 parent c7f332a commit 6d39c29

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

lib/std/Io/Writer.zig

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2491,18 +2491,17 @@ pub const Allocating = struct {
24912491

24922492
fn sendFile(w: *Writer, file_reader: *File.Reader, limit: std.io.Limit) FileError!usize {
24932493
if (File.Handle == void) return error.Unimplemented;
2494+
if (limit == .nothing) return 0;
24942495
const a: *Allocating = @fieldParentPtr("writer", w);
24952496
const gpa = a.allocator;
24962497
var list = a.toArrayList();
24972498
defer setArrayList(a, list);
24982499
const pos = file_reader.pos;
24992500
const additional = if (file_reader.getSize()) |size| size - pos else |_| std.atomic.cache_line;
2501+
if (additional == 0) return error.EndOfStream;
25002502
list.ensureUnusedCapacity(gpa, limit.minInt64(additional)) catch return error.WriteFailed;
25012503
const dest = limit.slice(list.unusedCapacitySlice());
2502-
const n = file_reader.read(dest) catch |err| switch (err) {
2503-
error.ReadFailed => return error.ReadFailed,
2504-
error.EndOfStream => 0,
2505-
};
2504+
const n = try file_reader.read(dest);
25062505
list.items.len += n;
25072506
return n;
25082507
}
@@ -2525,7 +2524,7 @@ pub const Allocating = struct {
25252524
}
25262525
};
25272526

2528-
test sendFile {
2527+
test "discarding sendFile" {
25292528
var tmp_dir = testing.tmpDir(.{});
25302529
defer tmp_dir.cleanup();
25312530

@@ -2544,3 +2543,23 @@ test sendFile {
25442543

25452544
_ = try file_reader.interface.streamRemaining(&discarding.writer);
25462545
}
2546+
2547+
test "allocating sendFile" {
2548+
var tmp_dir = testing.tmpDir(.{});
2549+
defer tmp_dir.cleanup();
2550+
2551+
const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true });
2552+
defer file.close();
2553+
var r_buffer: [256]u8 = undefined;
2554+
var file_writer: std.fs.File.Writer = .init(file, &r_buffer);
2555+
try file_writer.interface.writeByte('h');
2556+
try file_writer.interface.flush();
2557+
2558+
var file_reader = file_writer.moveToReader();
2559+
try file_reader.seekTo(0);
2560+
2561+
var allocating: std.io.Writer.Allocating = .init(std.testing.allocator);
2562+
defer allocating.deinit();
2563+
2564+
_ = try file_reader.interface.streamRemaining(&allocating.writer);
2565+
}

0 commit comments

Comments
 (0)