@@ -70,14 +70,18 @@ class ForwardingBuffer:
7070 to the backend, or leave it to the default handler.
7171 """
7272
73+ backend : TcpForwarder
74+ buffer : list
75+ proxying : bool | None
76+
7377 def __init__ (self , http_response_stream ):
7478 self .http_response_stream = http_response_stream
7579 LOG .debug (
7680 f"Starting TCP forwarder to port { target_port } for new HTTP2 connection"
7781 )
7882 self .backend = TcpForwarder (target_port , host = target_host )
7983 self .buffer = []
80- self .proxying = False
84+ self .proxying = None
8185 reactor .getThreadPool ().callInThread (
8286 self .backend .receive_loop , self .received_from_backend
8387 )
@@ -86,23 +90,36 @@ def received_from_backend(self, data):
8690 LOG .debug (f"Received { len (data )} bytes from backend" )
8791 self .http_response_stream .write (data )
8892
89- def received_from_http2_client (self , data , default_handler ):
93+ def received_from_http2_client (self , data , default_handler : Callable ):
94+ if self .proxying is False :
95+ # Note: Return here only if `proxying` is `False` (a value of `None` indicates
96+ # that the headers have not fully been received yet)
97+ return default_handler (data )
98+
9099 if self .proxying :
91100 assert not self .buffer
92101 # Keep sending data to the backend for the lifetime of this connection
93102 self .backend .send (data )
94- else :
95- self .buffer .append (data )
96- if headers := get_headers_from_data_stream (self .buffer ):
97- self .proxying = should_proxy_request (headers )
98- # Now we know what to do with the buffer
99- buffered_data = b"" .join (self .buffer )
100- self .buffer = []
101- if self .proxying :
102- LOG .debug (f"Forwarding { len (buffered_data )} bytes to backend" )
103- self .backend .send (buffered_data )
104- else :
105- return default_handler (buffered_data )
103+ return
104+
105+ self .buffer .append (data )
106+
107+ if not (headers := get_headers_from_data_stream (self .buffer )):
108+ # If no headers received yet, then return (method will be called again for next chunk of data)
109+ return
110+
111+ self .proxying = should_proxy_request (headers )
112+
113+ buffered_data = b"" .join (self .buffer )
114+ self .buffer = []
115+
116+ if not self .proxying :
117+ # if this is not a target request, then call the default handler
118+ default_handler (buffered_data )
119+ return
120+
121+ LOG .debug (f"Forwarding { len (buffered_data )} bytes to backend" )
122+ self .backend .send (buffered_data )
106123
107124 def close (self ):
108125 self .backend .close ()
0 commit comments