diff --git a/stream.go b/stream.go index c2103934c..a770f7e98 100644 --- a/stream.go +++ b/stream.go @@ -53,6 +53,20 @@ func (s *Stream) Read(p []byte) (int, error) { return bytesRead, nil } +// ReadByte implements io.ByteReader +func (s *Stream) ReadByte() (byte, error) { + // TODO: Optimize + p := make([]byte, 1) + n, err := s.Read(p) + if err != nil { + return 0, err + } + if n != 1 { + panic("Stream: should have returned error") + } + return p[0], nil +} + func (s *Stream) Write(p []byte) (int, error) { frame := &frames.StreamFrame{ StreamID: s.StreamID, diff --git a/stream_test.go b/stream_test.go index ccff520c6..833b21b07 100644 --- a/stream_test.go +++ b/stream_test.go @@ -23,6 +23,45 @@ var _ = Describe("Stream", func() { Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF})) }) + It("reads a single StreamFrame in multiple goes", func() { + frame := frames.StreamFrame{ + Offset: 0, + Data: []byte{0xDE, 0xAD, 0xBE, 0xEF}, + } + stream := NewStream(nil, 1337) + stream.AddStreamFrame(&frame) + b := make([]byte, 2) + n, err := stream.Read(b) + Expect(err).ToNot(HaveOccurred()) + Expect(n).To(Equal(2)) + Expect(b).To(Equal([]byte{0xDE, 0xAD})) + n, err = stream.Read(b) + Expect(err).ToNot(HaveOccurred()) + Expect(n).To(Equal(2)) + Expect(b).To(Equal([]byte{0xBE, 0xEF})) + }) + + It("reads single bytes", func() { + frame := frames.StreamFrame{ + Offset: 0, + Data: []byte{0xDE, 0xAD, 0xBE, 0xEF}, + } + stream := NewStream(nil, 1337) + stream.AddStreamFrame(&frame) + b, err := stream.ReadByte() + Expect(err).ToNot(HaveOccurred()) + Expect(b).To(Equal(byte(0xDE))) + b, err = stream.ReadByte() + Expect(err).ToNot(HaveOccurred()) + Expect(b).To(Equal(byte(0xAD))) + b, err = stream.ReadByte() + Expect(err).ToNot(HaveOccurred()) + Expect(b).To(Equal(byte(0xBE))) + b, err = stream.ReadByte() + Expect(err).ToNot(HaveOccurred()) + Expect(b).To(Equal(byte(0xEF))) + }) + It("reads all data available", func() { frame1 := frames.StreamFrame{ Offset: 0,