From 5bddd84faea6e9b2fabff92ac50773e0a3dd5246 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 18 Feb 2017 12:38:55 +0700 Subject: [PATCH] allow inter-frame padding fixes #416 --- packet_unpacker.go | 6 +++--- packet_unpacker_test.go | 20 +++++++++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packet_unpacker.go b/packet_unpacker.go index cec85ed7..f6fcc2cb 100644 --- a/packet_unpacker.go +++ b/packet_unpacker.go @@ -33,9 +33,11 @@ func (u *packetUnpacker) Unpack(publicHeaderBinary []byte, hdr *PublicHeader, da fs := make([]frames.Frame, 0, 2) // Read all frames in the packet -ReadLoop: for r.Len() > 0 { typeByte, _ := r.ReadByte() + if typeByte == 0x0 { // PADDING frame + continue + } r.UnreadByte() var frame frames.Frame @@ -53,8 +55,6 @@ ReadLoop: err = errors.New("unimplemented: CONGESTION_FEEDBACK") } else { switch typeByte { - case 0x0: // PAD, end of frames - break ReadLoop case 0x01: frame, err = frames.ParseRstStreamFrame(r) if err != nil { diff --git a/packet_unpacker_test.go b/packet_unpacker_test.go index f98a34ae..c0735bde 100644 --- a/packet_unpacker_test.go +++ b/packet_unpacker_test.go @@ -48,7 +48,7 @@ var _ = Describe("Packet unpacker", func() { Expect(packet.frames).To(Equal([]frames.Frame{f})) }) - It("unpacks stream frames", func() { + It("unpacks STREAM frames", func() { f := &frames.StreamFrame{ StreamID: 1, Data: []byte("foobar"), @@ -84,13 +84,27 @@ var _ = Describe("Packet unpacker", func() { Expect(err).To(MatchError("unimplemented: CONGESTION_FEEDBACK")) }) - It("handles pad frames", func() { - setData([]byte{0, 0, 0}) + It("handles PADDING frames", func() { + setData([]byte{0, 0, 0}) // 3 bytes PADDING packet, err := unpacker.Unpack(hdrBin, hdr, data) Expect(err).ToNot(HaveOccurred()) Expect(packet.frames).To(BeEmpty()) }) + It("handles PADDING between two other frames", func() { + f := &frames.PingFrame{} + err := f.Write(buf, protocol.VersionWhatever) + Expect(err).ToNot(HaveOccurred()) + _, err = buf.Write(bytes.Repeat([]byte{0}, 10)) // 10 bytes PADDING + Expect(err).ToNot(HaveOccurred()) + err = f.Write(buf, protocol.VersionWhatever) + Expect(err).ToNot(HaveOccurred()) + setData(buf.Bytes()) + packet, err := unpacker.Unpack(hdrBin, hdr, data) + Expect(err).ToNot(HaveOccurred()) + Expect(packet.frames).To(HaveLen(2)) + }) + It("unpacks RST_STREAM frames", func() { setData([]byte{0x01, 0xEF, 0xBE, 0xAD, 0xDE, 0x44, 0x33, 0x22, 0x11, 0xAD, 0xFB, 0xCA, 0xDE, 0x34, 0x12, 0x37, 0x13}) packet, err := unpacker.Unpack(hdrBin, hdr, data)