| ... | @@ -595,6 +595,17 @@ pub const Packet = union(enum) { | ... | @@ -595,6 +595,17 @@ pub const Packet = union(enum) { |
| 595 | | 595 | |
| 596 | /// Reads a packet in pkt-line format. | 596 | /// Reads a packet in pkt-line format. |
| 597 | fn read(reader: *std.Io.Reader) !Packet { | 597 | fn read(reader: *std.Io.Reader) !Packet { |
| | 598 | const packet: Packet = try .peek(reader); |
| | 599 | switch (packet) { |
| | 600 | .data => |data| reader.toss(data.len), |
| | 601 | else => {}, |
| | 602 | } |
| | 603 | return packet; |
| | 604 | } |
| | 605 | |
| | 606 | /// Consumes the header of a pkt-line packet and reads any associated data |
| | 607 | /// into the reader's buffer, but does not consume the data. |
| | 608 | fn peek(reader: *std.Io.Reader) !Packet { |
| 598 | const length = std.fmt.parseUnsigned(u16, try reader.take(4), 16) catch return error.InvalidPacket; | 609 | const length = std.fmt.parseUnsigned(u16, try reader.take(4), 16) catch return error.InvalidPacket; |
| 599 | switch (length) { | 610 | switch (length) { |
| 600 | 0 => return .flush, | 611 | 0 => return .flush, |
| ... | @@ -603,7 +614,7 @@ pub const Packet = union(enum) { | ... | @@ -603,7 +614,7 @@ pub const Packet = union(enum) { |
| 603 | 3 => return error.InvalidPacket, | 614 | 3 => return error.InvalidPacket, |
| 604 | else => if (length - 4 > max_data_length) return error.InvalidPacket, | 615 | else => if (length - 4 > max_data_length) return error.InvalidPacket, |
| 605 | } | 616 | } |
| 606 | return .{ .data = try reader.take(length - 4) }; | 617 | return .{ .data = try reader.peek(length - 4) }; |
| 607 | } | 618 | } |
| 608 | | 619 | |
| 609 | /// Writes a packet in pkt-line format. | 620 | /// Writes a packet in pkt-line format. |
| ... | @@ -1088,15 +1099,15 @@ pub const Session = struct { | ... | @@ -1088,15 +1099,15 @@ pub const Session = struct { |
| 1088 | const input = fs.input; | 1099 | const input = fs.input; |
| 1089 | if (fs.remaining_len == 0) { | 1100 | if (fs.remaining_len == 0) { |
| 1090 | while (true) { | 1101 | while (true) { |
| 1091 | switch (Packet.read(input) catch |err| { | 1102 | switch (Packet.peek(input) catch |err| { |
| 1092 | fs.err = err; | 1103 | fs.err = err; |
| 1093 | return error.ReadFailed; | 1104 | return error.ReadFailed; |
| 1094 | }) { | 1105 | }) { |
| 1095 | .flush => return error.EndOfStream, | 1106 | .flush => return error.EndOfStream, |
| 1096 | .data => |data| if (data.len > 1) switch (@as(StreamCode, @enumFromInt(data[0]))) { | 1107 | .data => |data| if (data.len > 1) switch (@as(StreamCode, @enumFromInt(data[0]))) { |
| 1097 | .pack_data => { | 1108 | .pack_data => { |
| 1098 | try input.discardAll(1); | 1109 | input.toss(1); |
| 1099 | fs.remaining_len = data.len; | 1110 | fs.remaining_len = data.len - 1; |
| 1100 | break; | 1111 | break; |
| 1101 | }, | 1112 | }, |
| 1102 | .fatal_error => { | 1113 | .fatal_error => { |