commit d26b53264744842fe15227142679d481fa68e491 (tree)
parent 58dda3b10b8aacf377447d36dc97efc3a3f2e21a
Author: Kendall Condon <goon.pri.low@gmail.com>
Date: Mon, 1 Sep 2025 16:43:47 -0400
sendFileAll: use stream instead of sendFileReading
This is a simpler implementation and allows file_reader to do more
optimal streaming.
Diffstat:
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/lib/std/Io/Writer.zig b/lib/std/Io/Writer.zig
@@ -935,17 +935,24 @@ pub fn sendFileReading(w: *Writer, file_reader: *File.Reader, limit: Limit) File
///
/// Asserts nonzero buffer capacity.
pub fn sendFileAll(w: *Writer, file_reader: *File.Reader, limit: Limit) FileAllError!usize {
- // The fallback sendFileReadingAll() path asserts non-zero buffer capacity.
- // Explicitly assert it here as well to ensure the assert is hit even if
- // the fallback path is not taken.
+ // The fallback case uses `stream`. For `File.Reader`, this requires a minumum buffer size of
+ // one since it uses `writableSliceGreedy(1)`. Asserting this here ensures that this will be
+ // hit even when the fallback is not needed.
assert(w.buffer.len > 0);
+
var remaining = @intFromEnum(limit);
while (remaining > 0) {
const n = sendFile(w, file_reader, .limited(remaining)) catch |err| switch (err) {
error.EndOfStream => break,
error.Unimplemented => {
file_reader.mode = file_reader.mode.toReading();
- remaining -= try w.sendFileReadingAll(file_reader, .limited(remaining));
+ while (remaining > 0) {
+ remaining -= file_reader.interface.stream(w, .limited(remaining)) catch |e| switch (e) {
+ error.EndOfStream => break,
+ error.ReadFailed => return error.ReadFailed,
+ error.WriteFailed => return error.WriteFailed,
+ };
+ }
break;
},
else => |e| return e,