From 41674420328bd692852f55abcd73a372913d5dc5 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Fri, 6 May 2016 21:06:29 +0200 Subject: [PATCH] add support for receiving truncated acks fixes #57 --- frames/ack_frame.go | 5 ++--- frames/ack_frame_test.go | 7 +++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/frames/ack_frame.go b/frames/ack_frame.go index bc1f269f..5dee5487 100644 --- a/frames/ack_frame.go +++ b/frames/ack_frame.go @@ -17,6 +17,7 @@ type AckFrame struct { Entropy byte DelayTime time.Duration NackRanges []NackRange // has to be ordered. The NACK range with the highest FirstPacketNumber goes first, the NACK range with the lowest FirstPacketNumber goes last + Truncated bool } // Write writes an ACK frame. @@ -126,9 +127,7 @@ func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) { if typeByte&0x20 == 0x20 { hasNACK = true } - if typeByte&0x10 == 0x10 { - panic("truncated ACKs not yet implemented.") - } + frame.Truncated = typeByte&0x10 > 0 largestObservedLen := 2 * ((typeByte & 0x0C) >> 2) if largestObservedLen == 0 { diff --git a/frames/ack_frame_test.go b/frames/ack_frame_test.go index 76ea5f6b..b903e9ce 100644 --- a/frames/ack_frame_test.go +++ b/frames/ack_frame_test.go @@ -81,6 +81,13 @@ var _ = Describe("AckFrame", func() { Expect(err).To(Equal(errInvalidNackRanges)) }) + It("accepts truncated acks", func() { + b := bytes.NewReader([]byte{0x50, 0xA4, 0x03, 0x23, 0x45, 0x01, 0x02, 0xFF, 0xEE, 0xDD, 0xCC}) + frame, err := ParseAckFrame(b) + Expect(err).ToNot(HaveOccurred()) + Expect(frame.Truncated).To(BeTrue()) + }) + Context("contiguous NACK ranges", func() { It("parses a frame with a contiguous NACK range spanning two fields", func() { b := bytes.NewReader([]byte{0x64, 0x8, 0x2E, 0x01, 0x72, 0x1, 0x1, 0x0, 0xc0, 0x15, 0x0, 0x0, 0x2, 0x1, 0x2b, 0x0, 0xff})