pub fn sendFileHeader(
w: *Writer,
header: []const u8,
file_reader: *File.Reader,
limit: Limit,
) FileError!usize ReadFailedDetailed diagnostics are found on the File.Reader struct.
WriteFailedSee the Writer implementation for detailed diagnostics.
EndOfStreamReached the end of the file being read.
UnimplementedIndicates the caller should do its own file reading; the callee cannot offer a more efficient implementation.
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054pub fn sendFileHeader(
w: *Writer,
header: []const u8,
file_reader: *File.Reader,
limit: Limit,
) FileError!usize {
const new_end = w.end + header.len;
if (new_end <= w.buffer.len) {
@memcpy(w.buffer[w.end..][0..header.len], header);
w.end = new_end;
const file_bytes = w.vtable.sendFile(w, file_reader, limit) catch |err| switch (err) {
error.ReadFailed, error.WriteFailed => |e| return e,
error.EndOfStream, error.Unimplemented => |e| {
// These errors are non-fatal, so if we wrote any header bytes, we will report that
// and suppress this error. Only if there was no header may we return the error.
if (header.len != 0) return header.len;
return e;
},
};
return header.len + file_bytes;
}
const buffered_contents = limit.slice(file_reader.interface.buffered());
const n = try w.vtable.drain(w, &.{ header, buffered_contents }, 1);
file_reader.interface.toss(n -| header.len);
return n;
}
Returns how many bytes from
headerandfile_readerwere consumed.limitonly applies tofile_reader.