diff --git a/frames/stream_frame.go b/frames/stream_frame.go index dc337691..cfdb73a0 100644 --- a/frames/stream_frame.go +++ b/frames/stream_frame.go @@ -87,6 +87,10 @@ func ParseStreamFrame(r *bytes.Reader) (*StreamFrame, error) { // WriteStreamFrame writes a stream frame. func (f *StreamFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error { + if len(f.Data) == 0 && !f.FinBit { + return errors.New("StreamFrame: attempting to write empty frame without FIN") + } + typeByte := uint8(0x80) // sets the leftmost bit to 1 if f.FinBit { diff --git a/frames/stream_frame_test.go b/frames/stream_frame_test.go index 35ac5cd0..a00bbeb3 100644 --- a/frames/stream_frame_test.go +++ b/frames/stream_frame_test.go @@ -78,12 +78,21 @@ var _ = Describe("StreamFrame", func() { Expect(b.Bytes()[0] & 0x40).To(Equal(byte(0x40))) }) + It("errors when length is zero and FIN is not set", func() { + b := &bytes.Buffer{} + err := (&StreamFrame{ + StreamID: 1, + }).Write(b, 0) + Expect(err).To(MatchError("StreamFrame: attempting to write empty frame without FIN")) + }) + It("has proper min length for a short StreamID and a short offset", func() { b := &bytes.Buffer{} f := &StreamFrame{ StreamID: 1, Data: []byte{}, Offset: 0, + FinBit: true, } err := f.Write(b, 0) Expect(err).ToNot(HaveOccurred()) @@ -96,6 +105,7 @@ var _ = Describe("StreamFrame", func() { StreamID: 0xDECAFBAD, Data: []byte{}, Offset: 0xDEADBEEFCAFE, + FinBit: true, } err := f.Write(b, 0) Expect(err).ToNot(HaveOccurred())