| ... | ... | @@ -921,7 +921,8 @@ 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.read(dest); |
| 924 | const n = try file_reader.interface.readSliceShort(dest); |
| 925 | if (n == 0) return error.EndOfStream; |
| 925 | 926 | w.advance(n); |
| 926 | 927 | return n; |
| 927 | 928 | } |
| ... | ... | @@ -2276,6 +2277,12 @@ pub const Discarding = struct { |
| 2276 | 2277 | const d: *Discarding = @alignCast(@fieldParentPtr("writer", w)); |
| 2277 | 2278 | d.count += w.end; |
| 2278 | 2279 | w.end = 0; |
| 2280 | const buffered_n = limit.minInt64(file_reader.interface.bufferedLen()); |
| 2281 | if (buffered_n != 0) { |
| 2282 | file_reader.interface.toss(buffered_n); |
| 2283 | d.count += buffered_n; |
| 2284 | return buffered_n; |
| 2285 | } |
| 2279 | 2286 | if (limit == .nothing) return 0; |
| 2280 | 2287 | if (file_reader.getSize()) |size| { |
| 2281 | 2288 | const n = limit.minInt64(size - file_reader.pos); |
| ... | ... | @@ -2767,7 +2774,9 @@ pub const Allocating = struct { |
| 2767 | 2774 | if (additional == 0) return error.EndOfStream; |
| 2768 | 2775 | a.ensureUnusedCapacity(limit.minInt64(additional)) catch return error.WriteFailed; |
| 2769 | 2776 | const dest = limit.slice(a.writer.buffer[a.writer.end..]); |
| 2770 | | const n = try file_reader.read(dest); |
| 2777 | const n = try file_reader.interface.readSliceShort(dest); |
| 2778 | // If it was a short read, then EOF has been reached and `file_reader.size` |
| 2779 | // has been set and the EOF case will be hit on subsequent calls. |
| 2771 | 2780 | a.writer.end += n; |
| 2772 | 2781 | return n; |
| 2773 | 2782 | } |
| ... | ... | @@ -2818,18 +2827,18 @@ test "discarding sendFile" { |
| 2818 | 2827 | |
| 2819 | 2828 | const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true }); |
| 2820 | 2829 | defer file.close(); |
| 2821 | | var r_buffer: [256]u8 = undefined; |
| 2830 | var r_buffer: [2]u8 = undefined; |
| 2822 | 2831 | var file_writer: std.fs.File.Writer = .init(file, &r_buffer); |
| 2823 | | try file_writer.interface.writeByte('h'); |
| 2832 | try file_writer.interface.writeAll("abcd"); |
| 2824 | 2833 | try file_writer.interface.flush(); |
| 2825 | 2834 | |
| 2826 | 2835 | var file_reader = file_writer.moveToReader(); |
| 2827 | 2836 | try file_reader.seekTo(0); |
| 2837 | try file_reader.interface.fill(2); |
| 2828 | 2838 | |
| 2829 | 2839 | var w_buffer: [256]u8 = undefined; |
| 2830 | 2840 | var discarding: Writer.Discarding = .init(&w_buffer); |
| 2831 | | |
| 2832 | | _ = try file_reader.interface.streamRemaining(&discarding.writer); |
| 2841 | try testing.expectEqual(4, discarding.writer.sendFileAll(&file_reader, .unlimited)); |
| 2833 | 2842 | } |
| 2834 | 2843 | |
| 2835 | 2844 | test "allocating sendFile" { |
| ... | ... | @@ -2838,18 +2847,40 @@ test "allocating sendFile" { |
| 2838 | 2847 | |
| 2839 | 2848 | const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true }); |
| 2840 | 2849 | defer file.close(); |
| 2841 | | var r_buffer: [256]u8 = undefined; |
| 2850 | var r_buffer: [2]u8 = undefined; |
| 2842 | 2851 | var file_writer: std.fs.File.Writer = .init(file, &r_buffer); |
| 2843 | | try file_writer.interface.writeByte('h'); |
| 2852 | try file_writer.interface.writeAll("abcd"); |
| 2844 | 2853 | try file_writer.interface.flush(); |
| 2845 | 2854 | |
| 2846 | 2855 | var file_reader = file_writer.moveToReader(); |
| 2847 | 2856 | try file_reader.seekTo(0); |
| 2857 | try file_reader.interface.fill(2); |
| 2848 | 2858 | |
| 2849 | 2859 | var allocating: Writer.Allocating = .init(testing.allocator); |
| 2850 | 2860 | defer allocating.deinit(); |
| 2861 | try allocating.ensureUnusedCapacity(1); |
| 2862 | try testing.expectEqual(4, allocating.writer.sendFileAll(&file_reader, .unlimited)); |
| 2863 | try testing.expectEqualStrings("abcd", allocating.writer.buffered()); |
| 2864 | } |
| 2865 | |
| 2866 | test sendFileReading { |
| 2867 | var tmp_dir = testing.tmpDir(.{}); |
| 2868 | defer tmp_dir.cleanup(); |
| 2851 | 2869 | |
| 2852 | | _ = try file_reader.interface.streamRemaining(&allocating.writer); |
| 2870 | const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true }); |
| 2871 | defer file.close(); |
| 2872 | var r_buffer: [2]u8 = undefined; |
| 2873 | var file_writer: std.fs.File.Writer = .init(file, &r_buffer); |
| 2874 | try file_writer.interface.writeAll("abcd"); |
| 2875 | try file_writer.interface.flush(); |
| 2876 | |
| 2877 | var file_reader = file_writer.moveToReader(); |
| 2878 | try file_reader.seekTo(0); |
| 2879 | try file_reader.interface.fill(2); |
| 2880 | |
| 2881 | var w_buffer: [1]u8 = undefined; |
| 2882 | var discarding: Writer.Discarding = .init(&w_buffer); |
| 2883 | try testing.expectEqual(4, discarding.writer.sendFileReadingAll(&file_reader, .unlimited)); |
| 2853 | 2884 | } |
| 2854 | 2885 | |
| 2855 | 2886 | test writeStruct { |