| ... | @@ -1350,9 +1350,17 @@ pub const Stream = struct { | ... | @@ -1350,9 +1350,17 @@ pub const Stream = struct { |
| 1350 | SocketNotBound, | 1350 | SocketNotBound, |
| 1351 | } || Io.UnexpectedError || Io.Cancelable; | 1351 | } || Io.UnexpectedError || Io.Cancelable; |
| 1352 | | 1352 | |
| 1353 | pub const WriteFileError = error{ | 1353 | pub const WriteFileError = Error || error{ |
| 1354 | NetworkDown, | 1354 | /// The `Io` implementation cannot offer a more efficient |
| 1355 | } || Io.Cancelable || Io.UnexpectedError; | 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 | pub fn init(stream: Stream, io: Io, buffer: []u8) Writer { | 1365 | pub fn init(stream: Stream, io: Io, buffer: []u8) Writer { |
| 1358 | return .{ | 1366 | return .{ |
| ... | @@ -1381,10 +1389,25 @@ pub const Stream = struct { | ... | @@ -1381,10 +1389,25 @@ pub const Stream = struct { |
| 1381 | } | 1389 | } |
| 1382 | | 1390 | |
| 1383 | fn sendFile(io_w: *Io.Writer, file_reader: *Io.File.Reader, limit: Io.Limit) Io.Writer.FileError!usize { | 1391 | fn sendFile(io_w: *Io.Writer, file_reader: *Io.File.Reader, limit: Io.Limit) Io.Writer.FileError!usize { |
| 1384 | _ = io_w; | 1392 | const w: *Writer = @alignCast(@fieldParentPtr("interface", io_w)); |
| 1385 | _ = file_reader; | 1393 | const io = w.io; |
| 1386 | _ = limit; | 1394 | const header = io_w.buffered(); |
| 1387 | return error.Unimplemented; // TODO | 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 | |