| ... | ... | @@ -1350,9 +1350,17 @@ pub const Stream = struct { |
| 1350 | 1350 | SocketNotBound, |
| 1351 | 1351 | } || Io.UnexpectedError || Io.Cancelable; |
| 1352 | 1352 | |
| 1353 | | pub const WriteFileError = error{ |
| 1354 | | NetworkDown, |
| 1355 | | } || Io.Cancelable || Io.UnexpectedError; |
| 1353 | pub const WriteFileError = Error || error{ |
| 1354 | /// The `Io` implementation cannot offer a more efficient |
| 1355 | /// file-to-socket path; the caller should fall back to read-based |
| 1356 | /// copying. See `Io.Writer.sendFile`. |
| 1357 | Unimplemented, |
| 1358 | /// Reached the end of the file being read. |
| 1359 | EndOfStream, |
| 1360 | /// The source `File.Reader` failed; detailed diagnostics are found |
| 1361 | /// on that struct. |
| 1362 | ReadFailed, |
| 1363 | }; |
| 1356 | 1364 | |
| 1357 | 1365 | pub fn init(stream: Stream, io: Io, buffer: []u8) Writer { |
| 1358 | 1366 | return .{ |
| ... | ... | @@ -1381,10 +1389,25 @@ pub const Stream = struct { |
| 1381 | 1389 | } |
| 1382 | 1390 | |
| 1383 | 1391 | fn sendFile(io_w: *Io.Writer, file_reader: *Io.File.Reader, limit: Io.Limit) Io.Writer.FileError!usize { |
| 1384 | | _ = io_w; |
| 1385 | | _ = file_reader; |
| 1386 | | _ = limit; |
| 1387 | | return error.Unimplemented; // TODO |
| 1392 | const w: *Writer = @alignCast(@fieldParentPtr("interface", io_w)); |
| 1393 | const io = w.io; |
| 1394 | const header = io_w.buffered(); |
| 1395 | const handle = w.stream.socket.handle; |
| 1396 | const n = io.vtable.netWriteFile(io.userdata, handle, header, file_reader, limit) catch |err| switch (err) { |
| 1397 | error.Canceled => { |
| 1398 | w.err = error.Canceled; |
| 1399 | return error.WriteFailed; |
| 1400 | }, |
| 1401 | error.EndOfStream, |
| 1402 | error.Unimplemented, |
| 1403 | error.ReadFailed, |
| 1404 | => |e| return e, |
| 1405 | else => |e| { |
| 1406 | w.write_file_err = e; |
| 1407 | return error.WriteFailed; |
| 1408 | }, |
| 1409 | }; |
| 1410 | return io_w.consume(n); |
| 1388 | 1411 | } |
| 1389 | 1412 | }; |
| 1390 | 1413 | |