@@ -64,7 +64,11 @@ def dns_lookup(cls, host, port, afi=socket.AF_UNSPEC):
6464 log .warning ("DNS lookup failed for proxy %s:%d, %r" , host , port , ex )
6565 return []
6666
67- def use_remote_lookup (self ):
67+ @classmethod
68+ def use_remote_lookup (cls , proxy_url ):
69+ return urlparse (proxy_url ).scheme == 'socks5h'
70+
71+ def _use_remote_lookup (self ):
6872 return self ._proxy_url .scheme == 'socks5h'
6973
7074 def socket (self , family , sock_type ):
@@ -190,7 +194,7 @@ def connect_ex(self, addr):
190194 return errno .ECONNREFUSED
191195
192196 if self ._state == ProxyConnectionStates .REQUEST_SUBMIT :
193- if self .use_remote_lookup ():
197+ if self ._use_remote_lookup ():
194198 addr_type = 3
195199 addr_len = len (addr [0 ])
196200 elif self ._target_afi == socket .AF_INET :
@@ -205,27 +209,29 @@ def connect_ex(self, addr):
205209 self ._sock .close ()
206210 return errno .ECONNREFUSED
207211
208- if self .use_remote_lookup ():
209- self ._buffer_out = struct .pack (
210- "!bbbbb{}sh" .format (addr_len ),
211- 5 , # version
212- 1 , # command: connect
213- 0 , # reserved
214- addr_type , # 1 for ipv4, 4 for ipv6 address, 3 for domain name
212+ self ._buffer_out = struct .pack (
213+ "!bbbb" ,
214+ 5 , # version
215+ 1 , # command: connect
216+ 0 , # reserved
217+ addr_type , # 1 for ipv4, 4 for ipv6 address, 3 for domain name
218+ )
219+ # Addr format depends on type
220+ if addr_type == 3 :
221+ # len + domain name (no null terminator)
222+ self ._buffer_out += struct .pack (
223+ "!b{}s" .format (addr_len ),
215224 addr_len ,
216- addr [0 ].encode ('ascii' ), # host
217- addr [1 ], # port
225+ addr [0 ].encode ('ascii' ),
218226 )
219227 else :
220- self ._buffer_out = struct .pack (
221- "!bbbb{}sh" .format (addr_len ),
222- 5 , # version
223- 1 , # command: connect
224- 0 , # reserved
225- addr_type , # 1 for ipv4, 4 for ipv6 address, 3 for domain name
226- socket .inet_pton (self ._target_afi , addr [0 ]), # either 4 or 16 bytes of actual address
227- addr [1 ], # port
228+ # either 4 (type 1) or 16 (type 4) bytes of actual address
229+ self ._buffer_out += struct .pack (
230+ "!{}s" .format (addr_len ),
231+ socket .inet_pton (self ._target_afi , addr [0 ]),
228232 )
233+ self ._buffer_out += struct .pack ("!H" , addr [1 ]) # port
234+
229235 self ._state = ProxyConnectionStates .REQUESTING
230236
231237 if self ._state == ProxyConnectionStates .REQUESTING :
0 commit comments