@@ -2491,18 +2491,17 @@ pub const Allocating = struct {
2491
2491
2492
2492
fn sendFile (w : * Writer , file_reader : * File.Reader , limit : std.io.Limit ) FileError ! usize {
2493
2493
if (File .Handle == void ) return error .Unimplemented ;
2494
+ if (limit == .nothing ) return 0 ;
2494
2495
const a : * Allocating = @fieldParentPtr ("writer" , w );
2495
2496
const gpa = a .allocator ;
2496
2497
var list = a .toArrayList ();
2497
2498
defer setArrayList (a , list );
2498
2499
const pos = file_reader .pos ;
2499
2500
const additional = if (file_reader .getSize ()) | size | size - pos else | _ | std .atomic .cache_line ;
2501
+ if (additional == 0 ) return error .EndOfStream ;
2500
2502
list .ensureUnusedCapacity (gpa , limit .minInt64 (additional )) catch return error .WriteFailed ;
2501
2503
const dest = limit .slice (list .unusedCapacitySlice ());
2502
- const n = file_reader .read (dest ) catch | err | switch (err ) {
2503
- error .ReadFailed = > return error .ReadFailed ,
2504
- error .EndOfStream = > 0 ,
2505
- };
2504
+ const n = try file_reader .read (dest );
2506
2505
list .items .len += n ;
2507
2506
return n ;
2508
2507
}
@@ -2525,7 +2524,7 @@ pub const Allocating = struct {
2525
2524
}
2526
2525
};
2527
2526
2528
- test sendFile {
2527
+ test "discarding sendFile" {
2529
2528
var tmp_dir = testing .tmpDir (.{});
2530
2529
defer tmp_dir .cleanup ();
2531
2530
@@ -2544,3 +2543,23 @@ test sendFile {
2544
2543
2545
2544
_ = try file_reader .interface .streamRemaining (& discarding .writer );
2546
2545
}
2546
+
2547
+ test "allocating sendFile" {
2548
+ var tmp_dir = testing .tmpDir (.{});
2549
+ defer tmp_dir .cleanup ();
2550
+
2551
+ const file = try tmp_dir .dir .createFile ("input.txt" , .{ .read = true });
2552
+ defer file .close ();
2553
+ var r_buffer : [256 ]u8 = undefined ;
2554
+ var file_writer : std.fs.File.Writer = .init (file , & r_buffer );
2555
+ try file_writer .interface .writeByte ('h' );
2556
+ try file_writer .interface .flush ();
2557
+
2558
+ var file_reader = file_writer .moveToReader ();
2559
+ try file_reader .seekTo (0 );
2560
+
2561
+ var allocating : std.io.Writer.Allocating = .init (std .testing .allocator );
2562
+ defer allocating .deinit ();
2563
+
2564
+ _ = try file_reader .interface .streamRemaining (& allocating .writer );
2565
+ }
0 commit comments