Skip to content

Commit 5dbe4e1

Browse files
committed
decode: Add a check if more data is needed
Add an error type and a function to check if a decoder still needs data for a complete frame. Signed-off-by: Pieter De Gendt <[email protected]>
1 parent 95ca063 commit 5dbe4e1

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

cmd/decode/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@ func main() {
2323
if _, err := io.Copy(dec, os.Stdin); err != nil && err != cobs.EOD {
2424
panic(err)
2525
}
26+
27+
if dec.NeedsMoreData() {
28+
panic(cobs.ErrIncompleteFrame)
29+
}
2630
}

cobs.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ var EOD = errors.New("EOD")
1919
// ErrUnexpectedEOD means that a delimiter was encountered in a malformed frame.
2020
var ErrUnexpectedEOD = errors.New("unexpected EOD")
2121

22+
// ErrIncompleteData means a decoder was closed with an incomplete frame.
23+
var ErrIncompleteFrame = errors.New("frame incomplete")
24+
2225
// An Encoder implements the io.Writer and io.ByteWriter interfaces. Data
2326
// written will we be encoded into groups and forwarded.
2427
type Encoder struct {
@@ -170,12 +173,23 @@ func (d *Decoder) Write(p []byte) (int, error) {
170173
return len(p), nil
171174
}
172175

176+
// NeedsMoreData returns true if the decoder needs more data for a full frame.
177+
func (d *Decoder) NeedsMoreData() bool {
178+
return d.codeIndex != 0
179+
}
180+
173181
// Decode decodes and returns a byte slice.
174182
func Decode(data []byte) ([]byte, error) {
175183
buf := bytes.NewBuffer(make([]byte, 0, len(data)))
176184
d := NewDecoder(buf)
177185

178-
_, err := d.Write(data)
186+
if _, err := d.Write(data); err != nil {
187+
return buf.Bytes(), err
188+
}
189+
190+
if d.NeedsMoreData() {
191+
return buf.Bytes(), ErrIncompleteFrame
192+
}
179193

180-
return buf.Bytes(), err
194+
return buf.Bytes(), nil
181195
}

0 commit comments

Comments
 (0)