zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit c7f332a260c9d9bbed0a05a0760bb9d4c4e56c52 (tree)
parent f521aa0520ac1b881ddbc533b03b4745f7f49820
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Tue, 15 Jul 2025 11:32:40 -0700

std.Io.Writer.Discarding: fix sendFile EndOfStream

Diffstat:
Mlib/std/Io/Writer.zig | 22++++++++++++++++++++++
1 file changed, 22 insertions(+), 0 deletions(-)

diff --git a/lib/std/Io/Writer.zig b/lib/std/Io/Writer.zig @@ -2194,8 +2194,10 @@ pub const Discarding = struct { const d: *Discarding = @alignCast(@fieldParentPtr("writer", w)); d.count += w.end; w.end = 0; + if (limit == .nothing) return 0; if (file_reader.getSize()) |size| { const n = limit.minInt64(size - file_reader.pos); + if (n == 0) return error.EndOfStream; file_reader.seekBy(@intCast(n)) catch return error.Unimplemented; w.end = 0; d.count += n; @@ -2522,3 +2524,23 @@ pub const Allocating = struct { try testing.expectEqualSlices(u8, "x: 42\ny: 1234\n", a.getWritten()); } }; + +test sendFile { + var tmp_dir = testing.tmpDir(.{}); + defer tmp_dir.cleanup(); + + const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true }); + defer file.close(); + var r_buffer: [256]u8 = undefined; + var file_writer: std.fs.File.Writer = .init(file, &r_buffer); + try file_writer.interface.writeByte('h'); + try file_writer.interface.flush(); + + var file_reader = file_writer.moveToReader(); + try file_reader.seekTo(0); + + var w_buffer: [256]u8 = undefined; + var discarding: std.io.Writer.Discarding = .init(&w_buffer); + + _ = try file_reader.interface.streamRemaining(&discarding.writer); +}