diff --git a/hyperframe/frame.py b/hyperframe/frame.py index ced4d0c..7a1abd7 100644 --- a/hyperframe/frame.py +++ b/hyperframe/frame.py @@ -232,7 +232,7 @@ def parse_body(self, data): self.data = data[padding_data_length:len(data)-self.total_padding].tobytes() self.body_len = len(data) - if self.total_padding >= self.body_len: + if self.total_padding and self.total_padding >= self.body_len: raise InvalidPaddingError("Padding is too long.") @property @@ -396,7 +396,7 @@ def parse_body(self, data): self.data = data[padding_data_length + 4:].tobytes() self.body_len = len(data) - if self.total_padding >= self.body_len: + if self.total_padding and self.total_padding >= self.body_len: raise InvalidPaddingError("Padding is too long.") @@ -570,7 +570,7 @@ def parse_body(self, data): self.body_len = len(data) self.data = data[priority_data_length:len(data)-self.total_padding].tobytes() - if self.total_padding >= self.body_len: + if self.total_padding and self.total_padding >= self.body_len: raise InvalidPaddingError("Padding is too long.") diff --git a/test/test_frames.py b/test/test_frames.py index b1db5aa..1c0d3cf 100644 --- a/test/test_frames.py +++ b/test/test_frames.py @@ -154,6 +154,15 @@ def test_data_frame_with_invalid_padding_fails_to_parse(self): with pytest.raises(InvalidPaddingError): decode_frame(data) + def test_data_frame_with_no_length_parses(self): + # Fixes issue with empty data frames raising InvalidPaddingError. + f = DataFrame(1) + f.data = b'' + data = f.serialize() + + new_frame = decode_frame(data) + assert new_frame.data == b'' + class TestPriorityFrame(object): payload = b'\x00\x00\x05\x02\x00\x00\x00\x00\x01\x80\x00\x00\x04\x40' @@ -324,6 +333,15 @@ def test_push_promise_frame_with_invalid_padding_fails_to_parse(self): with pytest.raises(InvalidPaddingError): decode_frame(data) + def test_push_promise_frame_with_no_length_parses(self): + # Fixes issue with empty data frames raising InvalidPaddingError. + f = PushPromiseFrame(1) + f.data = b'' + data = f.serialize() + + new_frame = decode_frame(data) + assert new_frame.data == b'' + class TestPingFrame(object): def test_ping_frame_has_only_one_flag(self): @@ -506,6 +524,15 @@ def test_headers_frame_with_invalid_padding_fails_to_parse(self): with pytest.raises(InvalidPaddingError): decode_frame(data) + def test_headers_frame_with_no_length_parses(self): + # Fixes issue with empty data frames raising InvalidPaddingError. + f = HeadersFrame(1) + f.data = b'' + data = f.serialize() + + new_frame = decode_frame(data) + assert new_frame.data == b'' + class TestContinuationFrame(object): def test_continuation_frame_flags(self):