sendFileAll: use stream instead of sendFileReading

This is a simpler implementation and allows file_reader to do more
optimal streaming.
This commit is contained in:
Kendall Condon 2025-09-01 16:43:47 -04:00
parent 58dda3b10b
commit d26b532647

View file

@ -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,