Skip to content

Commit 7958b5a

Browse files
Add back validation for the eventstream payload and header (#3208)
* Add back an eventstream payload and header limit but with 24MB * Increase the limit * Fix limit in error message --------- Co-authored-by: Richard Wang <[email protected]>
1 parent ebe0cf7 commit 7958b5a

File tree

4 files changed

+41
-7
lines changed

4 files changed

+41
-7
lines changed

gems/aws-eventstream/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
Unreleased Changes
22
------------------
33

4+
* Issue - Add back event stream max payload size and headers length checks with a 24MB limit.
5+
46
1.3.1 (2025-02-13)
57
------------------
68

gems/aws-eventstream/lib/aws-eventstream/encoder.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ class Encoder
4141
# and 4 bytes total message crc checksum
4242
OVERHEAD_LENGTH = 16
4343

44+
# Maximum header length allowed (after encode) 128kb
45+
MAX_HEADERS_LENGTH = 1024 * 128
46+
47+
# Maximum payload length allowed (after encode) 24mb
48+
MAX_PAYLOAD_LENGTH = 1024 * 1024 * 24
49+
4450
# Encodes Aws::EventStream::Message to output IO when
4551
# provided, else return the encoded binary string
4652
#
@@ -75,6 +81,9 @@ def encode_message(message)
7581
encoded_header = encode_headers(message)
7682
header_length = encoded_header.bytesize
7783
# encode payload
84+
if message.payload.length > MAX_PAYLOAD_LENGTH
85+
raise Aws::EventStream::Errors::EventPayloadLengthExceedError.new
86+
end
7887
encoded_payload = message.payload.read
7988
total_length = header_length + encoded_payload.bytesize + OVERHEAD_LENGTH
8089

@@ -115,7 +124,10 @@ def encode_headers(message)
115124
pattern ? [value.value].pack(pattern) : value.value,
116125
].pack('a*a*a*')
117126
end
118-
header_entries.join
127+
header_entries.join.tap do |encoded_header|
128+
break encoded_header if encoded_header.bytesize <= MAX_HEADERS_LENGTH
129+
raise Aws::EventStream::Errors::EventHeadersLengthExceedError.new
130+
end
119131
end
120132

121133
private

gems/aws-eventstream/lib/aws-eventstream/errors.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ def initialize(*args)
3232
end
3333
end
3434

35+
class EventPayloadLengthExceedError < RuntimeError
36+
def initialize(*args)
37+
super("Payload length of a message should be under 24mb.")
38+
end
39+
end
40+
41+
class EventHeadersLengthExceedError < RuntimeError
42+
def initialize(*args)
43+
super("Encoded headers length of a message should be under 128kb.")
44+
end
45+
end
46+
3547
end
3648
end
3749
end

gems/aws-eventstream/spec/encoder_spec.rb

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,33 @@ module EventStream
2525
expect(test_io.string.freeze).to eq(expectation)
2626
end
2727
end
28+
end
29+
30+
describe '#encode error' do
2831

29-
it 'encodes large payloads' do
32+
it 'raises an error when payload exceeds' do
33+
payload = double('payload', :length => 24 * 1024 * 1024 + 1)
3034
message = Aws::EventStream::Message.new(
3135
headers: {},
32-
payload: StringIO.new('.' * 24 * 1024 * 1024)
36+
payload: payload
3337
)
34-
Encoder.new.encode(message)
38+
expect {
39+
Encoder.new.encode(message)
40+
}.to raise_error(Aws::EventStream::Errors::EventPayloadLengthExceedError)
3541
end
3642

37-
it 'encodes long headers' do
43+
it 'raises an error when encoded headers exceeds' do
3844
headers = {}
3945
headers['foo'] = Aws::EventStream::HeaderValue.new(
40-
value: '*' * 131_073, type: 'string'
46+
value: '*' * 131073, type: 'string'
4147
)
4248
message = Aws::EventStream::Message.new(
4349
headers: headers,
4450
payload: StringIO.new
4551
)
46-
Encoder.new.encode(message)
52+
expect {
53+
Encoder.new.encode(message)
54+
}.to raise_error(Aws::EventStream::Errors::EventHeadersLengthExceedError)
4755

4856
end
4957

0 commit comments

Comments
 (0)