Skip to content

Commit cd7d9e8

Browse files
committed
Update asyncio-server example to let it could be test with h2spec
1 parent 8856c43 commit cd7d9e8

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

examples/asyncio/asyncio-server.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@
2121
from typing import List, Tuple
2222

2323
from h2.connection import H2Connection
24-
from h2.events import DataReceived, RequestReceived, StreamEnded
24+
from h2.events import (
25+
ConnectionTerminated, DataReceived, RequestReceived, StreamEnded
26+
)
2527
from h2.errors import ErrorCodes
28+
from h2.exceptions import ProtocolError
2629

2730

2831
RequestData = collections.namedtuple('RequestData', ['headers', 'data'])
@@ -40,18 +43,24 @@ def connection_made(self, transport: asyncio.Transport):
4043
self.transport.write(self.conn.data_to_send())
4144

4245
def data_received(self, data: bytes):
43-
events = self.conn.receive_data(data)
44-
self.transport.write(self.conn.data_to_send())
45-
46-
for event in events:
47-
if isinstance(event, RequestReceived):
48-
self.request_received(event.headers, event.stream_id)
49-
elif isinstance(event, DataReceived):
50-
self.receive_data(event.data, event.stream_id)
51-
elif isinstance(event, StreamEnded):
52-
self.stream_complete(event.stream_id)
53-
46+
try:
47+
events = self.conn.receive_data(data)
48+
except ProtocolError as e:
49+
self.transport.write(self.conn.data_to_send())
50+
self.transport.close()
51+
else:
5452
self.transport.write(self.conn.data_to_send())
53+
for event in events:
54+
if isinstance(event, RequestReceived):
55+
self.request_received(event.headers, event.stream_id)
56+
elif isinstance(event, DataReceived):
57+
self.receive_data(event.data, event.stream_id)
58+
elif isinstance(event, StreamEnded):
59+
self.stream_complete(event.stream_id)
60+
elif isinstance(event, ConnectionTerminated):
61+
self.transport.close()
62+
63+
self.transport.write(self.conn.data_to_send())
5564

5665
def request_received(self, headers: List[Tuple[str, str]], stream_id: int):
5766
headers = collections.OrderedDict(headers)
@@ -86,7 +95,7 @@ def stream_complete(self, stream_id: int):
8695
response_headers = (
8796
(':status', '200'),
8897
('content-type', 'application/json'),
89-
('content-length', len(data)),
98+
('content-length', str(len(data))),
9099
('server', 'asyncio-h2'),
91100
)
92101
self.conn.send_headers(stream_id, response_headers)
@@ -118,7 +127,6 @@ def receive_data(self, data: bytes, stream_id: int):
118127
stream_data.data.write(data)
119128

120129

121-
122130
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
123131
ssl_context.options |= (
124132
ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_COMPRESSION

0 commit comments

Comments
 (0)