2121from typing import List , Tuple
2222
2323from h2 .connection import H2Connection
24- from h2 .events import DataReceived , RequestReceived , StreamEnded
24+ from h2 .events import (
25+ ConnectionTerminated , DataReceived , RequestReceived , StreamEnded
26+ )
2527from h2 .errors import ErrorCodes
28+ from h2 .exceptions import ProtocolError
2629
2730
2831RequestData = 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-
122130ssl_context = ssl .create_default_context (ssl .Purpose .CLIENT_AUTH )
123131ssl_context .options |= (
124132 ssl .OP_NO_TLSv1 | ssl .OP_NO_TLSv1_1 | ssl .OP_NO_COMPRESSION
0 commit comments