@@ -595,6 +595,17 @@ pub const Packet = union(enum) {
595
595
596
596
/// Reads a packet in pkt-line format.
597
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
609
const length = std .fmt .parseUnsigned (u16 , try reader .take (4 ), 16 ) catch return error .InvalidPacket ;
599
610
switch (length ) {
600
611
0 = > return .flush ,
@@ -603,7 +614,7 @@ pub const Packet = union(enum) {
603
614
3 = > return error .InvalidPacket ,
604
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
620
/// Writes a packet in pkt-line format.
@@ -1088,15 +1099,15 @@ pub const Session = struct {
1088
1099
const input = fs .input ;
1089
1100
if (fs .remaining_len == 0 ) {
1090
1101
while (true ) {
1091
- switch (Packet .read (input ) catch | err | {
1102
+ switch (Packet .peek (input ) catch | err | {
1092
1103
fs .err = err ;
1093
1104
return error .ReadFailed ;
1094
1105
}) {
1095
1106
.flush = > return error .EndOfStream ,
1096
1107
.data = > | data | if (data .len > 1 ) switch (@as (StreamCode , @enumFromInt (data [0 ]))) {
1097
1108
.pack_data = > {
1098
- try input .discardAll (1 );
1099
- fs .remaining_len = data .len ;
1109
+ input .toss (1 );
1110
+ fs .remaining_len = data .len - 1 ;
1100
1111
break ;
1101
1112
},
1102
1113
.fatal_error = > {
0 commit comments