aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--netlib/http/http2/protocol.py19
-rw-r--r--test/http/http2/test_protocol.py17
2 files changed, 22 insertions, 14 deletions
diff --git a/netlib/http/http2/protocol.py b/netlib/http/http2/protocol.py
index c2ad5edd..cc8daba8 100644
--- a/netlib/http/http2/protocol.py
+++ b/netlib/http/http2/protocol.py
@@ -297,19 +297,22 @@ class HTTP2Protocol(semantics.ProtocolMixin):
if body is None or len(body) == 0:
return b''
- # TODO: implement max frame size checks and sending in chunks
- # TODO: implement flow-control window
-
- frm = frame.DataFrame(
+ chunk_size = self.http2_settings[frame.SettingsFrame.SETTINGS.SETTINGS_MAX_FRAME_SIZE]
+ chunks = range(0, len(body), chunk_size)
+ frms = [frame.DataFrame(
state=self,
- flags=frame.Frame.FLAG_END_STREAM,
+ flags=frame.Frame.FLAG_NO_FLAGS,
stream_id=stream_id,
- payload=body)
+ payload=body[i:i+chunk_size]) for i in chunks]
+ frms[-1].flags = frame.Frame.FLAG_END_STREAM
+
+ # TODO: implement flow-control window
if self.dump_frames: # pragma no cover
- print(frm.human_readable(">>"))
+ for frm in frms:
+ print(frm.human_readable(">>"))
- return [frm.to_bytes()]
+ return [frm.to_bytes() for frm in frms]
def _receive_transmission(self, include_body=True):
body_expected = True
diff --git a/test/http/http2/test_protocol.py b/test/http/http2/test_protocol.py
index 0431de34..7f3fd2bd 100644
--- a/test/http/http2/test_protocol.py
+++ b/test/http/http2/test_protocol.py
@@ -252,20 +252,25 @@ class TestCreateHeaders():
class TestCreateBody():
c = tcp.TCPClient(("127.0.0.1", 0))
- protocol = HTTP2Protocol(c)
def test_create_body_empty(self):
- bytes = self.protocol._create_body(b'', 1)
+ protocol = HTTP2Protocol(self.c)
+ bytes = protocol._create_body(b'', 1)
assert b''.join(bytes) == ''.decode('hex')
def test_create_body_single_frame(self):
- bytes = self.protocol._create_body('foobar', 1)
+ protocol = HTTP2Protocol(self.c)
+ bytes = protocol._create_body('foobar', 1)
assert b''.join(bytes) == '000006000100000001666f6f626172'.decode('hex')
def test_create_body_multiple_frames(self):
- pass
- # bytes = self.protocol._create_body('foobar' * 3000, 1)
- # TODO: add test for too large frames
+ protocol = HTTP2Protocol(self.c)
+ protocol.http2_settings[SettingsFrame.SETTINGS.SETTINGS_MAX_FRAME_SIZE] = 5
+ bytes = protocol._create_body('foobarmehm42', 1)
+ assert len(bytes) == 3
+ assert bytes[0] == '000005000000000001666f6f6261'.decode('hex')
+ assert bytes[1] == '000005000000000001726d65686d'.decode('hex')
+ assert bytes[2] == '0000020001000000013432'.decode('hex')
class TestReadRequest(tservers.ServerTestBase):