1212from twisted .web .http import HTTPChannel
1313
1414from localstack .utils .patch import patch
15+ from localstack import config
1516
1617LOG = logging .getLogger (__name__ )
18+ LOG .setLevel (logging .DEBUG if config .DEBUG else logging .INFO )
1719
1820# Global registry of extensions with TCP matchers
1921# List of tuples: (extension_name, matcher_func, backend_host, backend_port)
@@ -31,14 +33,19 @@ def connectionMade(self):
3133 # Set up peer relationship
3234 server .set_tcp_peer (self )
3335
36+ # Unregister any existing producer on server transport (HTTPChannel may have one)
37+ try :
38+ server .transport .unregisterProducer ()
39+ except Exception :
40+ pass # No producer was registered, which is fine
41+
3442 # Enable flow control
3543 self .transport .registerProducer (server .transport , True )
3644 server .transport .registerProducer (self .transport , True )
3745
3846 # Send buffered data from detection phase
3947 if hasattr (self .factory , "initial_data" ):
4048 initial_data = self .factory .initial_data
41- LOG .debug (f"Sending { len (initial_data )} buffered bytes to backend" )
4249 self .transport .write (initial_data )
4350 del self .factory .initial_data
4451
@@ -61,12 +68,8 @@ def patch_gateway_for_tcp_routing():
6168 global _gateway_patched
6269
6370 if _gateway_patched :
64- LOG .debug ("Gateway already patched for TCP routing" )
6571 return
6672
67- LOG .debug ("Patching LocalStack gateway for TCP protocol detection" )
68- peek_bytes_length = 32
69-
7073 # Patch HTTPChannel to use our protocol-detecting version
7174 @patch (HTTPChannel .__init__ )
7275 def _patched_init (fn , self , * args , ** kwargs ):
@@ -76,7 +79,6 @@ def _patched_init(fn, self, *args, **kwargs):
7679 self ._detection_buffer = []
7780 self ._detecting = True
7881 self ._tcp_peer = None
79- self ._detection_buffer_size = peek_bytes_length
8082
8183 @patch (HTTPChannel .dataReceived )
8284 def _patched_dataReceived (fn , self , data ):
@@ -102,10 +104,6 @@ def _patched_dataReceived(fn, self, data):
102104 for ext_name , matcher , backend_host , backend_port in _tcp_extensions :
103105 try :
104106 if matcher (buffered_data ):
105- LOG .info (
106- f"Extension { ext_name } claimed connection, routing to "
107- f"{ backend_host } :{ backend_port } "
108- )
109107 # Switch to TCP proxy mode
110108 self ._detecting = False
111109 self .transport .pauseProducing ()
@@ -123,14 +121,11 @@ def _patched_dataReceived(fn, self, data):
123121 continue
124122
125123 # No extension claimed the connection
126- buffer_size = getattr (self , "_detection_buffer_size" , peek_bytes_length )
127- if len (buffered_data ) >= buffer_size :
128- LOG .debug ("No TCP extension matched, using HTTP handler" )
129- self ._detecting = False
130- # Feed buffered data to HTTP handler
131- for chunk in self ._detection_buffer :
132- fn (self , chunk )
133- self ._detection_buffer = []
124+ self ._detecting = False
125+ # Feed buffered data to HTTP handler
126+ for chunk in self ._detection_buffer :
127+ fn (self , chunk )
128+ self ._detection_buffer = []
134129
135130 @patch (HTTPChannel .connectionLost )
136131 def _patched_connectionLost (fn , self , reason ):
@@ -150,7 +145,6 @@ def set_tcp_peer(self, peer):
150145 HTTPChannel .set_tcp_peer = set_tcp_peer
151146
152147 _gateway_patched = True
153- LOG .info ("Gateway patched successfully for TCP protocol routing" )
154148
155149
156150def register_tcp_extension (
0 commit comments