| ... | ... | @@ -921,8 +921,7 @@ pub fn sendFileHeader( |
| 921 | 921 | /// Asserts nonzero buffer capacity. |
| 922 | 922 | pub fn sendFileReading(w: *Writer, file_reader: *File.Reader, limit: Limit) FileReadingError!usize { |
| 923 | 923 | const dest = limit.slice(try w.writableSliceGreedy(1)); |
| 924 | | const n = try file_reader.interface.readSliceShort(dest); |
| 925 | | if (n == 0) return error.EndOfStream; |
| 924 | const n = try file_reader.read(dest); |
| 926 | 925 | w.advance(n); |
| 927 | 926 | return n; |
| 928 | 927 | } |
| ... | ... | @@ -935,24 +934,17 @@ pub fn sendFileReading(w: *Writer, file_reader: *File.Reader, limit: Limit) File |
| 935 | 934 | /// |
| 936 | 935 | /// Asserts nonzero buffer capacity. |
| 937 | 936 | pub fn sendFileAll(w: *Writer, file_reader: *File.Reader, limit: Limit) FileAllError!usize { |
| 938 | | // The fallback case uses `stream`. For `File.Reader`, this requires a minumum buffer size of |
| 939 | | // one since it uses `writableSliceGreedy(1)`. Asserting this here ensures that this will be |
| 940 | | // hit even when the fallback is not needed. |
| 937 | // The fallback sendFileReadingAll() path asserts non-zero buffer capacity. |
| 938 | // Explicitly assert it here as well to ensure the assert is hit even if |
| 939 | // the fallback path is not taken. |
| 941 | 940 | assert(w.buffer.len > 0); |
| 942 | | |
| 943 | 941 | var remaining = @intFromEnum(limit); |
| 944 | 942 | while (remaining > 0) { |
| 945 | 943 | const n = sendFile(w, file_reader, .limited(remaining)) catch |err| switch (err) { |
| 946 | 944 | error.EndOfStream => break, |
| 947 | 945 | error.Unimplemented => { |
| 948 | 946 | file_reader.mode = file_reader.mode.toReading(); |
| 949 | | while (remaining > 0) { |
| 950 | | remaining -= file_reader.interface.stream(w, .limited(remaining)) catch |e| switch (e) { |
| 951 | | error.EndOfStream => break, |
| 952 | | error.ReadFailed => return error.ReadFailed, |
| 953 | | error.WriteFailed => return error.WriteFailed, |
| 954 | | }; |
| 955 | | } |
| 947 | remaining -= try w.sendFileReadingAll(file_reader, .limited(remaining)); |
| 956 | 948 | break; |
| 957 | 949 | }, |
| 958 | 950 | else => |e| return e, |
| ... | ... | @@ -2284,12 +2276,6 @@ pub const Discarding = struct { |
| 2284 | 2276 | const d: *Discarding = @alignCast(@fieldParentPtr("writer", w)); |
| 2285 | 2277 | d.count += w.end; |
| 2286 | 2278 | w.end = 0; |
| 2287 | | const buffered_n = limit.minInt64(file_reader.interface.bufferedLen()); |
| 2288 | | if (buffered_n != 0) { |
| 2289 | | file_reader.interface.toss(buffered_n); |
| 2290 | | d.count += buffered_n; |
| 2291 | | return buffered_n; |
| 2292 | | } |
| 2293 | 2279 | if (limit == .nothing) return 0; |
| 2294 | 2280 | if (file_reader.getSize()) |size| { |
| 2295 | 2281 | const n = limit.minInt64(size - file_reader.pos); |
| ... | ... | @@ -2781,9 +2767,7 @@ pub const Allocating = struct { |
| 2781 | 2767 | if (additional == 0) return error.EndOfStream; |
| 2782 | 2768 | a.ensureUnusedCapacity(limit.minInt64(additional)) catch return error.WriteFailed; |
| 2783 | 2769 | const dest = limit.slice(a.writer.buffer[a.writer.end..]); |
| 2784 | | const n = try file_reader.interface.readSliceShort(dest); |
| 2785 | | // If it was a short read, then EOF has been reached and `file_reader.size` |
| 2786 | | // has been set and the EOF case will be hit on subsequent calls. |
| 2770 | const n = try file_reader.read(dest); |
| 2787 | 2771 | a.writer.end += n; |
| 2788 | 2772 | return n; |
| 2789 | 2773 | } |
| ... | ... | @@ -2834,18 +2818,18 @@ test "discarding sendFile" { |
| 2834 | 2818 | |
| 2835 | 2819 | const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true }); |
| 2836 | 2820 | defer file.close(); |
| 2837 | | var r_buffer: [2]u8 = undefined; |
| 2821 | var r_buffer: [256]u8 = undefined; |
| 2838 | 2822 | var file_writer: std.fs.File.Writer = .init(file, &r_buffer); |
| 2839 | | try file_writer.interface.writeAll("abcd"); |
| 2823 | try file_writer.interface.writeByte('h'); |
| 2840 | 2824 | try file_writer.interface.flush(); |
| 2841 | 2825 | |
| 2842 | 2826 | var file_reader = file_writer.moveToReader(); |
| 2843 | 2827 | try file_reader.seekTo(0); |
| 2844 | | try file_reader.interface.fill(2); |
| 2845 | 2828 | |
| 2846 | 2829 | var w_buffer: [256]u8 = undefined; |
| 2847 | 2830 | var discarding: Writer.Discarding = .init(&w_buffer); |
| 2848 | | try testing.expectEqual(4, discarding.writer.sendFileAll(&file_reader, .unlimited)); |
| 2831 | |
| 2832 | _ = try file_reader.interface.streamRemaining(&discarding.writer); |
| 2849 | 2833 | } |
| 2850 | 2834 | |
| 2851 | 2835 | test "allocating sendFile" { |
| ... | ... | @@ -2854,40 +2838,18 @@ test "allocating sendFile" { |
| 2854 | 2838 | |
| 2855 | 2839 | const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true }); |
| 2856 | 2840 | defer file.close(); |
| 2857 | | var r_buffer: [2]u8 = undefined; |
| 2841 | var r_buffer: [256]u8 = undefined; |
| 2858 | 2842 | var file_writer: std.fs.File.Writer = .init(file, &r_buffer); |
| 2859 | | try file_writer.interface.writeAll("abcd"); |
| 2843 | try file_writer.interface.writeByte('h'); |
| 2860 | 2844 | try file_writer.interface.flush(); |
| 2861 | 2845 | |
| 2862 | 2846 | var file_reader = file_writer.moveToReader(); |
| 2863 | 2847 | try file_reader.seekTo(0); |
| 2864 | | try file_reader.interface.fill(2); |
| 2865 | 2848 | |
| 2866 | 2849 | var allocating: Writer.Allocating = .init(testing.allocator); |
| 2867 | 2850 | defer allocating.deinit(); |
| 2868 | | try allocating.ensureUnusedCapacity(1); |
| 2869 | | try testing.expectEqual(4, allocating.writer.sendFileAll(&file_reader, .unlimited)); |
| 2870 | | try testing.expectEqualStrings("abcd", allocating.writer.buffered()); |
| 2871 | | } |
| 2872 | 2851 | |
| 2873 | | test sendFileReading { |
| 2874 | | var tmp_dir = testing.tmpDir(.{}); |
| 2875 | | defer tmp_dir.cleanup(); |
| 2876 | | |
| 2877 | | const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true }); |
| 2878 | | defer file.close(); |
| 2879 | | var r_buffer: [2]u8 = undefined; |
| 2880 | | var file_writer: std.fs.File.Writer = .init(file, &r_buffer); |
| 2881 | | try file_writer.interface.writeAll("abcd"); |
| 2882 | | try file_writer.interface.flush(); |
| 2883 | | |
| 2884 | | var file_reader = file_writer.moveToReader(); |
| 2885 | | try file_reader.seekTo(0); |
| 2886 | | try file_reader.interface.fill(2); |
| 2887 | | |
| 2888 | | var w_buffer: [1]u8 = undefined; |
| 2889 | | var discarding: Writer.Discarding = .init(&w_buffer); |
| 2890 | | try testing.expectEqual(4, discarding.writer.sendFileReadingAll(&file_reader, .unlimited)); |
| 2852 | _ = try file_reader.interface.streamRemaining(&allocating.writer); |
| 2891 | 2853 | } |
| 2892 | 2854 | |
| 2893 | 2855 | test writeStruct { |