Skip to content

Commit f724f61

Browse files
committed
Simplify http2 frame and header parsing
1 parent 82fc917 commit f724f61

2 files changed

Lines changed: 10 additions & 12 deletions

File tree

typedb/localstack_typedb/utils/h2_proxy.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import socket
33
from abc import abstractmethod
4+
from typing import Iterable
45

56
from h2.frame_buffer import FrameBuffer
67
from hpack import Decoder
@@ -125,15 +126,13 @@ def connectionLost(fn, self, *args, **kwargs):
125126
forwarder.close()
126127

127128

128-
def get_headers_from_data_stream(data_list: list[bytes]) -> Headers:
129+
def get_headers_from_data_stream(data_list: Iterable[bytes]) -> Headers:
129130
"""Get headers from a data stream (list of bytes data), if any headers are contained."""
130-
data_combined = b"".join(data_list)
131-
frames = parse_http2_stream(data_combined)
132-
headers = get_headers_from_frames(frames)
133-
return headers
131+
stream = b"".join(data_list)
132+
return get_headers_from_frames(get_frames_from_http2_stream(stream))
134133

135134

136-
def get_headers_from_frames(frames: list[Frame]) -> Headers:
135+
def get_headers_from_frames(frames: Iterable[Frame]) -> Headers:
137136
"""Parse the given list of HTTP2 frames and return a dict of headers, if any"""
138137
result = {}
139138
decoder = Decoder()
@@ -147,15 +146,14 @@ def get_headers_from_frames(frames: list[Frame]) -> Headers:
147146
return Headers(result)
148147

149148

150-
def parse_http2_stream(data: bytes) -> list[Frame]:
149+
def get_frames_from_http2_stream(data: bytes) -> Iterable[Frame]:
151150
"""Parse the data from an HTTP2 stream into a list of frames"""
152151
frames = []
153152
buffer = FrameBuffer(server=True)
154153
buffer.max_frame_size = 16384
155154
buffer.add_data(data)
156155
try:
157156
for frame in buffer:
158-
frames.append(frame)
157+
yield frame
159158
except Exception:
160159
pass
161-
return frames

typedb/tests/test_extension.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import requests
22
from localstack.utils.strings import short_uid
3-
from localstack_typedb.utils.h2_proxy import parse_http2_stream, get_headers_from_frames
3+
from localstack_typedb.utils.h2_proxy import get_frames_from_http2_stream, get_headers_from_frames
44
from typedb.driver import TypeDB, Credentials, DriverOptions, TransactionType
55

66

@@ -70,12 +70,12 @@ def test_connect_to_db_via_grpc_endpoint():
7070
print(json)
7171

7272

73-
def test_parse_http2_frames():
73+
def test_get_frames_from_http2_stream():
7474
# note: the data below is a dump taken from a browser request made against the emulator
7575
data = b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n\x00\x00\x18\x04\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x04\x00\x02\x00\x00\x00\x05\x00\x00@\x00\x00\x00\x04\x08\x00\x00\x00\x00\x00\x00\xbf\x00\x01"
7676
data += b"\x00\x01V\x01%\x00\x00\x00\x03\x00\x00\x00\x00\x15C\x87\xd5\xaf~MZw\x7f\x05\x8eb*\x0eA\xd0\x84\x8c\x9dX\x9c\xa3\xa13\xffA\x96\xa0\xe4\x1d\x13\x9d\t^\x83\x90t!#'U\xc9A\xed\x92\xe3M\xb8\xe7\x87z\xbe\xd0\x7ff\xa2\x81\xb0\xda\xe0S\xfa\xd02\x1a\xa4\x9d\x13\xfd\xa9\x92\xa4\x96\x854\x0c\x8aj\xdc\xa7\xe2\x81\x02\xe1o\xedK;\xdc\x0bM.\x0f\xedLE'S\xb0 \x04\x00\x08\x02\xa6\x13XYO\xe5\x80\xb4\xd2\xe0S\x83\xf9c\xe7Q\x8b-Kp\xdd\xf4Z\xbe\xfb@\x05\xdbP\x92\x9b\xd9\xab\xfaRB\xcb@\xd2_\xa5#\xb3\xe9OhL\x9f@\x94\x19\x08T!b\x1e\xa4\xd8z\x16\xb0\xbd\xad*\x12\xb5%L\xe7\x93\x83\xc5\x83\x7f@\x95\x19\x08T!b\x1e\xa4\xd8z\x16\xb0\xbd\xad*\x12\xb4\xe5\x1c\x85\xb1\x1f\x89\x1d\xa9\x9c\xf6\x1b\xd8\xd2c\xd5s\x95\x9d)\xad\x17\x18`u\xd6\xbd\x07 \xe8BFN\xab\x92\x83\xdb#\x1f@\x85=\x86\x98\xd5\x7f\x94\x9d)\xad\x17\x18`u\xd6\xbd\x07 \xe8BFN\xab\x92\x83\xdb'@\x8aAH\xb4\xa5I'ZB\xa1?\x84-5\xa7\xd7@\x8aAH\xb4\xa5I'Z\x93\xc8_\x83!\xecG@\x8aAH\xb4\xa5I'Y\x06I\x7f\x86@\xe9*\xc82K@\x86\xae\xc3\x1e\xc3'\xd7\x83\xb6\x06\xbf@\x82I\x7f\x86M\x835\x05\xb1\x1f\x00\x00\x04\x08\x00\x00\x00\x00\x03\x00\xbe\x00\x00"
7777

78-
frames = parse_http2_stream(data)
78+
frames = get_frames_from_http2_stream(data)
7979
assert frames
8080
headers = get_headers_from_frames(frames)
8181
assert headers

0 commit comments

Comments
 (0)