Skip to content

Commit

Permalink
Remove max limit on event stream messages (#3009)
Browse files Browse the repository at this point in the history
* Remove max limit on event stream messages

* Add changelog
  • Loading branch information
Madrigal authored Feb 13, 2025
1 parent ccde625 commit 11e6ab9
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 20 deletions.
8 changes: 8 additions & 0 deletions .changelog/cd702d00aeb046daad4091fd8a26a0b4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"id": "cd702d00-aeb0-46da-ad40-91fd8a26a0b4",
"type": "bugfix",
"description": "Remove max limit on event stream messages",
"modules": [
"aws/protocol/eventstream"
]
}
14 changes: 14 additions & 0 deletions aws/protocol/eventstream/decode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package eventstream
import (
"bytes"
"encoding/hex"
"errors"
"io/ioutil"
"os"
"reflect"
Expand Down Expand Up @@ -141,6 +142,19 @@ func TestDecoder_DecodeMultipleMessages(t *testing.T) {
}
}

func TestDecodeLimits(t *testing.T) {
l := 25 * 1024 * 1024 // Previously we failed if message was set to >16 MB
payload := bytes.Repeat([]byte{0x01}, l) // if set to just 0, message will be read as having 0 size.
buffer := bytes.NewBuffer(payload)
_, err := NewDecoder().Decode(buffer, nil)
if err == nil {
t.Fatalf("expect error since message is not properly encoded, got none")
}
if errors.As(err, &LengthError{}) {
t.Fatalf("expect error not being a length error, got %v", err)
}
}

func BenchmarkDecode(b *testing.B) {
r := bytes.NewReader(testEncodedMsg)
decoder := NewDecoder()
Expand Down
25 changes: 25 additions & 0 deletions aws/protocol/eventstream/encode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package eventstream
import (
"bytes"
"encoding/hex"
"io"
"reflect"
"testing"
)
Expand Down Expand Up @@ -48,3 +49,27 @@ func BenchmarkEncode(b *testing.B) {
}
}
}

func TestEncoder_Limits(t *testing.T) {
l := 25 * 1024 * 1024 // Previously we failed if message was set to >16 MB
payload := make([]byte, l)
encoder := NewEncoder()
err := encoder.Encode(io.Discard, Message{Payload: payload})
if err != nil {
t.Fatalf("Expected encoder being able to encode %d size, failed with %v", l, err)
}

h := Header{
Name: "event-id", Value: Int16Value(123),
}

headers := make(Headers, 0, 10_000) // Previously we failed if headers size was above a certain size
for i := 0; i < 10_000; i++ {
headers = append(headers, h)
}

err = encoder.Encode(io.Discard, Message{Headers: headers})
if err != nil {
t.Fatalf("Expected encoder being able to encode %d size, failed with %v", l, err)
}
}
22 changes: 2 additions & 20 deletions aws/protocol/eventstream/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ const preludeLen = 8
const preludeCRCLen = 4
const msgCRCLen = 4
const minMsgLen = preludeLen + preludeCRCLen + msgCRCLen
const maxPayloadLen = 1024 * 1024 * 16 // 16MB
const maxHeadersLen = 1024 * 128 // 128KB
const maxMsgLen = minMsgLen + maxHeadersLen + maxPayloadLen

var crc32IEEETable = crc32.MakeTable(crc32.IEEE)

Expand Down Expand Up @@ -82,28 +79,13 @@ func (p messagePrelude) PayloadLen() uint32 {
}

func (p messagePrelude) ValidateLens() error {
if p.Length == 0 || p.Length > maxMsgLen {
if p.Length == 0 {
return LengthError{
Part: "message prelude",
Want: maxMsgLen,
Want: minMsgLen,
Have: int(p.Length),
}
}
if p.HeadersLen > maxHeadersLen {
return LengthError{
Part: "message headers",
Want: maxHeadersLen,
Have: int(p.HeadersLen),
}
}
if payloadLen := p.PayloadLen(); payloadLen > maxPayloadLen {
return LengthError{
Part: "message payload",
Want: maxPayloadLen,
Have: int(payloadLen),
}
}

return nil
}

Expand Down

0 comments on commit 11e6ab9

Please sign in to comment.